zoukankan      html  css  js  c++  java
  • 用python 抓取B站视频评论,制作词云

    python 作为爬虫利器,与其有很多强大的第三方库是分不开的,今天说的爬取B站的视频评论,其实重点在分析得到的评论化作嵌套的字典,在其中取出想要的内容。层层嵌套,眼花缭乱,分析时应细致!步骤分为以下几点:

    1. F12进入开发者选项
      进入B站你想观看的视频页面,例如我看的是咬人猫的一个视频,进入开发者选项后,向下拉取视频评论,这时评论内容才被加载出来,此刻在开发者选项中网络那里就可以看到从网站获取的很多信息,仔细查找,发现我们想要的如下图:

      可以看到评论区的内容,点开消息头中的请求网址(https://api.bilibili.com/x/v2/reply?callback=jQuery172048896660782015544_1512700122908&jsonp=jsonp&pn=1&type=1&oid=11022534&sort=0&_=1512700148066),复制粘贴到浏览器中查看,可看到一页的评论内容,取出不必要的网址内容,剩余为:https://api.bilibili.com/x/v2/reply?pn=1&type=1&oid=11022534  ,其中pn即为第几页的评论,oid为视频的av号
    2. 分析获取内容字典格式,嵌套内容的包含关系
    3. 代码获取内容,写入本地文件
       1 import requests
       2 import json
       3 def getHTML(html):
       4     count=1
       5     fi=open('bilibili.txt','w',encoding='utf-8')
       6     while(True):
       7         url=html+str(count)
       8         url=requests.get(url)
       9         if url.status_code==200:
      10             cont=json.loads(url.text)
      11         else:
      12             break
      13         lengthRpy = len(cont['data']['replies'])
      14         if count==1:
      15             try:
      16                 lengthHot=len(cont['data']['hots'])
      17                 for i in range(lengthHot):
      18                     # 热门评论内容
      19                     hotMsg=cont['data']['hots'][i]['content']['message']
      20                     fi.write(hotMsg + '
      ')
      21                     leng=len(cont['data']['hots'][i]['replies'])
      22                     for j in range(leng):
      23                         # 热门评论回复内容
      24                         hotMsgRp=cont['data']['hots'][i]['replies'][j]['content']['message']
      25                         fi.write(hotMsgRp+'
      ')
      26             except:
      27                 pass
      28         if lengthRpy!=0:
      29             for i in range(lengthRpy):
      30                 comMsg=cont['data']['replies'][i]['content']['message']
      31                 fi.write(comMsg + '
      ')
      32                 # print('评论:',cont['data']['replies'][i]['content']['message'])
      33                 leng=len(cont['data']['replies'][i]['replies'])
      34                 for j in range(leng):
      35                     comMsgRp=cont['data']['replies'][i]['replies'][j]['content']['message']
      36                     fi.write(comMsgRp + '
      ')
      37         else:
      38             break
      39         print("第%d页写入成功!"%count)
      40         count += 1
      41     fi.close()
      42     print(count-1,'页评论写入成功!')
      43 
      44 url="https://api.bilibili.com/x/v2/reply?type=1&oid="
      45 av=input("input your url:")
      46 html=url+av+'&pn='
      47 getHTML(html)
      获取评论内容
    4. 绘制词云
      绘制词云过程分为:读取绘制词云文本,用结巴(第三方库jieba)将文本中高频词汇分出,为词云设置背景图片(可省略),查看及保存绘制词云图
      代码如下:
       1 from wordcloud import WordCloud,ImageColorGenerator
       2 import matplotlib.pyplot as plt
       3 from PIL import Image
       4 import numpy as np
       5 from os import path
       6 import jieba
       7 
       8 lj=path.dirname(__file__)   #当前文件路径
       9 text=open(path.join(lj,'bilibili.txt'),encoding='utf-8').read() #读取的文本
      10 jieba.add_word('咬人猫')
      11 jieba.add_word('喵酱')    #添加结巴分辨不了的词汇
      12 jbText=' '.join(jieba.cut(text))
      13 imgMask=np.array(Image.open(path.join(lj,'msk.png')))   #读入背景图片
      14 wc=WordCloud(
      15     background_color='white',
      16     max_words=500,
      17     font_path='msyh.ttc',    #默认不支持中文
      18     mask=imgMask,  #设置背景图片
      19     random_state=30 #生成多少种配色方案
      20 ).generate(jbText)
      21 ImageColorGenerator(imgMask)   #根据图片生成词云颜色
      22 # plt.imshow(wc)
      23 # plt.axis('off')
      24 # plt.show()
      25 wc.to_file(path.join(lj,'biliDM.png'))
      26 print('成功保存词云图片!')
      词云绘制

    在代码极少的情况下,python就能做出如此惊人的工作,只能是  人生苦短,我用python 了。

    原创不易,尊重版权。转载请注明出处:http://www.cnblogs.com/xsmile/

  • 相关阅读:
    去哪网 2014.9.25 笔试题
    关于 Private strand flush not complete
    以太网数据帧相关
    Java根据年份算出所属的生肖。
    DWR常用<init-param>参数
    更新ORACLE数据时遇到锁死情况的处理
    Debug of bash , perl and python
    2013长沙网络赛H题Hypersphere (蛋疼的题目 神似邀请赛A题)
    I.MX6 wm8962 0-001a: DC servo timed out
    I.MX6 U-boot PWM hacking
  • 原文地址:https://www.cnblogs.com/xsmile/p/8004433.html
Copyright © 2011-2022 走看看