原文由 xinxi 公布于 TesterHome 论坛,原文链接
背景
在春节假期追了一个电视剧 ” 完满伴侣 ”, 女神 ” 高圆圆 ” 领衔主演, 大略有 45 集, 给我的感觉整体剧情还行, 女神演技和颜值仍然在线.
大略的剧情介绍:
陈珊是一家驰名律所证券部的女律师,近 40 岁的她遭逢回升瓶颈。因而她全身心投入工作,基本无暇顾及丈夫和女儿的情感需要。
丈夫孙磊在一家国企工作,为了反对老婆的事业,承当了关照家庭的重任,简直放弃了本人的事业谋求。这女强男弱的婚姻模式近十年来从运行良好,到慢慢失去平衡,人不知; 鬼不觉中已不堪重负。此时投行精英林庆昆呈现,他手中的大单,成为陈珊和竞争对手们抢夺的指标。
面对婚姻和职场双重危机,陈珊拼命致力试图同时解决好两者,却越来越事与愿违。孙磊和陈珊经验了重重考验后,
最终发现他们对彼此的初心还在,不完满的他们,只有好好珍惜,独特搀扶,就是彼此最完满的伴侣。
过后这部剧有的中央也很狗血,有赞的、也有骂的。想通过网友的评论剖析一波。
数据起源
在豆瓣上能找到几千条评论, 应该爬下来够用了.
豆瓣地址
https://movie.douban.com/subj…
查看申请
抓看看看数据接口和数据格式
数据格式
在 h5 页面上, 一条评论由头像、评分、评语组成。
在查看返回数据并不是返回一个规范的 kv 构造数据, 而是一坨 html 构造, 而后前端再去渲染。
复制 curl
复制 curl 的目标是, 不便通过 postman 调试脚本
应用 header
复用 header 头在脚本获取数据
脚本编写
依赖库
源: https://pypi.doubanio.com/simple
pip3 install jieba (分词)
pip3 install httpx (发送网络申请)
pip3 install logzero (日志)
pip3 install beautifulsoup4 (解析 html)
pip3 install wordcloud (生成词云)
pip3 install pyecharts (生成图表)
循环获取评论, 通过 start 的数量来查问数据, 通过 BeautifulSoup 获取对应的 span 标签数据, 最终获取 class=”short” 就是评语
@staticmethod
def get_info_by_comments():
"""
获取评论
:return:
"""
Page_INDEX = 0
START_INDEX = 0
IS_RUNNING = True
while IS_RUNNING:
url = HOST + "/subject/35196566/comments?percent_type=&start={}&limit=20&status=P&sort=new_score&comments_only=1".format(START_INDEX)
START_INDEX = START_INDEX + 20
Page_INDEX = Page_INDEX + 1
logger.info(url)
r = httpx.get(url, headers=headers, timeout=10)
if 'html' in r.text:
html = r.json()['html']
soup = BeautifulSoup(html, 'html.parser')
for k in soup.find_all('span'):
if 'class="short"' in str(k):
comment = str(k.string).encode()
CommentsList.append(comment)
write_content_to_file(FilePath, comment, is_cover=False)
write_content_to_file(FilePath, "\n".encode(), is_cover=False)
time.sleep(1)
else:
IS_RUNNING = False
获取评论
应用脚本把评论离线存在本地的文件中, 不便后续剖析.
依据评论生成的词云
生成词云脚本
with open(CommentsFilePath, 'r') as f:
r_info = f.readlines()
sentence = ''.join(r_info)
# 用 jieba 将句子分词
font_path = "/System/Library/fonts/PingFang.ttc"
word = jieba.cut(sentence)
words = " ".join(word)
# 生成图片的 nd-array,传入图片门路
im = imageio.imread('test.jpeg')
wc = wordcloud.WordCloud(width=600, height=800, background_color='white', font_path=font_path, mask=im,
contour_width=1, contour_color='black')
wc.generate(words)
wc.to_file('wc.png')
这里会用到 jieba 进行分词,wordcloud 通过分词后的数量生成词云.
获取评分
还想看看评分的散布是怎么样的
获取评分的脚本如下:
if 'html' in r.text:
html = r.json()['html']
soup = BeautifulSoup(html, 'html.parser')
for k in soup.find_all('span'):
if k.get('class') != None:
# 查找评分
if 'allstar' in str(k.get('class')):
title = str(k.get('title')).encode()
通过 pyecharts 生成评分饼图
with open(STARFilePath, 'r') as f:
r_info = f.readlines()
JIAOCHA = 0
HAIXING = 0
TUIJIAN = 0
HENCHA = 0
LIJIAN = 0
QITA = 0
for i in r_info:
STAR = i.replace("\n", "")
if STAR == "较差":
JIAOCHA = JIAOCHA + 1
elif STAR == "还行":
HAIXING = HAIXING + 1
elif STAR == "举荐":
TUIJIAN = TUIJIAN + 1
elif STAR == "很差":
HENCHA = HENCHA + 1
elif STAR == "力荐":
LIJIAN = LIJIAN + 1
else:
QITA = QITA + 1
pie = (Pie()
.add("", [(' 很差 ', HENCHA), (' 较差 ', JIAOCHA), (' 还行 ', HAIXING), (' 举荐 ', TUIJIAN), (' 力荐 ', LIJIAN)])
.set_global_opts(title_opts=opts.TitleOpts(title="评分散布"))
.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{d}%'))
)
pie.render(path=RootPath + "/star_pie.html")
pie.render()
获取评论工夫生成图表
还想看看网友评论的时间段, 依照小时维度.
拿到的数据是到秒, 做工夫解决如下:
1、依照小时过滤
2、依照工夫排序后的
comment_time_list = []
with open(TIMEFilePath, 'r') as f:
r_info = f.readlines()
for i in r_info:
comment_time = i.replace("\n", "").split(":")[0] +":00:00" # 依照小时过滤
comment_time_list.append(comment_time)
comment_dict = {}
comment_dict_list = []
for i in comment_time_list:
if i not in comment_dict.keys():
comment_dict[i] = comment_time_list.count(i)
for k in comment_dict:
comment_dict_list.append({"time": k, "value": comment_dict[k]})
comment_dict_list.sort(key=lambda k: (k.get('time', 0)))
# print(comment_dict_list) # 依照工夫排序后的
time_list = []
value_list = []
for c in comment_dict_list:
time_list.append(c['time'])
value_list.append(c['value'])
c = (Bar(init_opts=opts.InitOpts(width="1600px", height="800px"))
.add_xaxis(time_list)
.add_yaxis("数量", value_list, category_gap=0, color=Faker.rand_color())
.set_global_opts(title_opts=opts.TitleOpts(title="评论工夫 - 直方图"),
xaxis_opts=opts.AxisOpts(name="提交工夫", axislabel_opts={"rotate": 45}))
.render("comment_time_bar_histogram.html")
)
折线图未设置平滑曲线
折线图并且设置平滑曲线
获取最多的词
还想看看哪些是 ” 最多的词 ”
1、应用 jieba 进行分词
2、过滤语气词
蕴含语气词, 这样比拟不准, 有些词没有什么意义
去掉语气词, 过滤一些罕用的语气词
import jieba
def stopwordslist():
"""
创立停用词列表
:return:
"""stopwords = [line.strip() for line in open('chinese_stopword.txt', encoding='UTF-8').readlines()]
return stopwords
def seg_depart(sentence):
"""
对句子进行中文分词
:param sentence:
:return:
"""print(" 正在分词 ")
out_str_list = []
sentence_depart = jieba.cut(sentence.strip())
stopwords = stopwordslist()
outstr = ''
# 去停用词
for word in sentence_depart:
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
out_str_list.append(word)
return out_str_list
最初
通过一个电视剧评论剖析, 能失去:
1、python 网络申请练习
2、python 罕用数据结构练习
3、python 的图表库应用
4、罕用算法练习
最初的最初, 在举荐一下这个剧, 男主 35+ 为了妻子的事业放弃本人的事业关照孩子, 均衡家庭和事业.
最初一张饼图呈现最多的词就是 ” 家庭 ”, 联想到咱们做互联网的工作压力大并且常常加班疏忽家人的陪伴.
祝大家工作不加班、多工夫陪陪家人~