最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……
本文作者:寇晓璇,中南财经政法大学统计与数学学院
本文编辑:赵一帆
技术总编:陈 鼎
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/)的评论内容及对应的评论时间。https://movie.douban.com/subject/35202793/comments?status=P
https://movie.douban.com/subject/35202793/comments?start=20&limit=20&status=P&sort=new_score
https://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 requests
import chardet
import re
import pandas as pd
import 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')
●
首先,导入可视化需要的相关库,并对字体进行设置。
#导入相关库
import pandas as pd
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud
from imageio import imread
# 忽略警告
import warnings
warnings.filterwarnings("ignore")
# 中文字体设置
plt.rcParams["font.family"] = "SimHei"
# 字体大小设置
plt.rcParams["font.size"] = 16
# 字体风格设置
plt.rcParams["font.style"] = "italic"
#导入爬取的数据
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)
#提取日期、具体时间
df["日期(8月)"] = df["评论时间"].str[8:-9].astype(int)
df["小时"] = df["评论时间"].str[11:-6].astype(int)
df.head(5)
对于一条评论来说,存在部分评论可能由于手误、凑字数等原因,出现将某个字或者词语,重复多次的现象,因此在进行分词之前,需要做“压缩去重”操作。
#评论去重
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()
#评论随日期变化
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)
#评论随小时变化
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)
import jieba
from wordcloud import WordCloud
from 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")
腾讯课堂课程二维码
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
随机森林-Random Forest
复原之神--preserve&restore
合并,“纵”享新丝滑:frameappend & xframeappend什么是全局配置项?|从零开始的Pyecharts(二)帮你拿下数据可视化|从零开始的Pyecharts
Stata助力疫情打卡管理——是谁没有接龙呢?
这十年,《金融研究》的编委和读者偏爱哪些研究话题和文章?【案例展示】Python与数据库交互
学好这一手,英语词典常在手玩转Stata中的数学函数
用spmap看中国空气质量戳穿围城面具:安利&劝退一个专业
走进图文并茂的攻略世界
玩转word文档“大变身”——wordconvert
简述递归
OpenCV库——轻松更换证件照背景色800万年薪!还有谁?!
千古伤心词人,词伤几何?
去哪儿网攻略爬取——跟我一起去大理吧
"有你才有团"——Stata爬取王者荣耀英雄海报
如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫
利用Python构建马科维茨有效边界
rangestat,让统计量灵活滚动起来!
听说这样做立项成功率更高哦
如何处理缺失值?这一篇搞定!
善用dataex命令,高效沟通你我他
大数据下的大学分数线排行榜,快来围观!
《觉醒年代》—带你回到百年前
用Stata画的三维图很奇怪怎么办?
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为
作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。