如何基于Python爬取隐秘的角落评论


Posted in Python onJuly 02, 2020

“一起去爬山吧?”

这句台词火爆了整个朋友圈,没错,就是来自最近热门的《隐秘的角落》,豆瓣评分8.9分,好评不断。

如何基于Python爬取隐秘的角落评论

感觉还是蛮不错的。同时,为了想更进一步了解一下小伙伴观剧的情况,永恒君抓取了爱奇艺平台评论数据并进行了分析。下面来做个分享,给大伙参考参考。

1、爬取评论数据

因为该剧是在爱奇艺平台独播的,自然数据源从这里取比较合适。永恒君爬取了《隐秘的角落》12集的从开播日6月16日-6月26日的评论数据。

使用 Chrome 查看源代码模式,在播放页面往下面滑动,有一个 get_comments 的请求,经过调试分析,这个接口就是获取评论数据的接口,后面连接上一系列的参数即可获取评论的数据。

如何基于Python爬取隐秘的角落评论

其中关键的就是last_id这个参数,是用来控制评论分页的,需要通过上一个页面最后一条评论的id来进行获取。

爬虫部分代码

def get_comment_html(movieId, movieName, lastId):#将获取评论的json源码,保存到txt文件中
  url = "http://sns-comment.iqiyi.com/v3/comment/get_comments.action?"
  params = {
    "types":"time",
    "business_type":"17",
    "agent_type":"118",
    "agent_version":"9.11.5",
    "authcookie":"authcookie"
  }
  for item in params:
    url = url + item + "=" + params[item] + "&"
  url = url + "content_id=" + movieId+ "&last_id=" + lastId
  #url 为拼接好的评论地址  

  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
    "Accept": "application/json, text/javascript",
    "Referer": "https://www.iqiyi.com/v_19rxtiliso.html?vfm=2008_aldbd&fv=p_02_01",

  }
  response = requests.get(url, headers=headers)  
  filename = movieId + movieName+".txt"
  if response.status_code == 200:    
    with open(filename,"a",encoding='utf-8') as f:
      f.write(response.text+"\n")
    #将获取的评论json源码保存到txt文件,一次写入一行,表示获取的这一页的评论      
  else:
    print("request error")
  print("爬取第{}页评论".format(file_lines(filename)))
  time.sleep(0.5)  
  last_id = parseData(response.text) #解析并获取下一个id  
  if last_id != "End":
    get_comment_html(movieId, movieName, parseData(response.text))
  else:
    print("已到结尾")
    #continue#结束整个程序
  return None

最终将12集爬取下来的包含评论数据的json源码保存到txt文件当中,解析提取评论的时间、用户名、性别、评论内容等信息,经过去重、去空白等数据清理工作,最终获得28010条评论信息。

如何基于Python爬取隐秘的角落评论

2、分析展示数据

在海量的数据中,我们可以分析出我们想看到的结果。为了更好的数据处理和可视化展示,这里永恒君用了Pandas和Pyecharts 这两个库。

1)评论用户性别方面

女生占了大部分,占比60.89%,比男性用户要多不少。

如何基于Python爬取隐秘的角落评论

2)每一集的评论数量

接下来,我们再来看一下,每一期的评论数量,看是否能够得出一些不一样的数据。

from pyecharts.charts import Bar ##导入需要使用的图表
from pyecharts import options as opts ##导入配置项

comment_num3 = df["集数"].value_counts().sort_index()

x_line3 = comment_num3.index.to_list()
y_line3 = comment_num3.values.tolist()

bar1=(
   Bar(init_opts=opts.InitOpts(width='800px', height='350px')) ##定义为柱状图
   .add_xaxis(x_line3) ##X轴的值
   .add_yaxis('评论数',y_line3) ##y的值和y的一些数据配置项
   .set_global_opts(title_opts=opts.TitleOpts(title='《隐秘的角落》1-12集评论数量'))
  
   )
                                    
bar1.render("bar3.html") ###输出html文件

如何基于Python爬取隐秘的角落评论

除了第一集的评论数特别多之外,可以看到,上半段的评论数明显要比下半段的要多,是否意味着大家普遍觉得前期的要更好看一些?

如何基于Python爬取隐秘的角落评论

3)开播十天之内的评论数量走势

接下来我们来看看从6月16日开播之后,网友们对该剧的评论数量走势情况。

from pyecharts.charts import Line ##导入需要使用的图表
from pyecharts import options as opts ##导入配置项

comment_num = df["留言时间"].str.split(' ').str[0].value_counts().sort_index()


x_line1 = [i.replace('2020-','') for i in comment_num.index.to_list()] 
y_line1 = comment_num.values.tolist()

# 绘制面积图
line1 = Line(init_opts=opts.InitOpts(width='1200px', height='600px'))
line1.add_xaxis(x_line1)
line1.add_yaxis('', y_line1,
        markpoint_opts=opts.MarkPointOpts(data=[
          opts.MarkPointItem(type_='max', name='最大值'),
          opts.MarkPointItem(type_='min', name='最小值')
        ])) 
line1.set_global_opts(title_opts=opts.TitleOpts('《隐秘的角落》开播10天内评论走势'), 
           xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate='30')),
           #visualmap_opts=opts.VisualMapOpts(max_=12673)
           ) 
