python爬取qq音乐评论_爬虫:QQ音乐评论
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¬ice=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音乐评论相关推荐
- python爬取pubmed的文献_爬虫获取pubmed中文献的标题和摘要
为了满足快速浏览pubmed中相关文献标题和摘要的需求,写了个简单的爬虫(目前只实现了单个关键词以及多个关键词的and检索),用于批量获取感兴趣文献的标题和摘要. 使用编辑器是python,所编写的爬 ...
- python爬取数据情感分析_爬虫再探实战(五)———爬取APP数据——超级课程表【四】——情感分析...
仔细看的话,会发现之前的词频分析并没有什么卵用...文本分析真正的大哥是NLP,不过,这个坑太大,小白不大敢跳...不过还是忍不住在坑边上往下瞅瞅2333. 言归正传,今天刚了解到boson公司有py ...
- python爬取微博恶评_详解用python写网络爬虫-爬取新浪微博评论
新浪微博需要登录才能爬取,这里使用m.weibo.cn这个移动端网站即可实现简化操作,用这个访问可以直接得到的微博id. 分析新浪微博的评论获取方式得知,其采用动态加载.所以使用json模块解析jso ...
- python爬取国家男女比例_用python爬取3万多条评论,看韩国人如何评价韩国电影《寄生虫》?...
用python爬取3万多条评论,看韩国人如何评价韩国电影<寄生虫>? 朱小五 凹凸数据 大家好,我是朱小五 今天给大家带来一个关于电影的数据分析文章. 别走啊,这次不是豆瓣,也不是猫眼 真 ...
- python 知乎美女_知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测)
原标题:知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测) 1 数据源 知乎话题『美女』下所有问题中回答所出现的图片 2 抓取工具 Python 3,并使用第三方库 Requests.l ...
- python爬取数据的原理_成为Python高手必须懂的爬虫原理
互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前. 一.爬虫是什么? 如果我们 ...
- Python 爬取51cto博客标题浏览量、评论量、收藏
介绍 提到爬虫,互联网的朋友应该都不陌生,现在使用Python爬取网站数据是非常常见的手段,好多朋友都是爬取豆瓣信息为案例,我不想重复,就使用了爬取51cto博客网站信息为案例,这里以我的博客页面为教 ...
- python爬取网站教学视频_零基础Python爬取网页文章和图片详细教学(内附源码、教学视频)...
Python爬虫,这个我相信对于很多人来说都不陌生! 今天小编给大家提供一份零基础Python爬取网页图片以及小说的代码并且详细的和大家讲解一下! 开发环境:版本Python3.6.2!(2版本会在2 ...
- Python爬取网易云热歌榜所有音乐及其热评
获取特定歌曲热评: 首先,我们打开网易云网页版,击排行榜,然后点击左侧云音乐热歌榜,如图: 关于如何抓取指定的歌曲的热评,参考这篇文章,很详细,对小白很友好: 手把手教你用Python爬取网易云40万 ...
- python爬取新浪微博内容_python新浪微博爬虫,爬取微博和用户信息 (含源码及示例)...
[实例简介] 这是新浪微博爬虫,采用python+selenium实现. 免费资源,希望对你有所帮助,虽然是傻瓜式爬虫,但是至少能运行.同时rar中包括源码及爬取的示例. 参考我的文章: http:/ ...
最新文章
- Git客户端TortoiseGit(Windows系统)的使用方法
- 最长有效括号—leetcode32
- 【背包】SMRTFUN
- setlenient_Java日历setLenient()方法与示例
- php mysql循环语句怎么写_mysql数据库循环语句该怎么写???
- python mssqlserver_python for MSSQLserver
- 《人机交互与戏剧表演:用戏剧理论构建良好用户体验》一导读
- 家里的电脑频繁断网怎么回事
- cocos2d-x自制工具02:AnimatePacker v1.1beta发布!!~!
- poj 3694 Network (无向图的 割边 lca )
- 解锁lintcode数字图像识别
- java反射 泛型类型_【译】9. Java反射——泛型
- 网络拓扑结构_全球网络拓扑测绘这样来实现
- hp DV4 声卡驱动 IDT声卡补丁1.1
- Sphinx入门——快速生成Python文档
- 离散数学_集合论部分_总结
- matlab初值的非线性最小二乘,Matlab与Mathematica在非线性拟合中的应用比较
- Java中多态的表现形式
- 南京工程学院计算机英语,南京工程学院是什么意思
- Linux操作系统——切换到root用户及其他用户
热门文章
- 记一次有意思的种树比赛
- php 默认是几进制数,以0x开头的是多少进制?
- php商品报损流程,库存报损
- 二叉树层序遍历_求二叉树的层序遍历
- Servlet相关(request域转发、重定向、刷新头)(session域)
- linux grep 非_帮助非技术人员转向Linux的8条技巧
- 编程 态度目标_对目标持开放态度,从而推动事业发展
- 开源openstack_使用4个OpenStack指南和教程构建开源云
- (32) css—opcity属性
- 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机