QQ音乐评论

有些小伙伴反馈,对于爬虫的完整流程,还是不清楚,这边就按顺序,给大家梳理一下

反爬

首先查看一下,我们要爬取的网页,是否反爬(各种侵害人家服务器的事情,我们不能干)

QQ音乐网址:https://y.qq.com

要查看该网页的反爬要求,可以直接在网页后加/robots.txt

QQ音乐反爬要求就是:https://y.qq.com/robots.txt

看了一下官网不给爬的内容,没有说不可以爬评论,那我们就爬了~

今天我们爬虫,以QQ音乐,杨千嬅的《野孩子》为例,爬取评论

查看网页源代码

给大家回顾以下,静态网页是怎么爬取的?

1、用requests.get获取数据

2、确定网页返回码是200

3、查看一下数据,你要的数据,是不是都出来了

4、解析一下数据,用beautifulsoup库、正则化表达、字符串切割等方法处理数据

5、把数据保存下来

根据我们之前的操作,我们会先右击看一下网页源代码。

如果我们要的内容,就在源代码里面,那万事大吉,直接按照我们之前爬豆瓣的那一套来

但是我们爬QQ音乐的时候,很悲伤的发现,网页源代码里面,没有数据了!!!

(只有一大堆看不懂的英文,连个中文字都没了!)

怎么办呢?我们去找,这个评论数据在哪里

获取网址

现在我们去找数据,和数据对应的网址

XHR

XHR 全称 XMLHttpRequest,它是浏览器内置的对象,使得 JavaScript 可以发送 HTTP 请求。

我们先右击打开“审查元素”,勾选Network—>勾选XHR—>查找我们要的内容

理论上,我们可以双击Name列表中的链接,一个一个找

有个小技巧,包含评论数据的东西,应该是比较大的,不至于只有几个B

所以我们翻了一下,发现有个链接有8.8KB,感觉相对大一点,我们打开链接看一下

看到了comment。没错,是了,数据就在里面

可以看到,这里面就包含了昵称、评论等内容

敏感一点的同学可以意识到,这其实就是一个字典啊!

我们点会到Headers,看一下这个网址,网址的获取方式是GET

我们先用这个网址,发现这时候,就已经包含评论数据了

import requests

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

res = requests.get('https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=GB2312&notice=0&platform=yqq.json&needNewCode=0&cid=205360772&reqtype=2&biztype=1&topid=1406731&cmd=8&needmusiccrit=0&pagenum=0&pagesize=25&lasthotcommentid=&domain=qq.com&ct=24&cv=10101010', headers=headers)

print(res.text)

参数

然后我们来重写这个网址,其实网址后面那一串参数,在Query String Parameters

把网址写法改一下,参数加上去

import requests

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

params = {

'g_tk_new_20200303': '5381',

'g_tk': '5381',

'loginUin': '0',

'hostUin': '0',

'format': 'json',

'inCharset': 'utf8',

'outCharset': 'GB2312',

'notice': '0',

'platform': 'yqq.json',

'needNewCode': '0',

'cid': '205360772',

'reqtype': '2',

'biztype': '1',

'topid': '1406731',

'cmd': '8',

'needmusiccrit': '0',

'pagenum':'0',

'pagesize': '25',

'lasthotcommentid': '',

'domain': 'qq.com',

'ct': '24',

'cv': '10101010'

}

res = requests.get('https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', headers=headers, params=params)

print(res.text)

处理数据

JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。 它的本质,是一个字符串,然后里面可能是字典,也可能是列表。

# 字典

dict = {'pagesize': 25}

# JSON

json = '{"pagesize": 25}'

# 列表

list = ['x', 'y', 'z']

# JSON

json = '["x", "y", "z"]'

我们需要用.json()来转换

为什么需要转换,而不是直接就是个字典?

因为 JSON是一种通用格式,不仅适用于Python,其他语言可以用。只是在Python里,它对应的是字典和列表

data = res.json() # data是字典格式

处理字典数据,是我们熟悉的部分

for item in data['comment']['commentlist']:

print('{}:{}'.format(item['nick'], item['rootcommentcontent']))

至此,我们就把第一页的数据读出来了,完整代码如下

import requests

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

params = {

'g_tk_new_20200303': '5381',

'g_tk': '5381',

'loginUin': '0',

'hostUin': '0',

'format': 'json',

'inCharset': 'utf8',

'outCharset': 'GB2312',

'notice': '0',

'platform': 'yqq.json',

'needNewCode': '0',

'cid': '205360772',

'reqtype': '2',

'biztype': '1',

'topid': '1406731',

'cmd': '8',

'needmusiccrit': '0',

'pagenum':'0',

'pagesize': '25',

'lasthotcommentid': '',

'domain': 'qq.com',

'ct': '24',

'cv': '10101010'

}