line1.set_series_opts(label_opts=opts.LabelOpts(is_show=True), 
           linestyle_opts=opts.LineStyleOpts(width=2))
line1.render("Line.html")

如何基于Python爬取隐秘的角落评论

可以看到,从6月16日开播后,评论数量一路走高在6月25日达到了一个阶段的高点。

4)一天之中大家都在什么时间段看这部剧?

通过统计16日-26日每日0-23时的评论数量,来看看大家一般都在什么时候看剧

from pyecharts.charts import Bar ##导入需要使用的图表
from pyecharts import options as opts ##导入配置项

comment_num2 = df["留言时间"].str.split(' ').str[1].str.split(":").str[0].value_counts().sort_index()

x_line2 = comment_num2.index.to_list()
y_line2 = comment_num2.values.tolist()

bar1=(
   Bar(init_opts=opts.InitOpts(width='800px', height='350px')) ##定义为柱状图
   .add_xaxis(x_line2) ##X轴的值
   .add_yaxis('评论数',y_line2) ##y的值和y的一些数据配置项
   .set_global_opts(title_opts=opts.TitleOpts(title='《隐秘的角落》0-23时评论数量'))
  
   )
                                    
bar1.render("bar2.html") ###输出html文件

如何基于Python爬取隐秘的角落评论

可以看到,晚上20点-23时为最集中看剧的时间段,其次中午12-14点也有一波小高峰,总体更多的人是下午看剧的人多。

这是否也是你看剧的时间段呢?

5)评论的字数情况

永恒君一般看剧基本都不写评论的或者也是简单几个字,但是在这里,我特地看了一下评论字数的分布,

def comment_word_group(strings): #评论字数分组函数
  if len(strings)<=10:
    length = 0
  elif len(strings) > 10 and len(strings)<=30:
    length = 1
  elif len(strings) >30 and len(strings) <=50:
    length = 2
  else:
    length = 3
  return length

df["留言数量组别"] = df["留言内容"].apply(lambda x:comment_word_group(x))#评论字数分组

lengthData = df.groupby(['留言数量组别'])["留言内容"].count()#评论字数分组统计

from pyecharts.charts import Bar ##导入需要使用的图表
from pyecharts import options as opts ##导入配置项

attr = ["10字以内","10~30字","30~50字","50字以上"] #X轴
v1 = lengthData.values.tolist() #Y轴

bar1=(
   Bar(init_opts=opts.InitOpts(width='800px', height='350px')) ##定义为柱状图
   .add_xaxis(attr) ##X轴的值
   .add_yaxis('评论数量',v1) ##y的值和y的一些数据配置项
   .set_global_opts(title_opts=opts.TitleOpts(title='《隐秘的角落》评论字数分布'))  
   )                                    
bar1.render("bar.html") ###输出html文件

如何基于Python爬取隐秘的角落评论

绝大部分的评论字数都是在10个字以内,但也有约25%的评论字数在10-30个之内,还是让永恒君有点意外,是否说明该剧火爆也是有原因的,激起了不少伙伴的共鸣。

6)评论核心关键词

最后,永恒君将通过wordcloud库制作词云来看看,大家对该剧的整体评价,以及该剧的核心关键词。

#词云
from PIL import Image
from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS
import jieba
import matplotlib.pyplot as plt
import numpy as np

contents = df["留言内容"].str.cat(sep=" ")
contents

sw = set(STOPWORDS)
sw.add("这个")
sw.add("什么")

cut_text2 = " ".join(jieba.lcut(contents))

background_image = np.array(Image.open("bg.png"))

wc = WordCloud(font_path=r'C:\Windows\Fonts\simhei.ttf',
        background_color='White',
        max_words=3000,
        width=1000,
        height=500,
        scale=1,
        stopwords=sw,#停用词
        mask = background_image
        )
#font_path:设置字体,max_words:出现的最多词数量,mask参数=图片背景,必须要写上,另外有mask参数再设定宽高是无效的
wc.generate(cut_text2)
wc.to_file("a2.jpg")


#将图绘制出来
plt.imshow(wc)
plt.axis("off") 
plt.show()

如何基于Python爬取隐秘的角落评论

可以看到,“朝阳”、“严良”、“张东升”、“普普”、“好看”、“喜欢”、“小孩”、“原著”等关键词都是大伙在热议的。

不得不说,近年来如此火热的、而且质量不错的国产剧确实不多了。永恒君看前几集的时候,突然又有大学时候看《越狱》的那个味道,看了一集就想看下一集,停不下来。

如果你现在还没有来得及看,建议抽个时间去看看吧~~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python contextlib模块使用示例
Feb 18 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
使用Django2快速开发Web项目的详细步骤
Jan 06 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
python实践项目之监控当前联网状态详情
May 23 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
python实现视频读取和转化图片
Dec 10 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
Python进行区间取值案例讲解
Aug 02 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 #Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 #Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 #Python
python脚本和网页有何区别
Jul 02 #Python
keras:model.compile损失函数的用法
Jul 01 #Python
win10安装python3.6的常见问题
Jul 01 #Python
Python代码需要缩进吗
Jul 01 #Python
You might like
php下使用iconv需要注意的问题
2010/11/20 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
python中文编码问题小结
2014/09/28 Python
Python3遍历目录树实现方法
2015/05/22 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
我的中国梦演讲稿小学篇
2014/08/19 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL