用Python爬取QQ音乐评论并制成词云图的实例
作者:azaho 发布时间:2022-04-04 04:08:59
环境:Ubuntu16.4 python版本:3.6.4 库:wordcloud
这次我们要讲的是爬取QQ音乐的评论并制成云词图,我们这里拿周杰伦的等你下课来举例。
第一步:获取评论
我们先打开QQ音乐,搜索周杰伦的《等你下课》,直接拉到底部,发现有5000多页的评论。
这时候我们要研究的就是怎样获取每页的评论,这时候我们可以先按下F12,选择NetWork,我们可以先点击小红点清空数据,然后再点击一次,开始监控,然后点击下一页,看每次获取评论的时候访问获取的是哪几条数据。最后我们就能看到下图的样子,我们发现,第一条数据就是我们所要找的内容,点击第一条数据,打开它的response拉到最下面,发现他的最后一条评论rootcommentcontent跟我们网页中最后一条评论是一致的,那这时候已经成功了一般了,我们接下来只需要研究这条数据获取的规律就可以获取到所有的评论了。
我们先查看这条数据的Headers分析下Request URL,通过点开不同的页码进行比较,发现每次发出的情况网址大部分内容是相同,不同的地方有两个,就是pagenum跟JsonCallBack,pagenum从英文上很明显能看出来就是页码,JsonCallBack又是啥呢?
https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk=2058499274&jsonpCallback=jsoncallback7494258674829413&loginUin=2230661779&hostUin=0&format=jsonp&inCharset=utf8&outCharset=GB2312¬ice=0&platform=yqq&needNewCode=0&cid=205360772&reqtype=2&biztype=1&topid=212877900&cmd=8&needmusiccrit=0&pagenum=4&pagesize=25&lasthotcommentid=song_212877900_23831021_1526748144&callback=jsoncallback7494258674829413&domain=qq.com&ct=24&cv=101010
我们不妨将网址直接放在地址栏打开看看是怎样。我们可以发现是直接返回一个不正规的json格式,为什么说是不正规呢?因为他在开头多了个
jsoncallback7494258674829413
这个就是我们上面那个不知道怎么来的参数,我们尝试在把这个数据改一下后再打开网址,结果发现,获取的json内容是没有变化,唯一变的是开头jsoncallback1111111111
变成了我们输入的那个数值,所以我们可以猜测这是一个随机数,无论你输入什么,都不会影响我们要获取的内容。那这样就好办多了。
我们就直接放代码获取:
import requests
import json
def get_comment():
for i in range(1,7000):
# 打印页码
print(i)
# headers头部
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0',
'Referer': "https://y.qq.com/n/yqq/song/0031TAKo0095np.html"}
# 请求的url
url = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk=2058499274&jsonpCallback=jsoncallback06927647062927766&loginUin=2230661779&hostUin=0&format=jsonp&inCharset=utf8&outCharset=GB2312¬ice=0&platform=yqq&needNewCode=0&cid=205360772&reqtype=2&biztype=1&topid=212877900&cmd=8&needmusiccrit=0&pagenum=%s&pagesize=25&lasthotcommentid=song_212877900_3035803620_1526783365&callback=jsoncallback06927647062927766&domain=qq.com&ct=24&cv=101010' %i
# 打印当前访问的url地址
print (url)
# 将请求得到的页面赋值为req
req = requests.get(url,headers=headers,verify=False)
# 对获取到的内容进行utf-8编码
html = str(req.content,'UTF-8')
# 对非正规的json进行处理,去掉头部跟尾部多余的部分
html= html.strip("jsoncallback06927647062927766(")
html = html.replace(")","")
# 去掉两边的空格
html = html.strip()
# 将处理后的json转为python的json
data = json.loads(html)
# 获取json中评论的部分
list = data['comment']['commentlist']
# 每次都重新定义一个列表来存储每一页的评论
content = []
# 遍历当前页的评论并通过调用write()函数来保存
for i in list:
# 偶尔也会有一页的评论获取不到,这时候如果报错了可以直接忽略那一页,继续运行
try:
content.append(i['rootcommentcontent'].replace("[em]","").replace("[/em]","").replace("e400",""))
except KeyError:
content = []
break
write(content)
# 将当前页面的评论传递过来
def write(content):
# 打开一个文件,将列表的内容一行一行的存储下来
with open('comments.txt', 'a', encoding = 'UTF-8') as f:
for i in range(len(content)):
# 因为转为json后\n不胡自动换行,所以我们这里将\n给手换行
string = content[i].split("\\n")
for i in string:
# 因为出现了很多评论被删除的情况,所有我们把这句给过滤掉
i = i.replace("该评论已经被删除", "")
# 打印每条评论
print (i)
# 将评论写入文本
f.writelines(i)
# 给评论换行
f.write("\n")
if __name__ == "__main__":
get_comment()
写入文档的内容大概就是这样:
获取完之后我们就能用wordcloud来进行词云图的制作了:
# -*- coding: utf-8 -*-
import jieba
from wordcloud import WordCloud, STOPWORDS
from os import path
from scipy.misc import imread
# 读取mask/color图片
d = path.dirname(__file__)
color_mask = imread("cyx.png")
#将爬到的评论放在string中
with open('nbzd.txt', 'r', encoding = 'UTF-8') as f:
string = f.read()
word = " ".join(jieba.cut(string))
wordcloud = WordCloud(background_color='white',
mask=color_mask,
max_words=100,
stopwords=STOPWORDS,
font_path='/home/azhao/桌面/素材/simsun.ttc',
max_font_size=100,
random_state=30,
margin=2).generate_from_text(word)
import matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
最后展示的结果是这样的:
来源:https://blog.csdn.net/zhaogeno1/article/details/80382999
猜你喜欢
- 使用ASP处理XSLT转换XML比较简单,思路如下:创建一个XSLTemplate的对象,再创建一个XMLDOM对象,然后在家Xml文件和X
- 最近无意看到网上有人使用Python编写几十行代码生成图像验证码,感觉很是繁琐,这里为各位朋友推荐两种方法,使用4行Python代码即可生成
- 刚开始学习python,python相对于java确实要简洁易用得多。内存回收类似hotspot的可达性分析, 不可变对象也如同java得I
- Pythonpython 真的太好用了,但是它真的好慢啊(哭死) ; C++ 很快,但是真的好难写啊,此生能不碰它就不碰它。老天啊,有没有什
- 这个收藏本站、设为首页代码相信每个网站都会用到,这么常用的代码,网络上流行的一般是很多年前的代码版本,只有兼容IE,对其它浏览器没有考虑,下
- 对于中小型个人、企业网站来说,MySQL数据库或许是目前数据库的最完美实施解决方案了。在不变更服务器硬件的前提下,一个经过良好架构,优化后的
- Python 安装Graphviz 详细教程Python安装Graphviz画图器首先,要明确他是一个独立的软件,如果大家用pip的方法装了
- 这是一篇关于使用JScript RuntimeObject(MSDN)调试的文章。虽然这些例子中的大多数在其他浏览器中不能运行,但在IE 5
- HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东。 以下是伪造方法:ASP/Visual Basic代码 di
- CSS Sprites 简介:通常被意译为“CSS图像拼合”或“CSS贴图定位”。CSS Sprites并不是一门新技术,目前它已经在网页开
- 本文实例讲述了Python3通过Luhn算法快速验证信用卡卡号的方法。分享给大家供大家参考。具体分析如下:Python3通过Luhn算法快速
- import介绍import语句作用就是用来导入模块的,它可以出现在程序中的任何位置。import语句语法使用import语句导入模块,im
- php输出文字乱码的解决办法:在php文件最开头写上:<?phpheader('Content-type: text/html
- 指定的代码页特性无效。 codepage属性:是指出网页的代码页 如果制作的网页脚本与WEB服务端的默认代码页不同,则必须指明代码页: 代码
- __new__ 方法是什么?如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数
- 学校让我们在放假期间自觉Python,对于Python我是小白的不能再小白了。一切从头开始,找学习资料,看视频教程光看书看视频也不行还要自己
- 一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函
- 自己前端开发中常用到的一些技巧及问题解决方法,会常更新,希望对前端路上的朋友有帮助。1、文章标题列表中日期居右显示的方法(提供了两种方法,使
- 一、Monkey测试简介Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackbal
- 通常我们会在一些javascript的书籍上看到,使用Javascript保留字作为标识符(变量名、函数名、循环标记等)时,会引起程序报错!