res = requests.get('https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', headers=headers, params=params)

data = res.json()

# 这是[最新评论]列表

for item in data['comment']['commentlist']:

print('{}:{}'.format(item['nick'], item['rootcommentcontent']))

# 这是[精彩评论]列表

for item in data['hot_comment']['commentlist']:

print('{}:{}'.format(item['nick'], item['rootcommentcontent']))

翻页

经过观察,我们发现,每次翻页,Query String Parameters 里面,只有两个参数变了。

其中pagenum比较好理解,就是每一次翻页,数字加一

我们重点来找一下,lasthotcommentid 这个参数在哪里

发现这个单词,就是last hot comment id,最后一个评论的ID

因为QQ音乐有两种评论,最新评论和精彩评论,我们不确定到底是哪个ID,所以我们需要翻页确认一下

我们观察一下data['comment']和data['hot_comment'],最后发现,数据在data['comment']中

import requests

import time

headers = {

'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

}

# 第一次 lasthotcommentid 为空

lasthotcommentid = ''

# 前五页

for pagenum in range(5):

params = {

'g_tk_new_20200303': '5381',

'g_tk': '5381',

'loginUin': '0',

'hostUin': '0',

'format': 'json',

'inCharset': 'utf8',

'outCharset': 'GB2312',

'notice': '0',

'platform': 'yqq.json',

'needNewCode': '0',

'cid': '205360772',

'reqtype': '2',

'biztype': '1',

'topid': '1406731',

'cmd': '8',

'needmusiccrit': '0',

'pagenum': pagenum,

'pagesize': '25',

'lasthotcommentid': lasthotcommentid,

'domain': 'qq.com',

'ct': '24',

'cv': '10101010'

}

res = requests.get('https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', headers=headers, params=params)

data = res.json()

print('==================================\n爬虫QQ音乐:{}第{}页\n=================================='.format(data['topic_name'],pagenum+1))

for item in data['comment']['commentlist']:

print('{}:{}'.format(item['nick'], item['rootcommentcontent']))

# 当前页最后一个评论的 commentid 作为下一页的 lasthotcommentid

lasthotcommentid = data['comment']['commentlist'][-1]['commentid']

# 防止爬取太快被封

time.sleep(1)

保存数据

import requests

import time

import xlwt

headers = {

'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

}

lasthotcommentid = ''

params = {

'g_tk_new_20200303': '5381',

'g_tk': '5381',

'loginUin': '0',

'hostUin': '0',

'format': 'json',

'inCharset': 'utf8',

'outCharset': 'GB2312',

'notice': '0',

'platform': 'yqq.json',

'needNewCode': '0',

'cid': '205360772',

'reqtype': '2',

'biztype': '1',

'topid': '1406731',

'cmd': '8',

'needmusiccrit': '0',

'pagenum': 0,

'pagesize': '25',

'lasthotcommentid': lasthotcommentid,

'domain': 'qq.com',

'ct': '24',

'cv': '10101010'

}

def GetComment(headers, params):

res = requests.get('https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', headers=headers, params=params)

data = res.json()

return data

workbook = xlwt.Workbook()

row = 1

for pagenum in range(5):

params['pagenum'] = pagenum

params['lasthotcommentid'] = lasthotcommentid

data = GetComment(headers, params)

print('爬虫QQ音乐:{}第{}页'.format(data['topic_name'],pagenum+1))

if pagenum == 0:

sheet = workbook.add_sheet(data['topic_name'])

head = ['昵称', '评价']

for h in range(len(head)):

sheet.write(0, h, head[h])

for item in data['comment']['commentlist']:

sheet.write(row, 0, item['nick'])

sheet.write(row, 1, item['rootcommentcontent'])

row += 1

lasthotcommentid = data['comment']['commentlist'][-1]['commentid']

time.sleep(1)

workbook.save('QQ音乐评论.xls')

print('写入excel成功')

