用Python爬取QQ音乐评论并制成词云图的实例


Posted in Python onAugust 24, 2019

环境:Ubuntu16.4 python版本:3.6.4 库:wordcloud

这次我们要讲的是爬取QQ音乐的评论并制成云词图,我们这里拿周杰伦的等你下课来举例。

第一步:获取评论

我们先打开QQ音乐,搜索周杰伦的《等你下课》,直接拉到底部,发现有5000多页的评论。

用Python爬取QQ音乐评论并制成词云图的实例

这时候我们要研究的就是怎样获取每页的评论,这时候我们可以先按下F12,选择NetWork,我们可以先点击小红点清空数据,然后再点击一次,开始监控,然后点击下一页,看每次获取评论的时候访问获取的是哪几条数据。最后我们就能看到下图的样子,我们发现,第一条数据就是我们所要找的内容,点击第一条数据,打开它的response拉到最下面,发现他的最后一条评论rootcommentcontent跟我们网页中最后一条评论是一致的,那这时候已经成功了一般了,我们接下来只需要研究这条数据获取的规律就可以获取到所有的评论了。

用Python爬取QQ音乐评论并制成词云图的实例

我们先查看这条数据的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

用Python爬取QQ音乐评论并制成词云图的实例

我们不妨将网址直接放在地址栏打开看看是怎样。我们可以发现是直接返回一个不正规的json格式,为什么说是不正规呢?因为他在开头多了个

jsoncallback7494258674829413

这个就是我们上面那个不知道怎么来的参数,我们尝试在把这个数据改一下后再打开网址,结果发现,获取的json内容是没有变化,唯一变的是开头jsoncallback1111111111

变成了我们输入的那个数值,所以我们可以猜测这是一个随机数,无论你输入什么,都不会影响我们要获取的内容。那这样就好办多了。

用Python爬取QQ音乐评论并制成词云图的实例

用Python爬取QQ音乐评论并制成词云图的实例

我们就直接放代码获取:

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()

写入文档的内容大概就是这样:

用Python爬取QQ音乐评论并制成词云图的实例

获取完之后我们就能用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()

最后展示的结果是这样的:

用Python爬取QQ音乐评论并制成词云图的实例

以上这篇用Python爬取QQ音乐评论并制成词云图的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python清空文件并替换内容的实例
Oct 22 Python
python分数表示方式和写法
Jun 26 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
python 使用装饰器并记录log的示例代码
Jul 12 Python
关于sys.stdout和print的区别详解
Dec 05 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
PyTorch中permute的用法详解
Dec 30 Python
详解Python 中的容器 collections
Aug 17 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
Jun 05 Python
教你怎么用Python实现GIF动图的提取及合成
Jun 15 Python
Python实现打乒乓小游戏
Sep 25 Python
python解释器spython使用及原理解析
Aug 24 #Python
python爬虫之爬取百度音乐的实现方法
Aug 24 #Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 #Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 #Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 #Python
简单分析python的类变量、实例变量
Aug 23 #Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 #Python
You might like
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
python lxml中etree的简单应用
2019/05/10 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
违反课堂纪律检讨书
2014/01/19 职场文书
综合实践活动方案
2014/02/14 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
初三学习决心书
2014/03/11 职场文书
小学生家长寄语
2014/04/02 职场文书
员工担保书范本
2015/09/22 职场文书
网络研修随笔感言
2015/11/18 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
Python内置数据类型中的集合详解
2022/03/18 Python
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server