查看原文
其他

最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:寇晓璇,中南财经政法大学统计与数学学院

本文编辑:赵一帆

技术总编:陈   鼎

Stata&Python云端课程来啦!

为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于9月1日起调价,Python课程的价格调整为199.9元Stata进阶课程调为199.9元Stata基础课程调整到229.9元Stata文本分析正则表达式网络爬虫基本字符串课程调整至79.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦 对报名有任何疑问欢迎在公众号后台和腾讯课堂留言~我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

近期,《扫黑风暴》这部国产犯罪剧可以说是十分火爆了,把本来打算养养肝的我直接拉回了追剧第一线。自8月9日开播以来,该剧收获了不错的口碑。随着剧集的更新,该剧在网上引起了激烈的讨论,相关话题频频登上热搜。小编对该剧也是颇有兴趣,因此便通过Python爬取了《扫黑风暴》的豆瓣评论相关数据,同时进行了可视化分析。

一、爬取豆瓣评论
在做数据分析之前最重要的就是数据的获取,本文通过Python中的requests模块爬取豆瓣官网(https://movie.douban.com/)的评论内容及对应的评论时间。

下面展示了评论1-3页的链接,我们可以观察到其中的规律:`start`是评论的起始位置;`limit`代表获取多少条评论数据。观察结果显示:3个链接的不同在于`start`的不同,在后续翻页时,我们只需要修改`start`参数即可。
https://movie.douban.com/subject/35202793/comments?status=Phttps://movie.douban.com/subject/35202793/comments?start=20&limit=20&status=P&sort=new_scorehttps://movie.douban.com/subject/35202793/comments?start=40&limit=20&status=P&sort=new_score
在评论页面上,我们按下CTRL + Shift + I,点击Network,再按F5,在Name框中会出现一个选项,点击该选项,在右侧点击Headers选项,在最下方找到User-Agent,粘贴到自己的代码即可。如下图所示:

之后,我们按下CTRL + U,打开真实的网页源代码,可以发现里面有我们想要获取的评论时间、评论内容等相关信息。

完整爬虫代码如下:
# 导入相关库import requestsimport chardetimport reimport pandas as pdimport time
#定义相关函数def get_url(i): url = f"https://movie.douban.com/subject/35202793/comments?start={i}&limit=20&status=P&sort=new_score" return url
def get_info(url): headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36', 'Referer':'https://movie.douban.com/subject/35202793/comments?limit=20&status=P&sort=new_score' } response = requests.get(url,headers=headers)#发起请求得到响应 response.encoding = "utf-8" text = response.text#返回一个经过解码的字符串
comments_list = [i for i in re.findall('<span class="short">(.*?)</span>',text,re.S)] comments_time_list = [i.strip() for i in re.findall('<span class="comment-time " title="(.*?)">',text,re.S)] df = pd.DataFrame({"评论时间":comments_time_list,"评论内容":comments_list}) return df if __name__ == "__main__": df = pd.DataFrame(columns=['评论时间','评论内容']) for i in range(0,201,20): url = get_url(i) print(f"正在打印第{i//20+1}页") df1 = get_info(url) df = pd.concat([df,df1]) time.sleep(5) df.to_csv('扫黑风暴评论.csv',encoding='utf_8_sig')
二、评论数据可视化

1.导入相关库,设置字体

首先,导入可视化需要的相关库,并对字体进行设置。

#导入相关库import pandas as pdimport matplotlib.pyplot as pltimport jiebafrom wordcloud import WordCloudfrom imageio import imread
# 忽略警告import warningswarnings.filterwarnings("ignore")
# 中文字体设置plt.rcParams["font.family"] = "SimHei"# 字体大小设置plt.rcParams["font.size"] = 16# 字体风格设置plt.rcParams["font.style"] = "italic"


2.读取数据,去重复值
之后,我们导入刚刚获取到的数据,简单看一下数据的基本格式。
#导入爬取的数据df = pd.read_csv("扫黑风暴评论.csv",index_col=0)df.head(5)

鉴于可能存在一些时间完全相同的重复评论,因此需要将获取到的数据进行去重处理。
#删除重复值print("删除之前的记录数:",df.shape)df.drop_duplicates(subset=['评论时间','评论内容'],inplace=True,keep='first')print("删除之前的记录数:",df.shape)


3.评论时间处理
因为《扫黑风暴》是2021年8月9日开播的,因此所有的评论数据都是8月开始有的,我们只保留有用的“日期”和“小时”数据。
#提取日期、具体时间df["日期(8月)"] = df["评论时间"].str[8:-9].astype(int)df["小时"] = df["评论时间"].str[11:-6].astype(int)df.head(5)

4.评论内容处理

对于一条评论来说,存在部分评论可能由于手误、凑字数等原因,出现将某个字或者词语,重复多次的现象,因此在进行分词之前,需要做“压缩去重”操作。

#评论去重def func(st): for i in range(1,int(len(st)/2)+1): for j in range(len(st)): if st[j:j+i] == st[j+i:j+2*i]: k = j + i while st[k:k+i] == st[k+i:k+2*i] and k<len(st): k = k + i st = st[:j] + st[k:] return st
df["评论内容"] = df["评论内容"].apply(func)df.head()

5.评论与时间的关系
#评论随日期变化comment_day = df.groupby("日期(8月)")["日期(8月)"].count()comment_day.plot(color="r",linewidth=3)plt.ylabel("每一天的评论数")plt.xticks(range(9,23),comment_day.index)plt.savefig("评论数随时间的变化趋势",dpi=300)


从图中可以看出:短评数量在8月9日开播以来,在第二天便达到顶峰。和文章最开始的说明一致,观众对于该剧的期待值较高。
#评论随小时变化comment_hour = df.groupby("小时")["小时"].count()comment_hour.plot(color="blue",linewidth=3)plt.ylabel("二十四小时内的评论数")plt.xticks(range(0,24),comment_hour.index)plt.savefig("二十四小时内的评论数的变化趋势",dpi=300)

那么大家都是在什么时间段追剧呢?从24小时图可以看出:中午11点到13点追剧人数较多;晚上19点到24点,评论数急剧上升,并在24点达到顶峰。可见,大家下班后就开始当天的追剧活动了。

6.绘制词云图
那么大家对这部剧的态度如何呢?我们通过对观众的评论内容分词,进行词频统计,进而绘制出词云图。代码如下:
import jiebafrom wordcloud import WordCloudfrom imageio import imread# 1)对评论内容进行分词操作jieba.add_word("扫黑风暴")df["切分后评论"] = df["评论内容"].apply(jieba.lcut)
# 2)读取停用词,并去除停用词with open("stopword.txt","r",encoding="gbk") as f: stop = f.read() # 返回的是一个字符串stop = stop.split() # 这里得到的是一个列表.split()会将空格,\n,\t进行切分,因此我们可以将这些加到停用词当中stop = stop + [" ","\n","\t"]df_after = df["切分后评论"].apply(lambda x: [i for i in x if i not in stop])
# 3)词频统计all_words = []for i in df_after: all_words.extend(i)
word_count = pd.Series(all_words).value_counts()
# 4)绘制词云图# a.读取背景图片back_picture = imread("shfb.png")# b.设置词云参数wc = WordCloud(font_path="simhei.ttf", background_color="black", max_words=2000, mask=back_picture, max_font_size=200, random_state=42 )wc2 = wc.fit_words(word_count)# c.绘制词云图plt.figure(figsize=(20,10))plt.imshow(wc2)plt.axis("off")plt.show()wc.to_file("ciyun.png")

可见,孙红雷和张艺兴两名演员的名字十分醒目,有很多演技派的“老戏骨”出现在该剧中,使这部剧看点十足,以此向奋战在扫黑除恶一线的公务人员致敬,是你们的无私付出,废寝忘食的奋战,才让祖国阳光普照的地方越来越多!
好了,今天的分享就到此为止,大家可以着手试试,也可以拓展一下哦!完整代码及相关文件可通过回复“扫黑风暴”获取~
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


腾讯课堂课程二维码








                


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!





往期推文推荐

随机森林-Random Forest 

复原之神--preserve&restore

         合并,“纵”享新丝滑:frameappend & xframeappend
什么是全局配置项?|从零开始的Pyecharts(二)帮你拿下数据可视化|从零开始的Pyecharts 

Stata助力疫情打卡管理——是谁没有接龙呢?

这十年,《金融研究》的编委和读者偏爱哪些研究话题和文章?

【案例展示】Python与数据库交互

学好这一手,英语词典常在手 

玩转Stata中的数学函数

用spmap看中国空气质量

戳穿围城面具:安利&劝退一个专业

走进图文并茂的攻略世界 

玩转word文档“大变身”——wordconvert

数据读入|一文读懂用Stata读入不同类型的数据

简述递归

OpenCV库——轻松更换证件照背景色

800万年薪!还有谁?!

千古伤心词人,词伤几何?

去哪儿网攻略爬取——跟我一起去大理吧

"有你才有团"——Stata爬取王者荣耀英雄海报

爬虫实战|嚣张的徽州宴老板娘错在哪?

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

善用dataex命令,高效沟通你我他

用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里

作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存