python爬取qq音乐评论_爬虫:QQ音乐评论相关推荐

  1. python爬取pubmed的文献_爬虫获取pubmed中文献的标题和摘要

    为了满足快速浏览pubmed中相关文献标题和摘要的需求,写了个简单的爬虫(目前只实现了单个关键词以及多个关键词的and检索),用于批量获取感兴趣文献的标题和摘要. 使用编辑器是python,所编写的爬 ...

  2. python爬取数据情感分析_爬虫再探实战(五)———爬取APP数据——超级课程表【四】——情感分析...

    仔细看的话,会发现之前的词频分析并没有什么卵用...文本分析真正的大哥是NLP,不过,这个坑太大,小白不大敢跳...不过还是忍不住在坑边上往下瞅瞅2333. 言归正传,今天刚了解到boson公司有py ...

  3. python爬取微博恶评_详解用python写网络爬虫-爬取新浪微博评论

    新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析jso ...

  4. python爬取国家男女比例_用python爬取3万多条评论,看韩国人如何评价韩国电影《寄生虫》?...

    用python爬取3万多条评论,看韩国人如何评价韩国电影<寄生虫>? 朱小五 凹凸数据 大家好,我是朱小五 今天给大家带来一个关于电影的数据分析文章. 别走啊,这次不是豆瓣,也不是猫眼 真 ...

  5. python 知乎美女_知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测)

    原标题:知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测) 1 数据源 知乎话题『美女』下所有问题中回答所出现的图片 2 抓取工具 Python 3,并使用第三方库 Requests.l ...

  6. python爬取数据的原理_成为Python高手必须懂的爬虫原理

    互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前. 一.爬虫是什么? 如果我们 ...

  7. Python 爬取51cto博客标题浏览量、评论量、收藏

    介绍 提到爬虫,互联网的朋友应该都不陌生,现在使用Python爬取网站数据是非常常见的手段,好多朋友都是爬取豆瓣信息为案例,我不想重复,就使用了爬取51cto博客网站信息为案例,这里以我的博客页面为教 ...

  8. python爬取网站教学视频_零基础Python爬取网页文章和图片详细教学(内附源码、教学视频)...

    Python爬虫,这个我相信对于很多人来说都不陌生! 今天小编给大家提供一份零基础Python爬取网页图片以及小说的代码并且详细的和大家讲解一下! 开发环境:版本Python3.6.2!(2版本会在2 ...

  9. Python爬取网易云热歌榜所有音乐及其热评

    获取特定歌曲热评: 首先,我们打开网易云网页版,击排行榜,然后点击左侧云音乐热歌榜,如图: 关于如何抓取指定的歌曲的热评,参考这篇文章,很详细,对小白很友好: 手把手教你用Python爬取网易云40万 ...

  10. python爬取新浪微博内容_python新浪微博爬虫,爬取微博和用户信息 (含源码及示例)...

    [实例简介] 这是新浪微博爬虫,采用python+selenium实现. 免费资源,希望对你有所帮助,虽然是傻瓜式爬虫,但是至少能运行.同时rar中包括源码及爬取的示例. 参考我的文章: http:/ ...

最新文章

  1. Git客户端TortoiseGit(Windows系统)的使用方法
  2. 最长有效括号—leetcode32
  3. 【背包】SMRTFUN
  4. setlenient_Java日历setLenient()方法与示例
  5. php mysql循环语句怎么写_mysql数据库循环语句该怎么写???
  6. python mssqlserver_python for MSSQLserver
  7. 《人机交互与戏剧表演:用戏剧理论构建良好用户体验》一导读
  8. 家里的电脑频繁断网怎么回事
  9. cocos2d-x自制工具02:AnimatePacker v1.1beta发布!!~!
  10. poj 3694 Network (无向图的 割边 lca )
  11. 解锁lintcode数字图像识别
  12. java反射 泛型类型_【译】9. Java反射——泛型
  13. 网络拓扑结构_全球网络拓扑测绘这样来实现
  14. hp DV4 声卡驱动 IDT声卡补丁1.1
  15. Sphinx入门——快速生成Python文档
  16. 离散数学_集合论部分_总结
  17. matlab初值的非线性最小二乘,Matlab与Mathematica在非线性拟合中的应用比较
  18. Java中多态的表现形式
  19. 南京工程学院计算机英语,南京工程学院是什么意思
  20. Linux操作系统——切换到root用户及其他用户

热门文章

  1. 记一次有意思的种树比赛
  2. php 默认是几进制数,以0x开头的是多少进制?
  3. php商品报损流程,库存报损
  4. 二叉树层序遍历_求二叉树的层序遍历
  5. Servlet相关(request域转发、重定向、刷新头)(session域)
  6. linux grep 非_帮助非技术人员转向Linux的8条技巧
  7. 编程 态度目标_对目标持开放态度,从而推动事业发展
  8. 开源openstack_使用4个OpenStack指南和教程构建开源云
  9. (32) css—opcity属性
  10. 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机