原文由xinxi公布于TesterHome论坛,原文链接
背景
在春节假期追了一个电视剧"完满伴侣",女神"高圆圆"领衔主演,大略有 45 集,给我的感觉整体剧情还行,女神演技和颜值仍然在线.
大略的剧情介绍:
陈珊是一家驰名律所证券部的女律师,近40岁的她遭逢回升瓶颈。因而她全身心投入工作,基本无暇顾及丈夫和女儿的情感需要。
丈夫孙磊在一家国企工作,为了反对老婆的事业,承当了关照家庭的重任,简直放弃了本人的事业谋求。这女强男弱的婚姻模式近十年来从运行良好,到慢慢失去平衡,人不知;鬼不觉中已不堪重负。此时投行精英林庆昆呈现,他手中的大单,成为陈珊和竞争对手们抢夺的指标。
面对婚姻和职场双重危机,陈珊拼命致力试图同时解决好两者,却越来越事与愿违。孙磊和陈珊经验了重重考验后,
最终发现他们对彼此的初心还在,不完满的他们,只有好好珍惜,独特搀扶,就是彼此最完满的伴侣。
过后这部剧有的中央也很狗血,有赞的、也有骂的。想通过网友的评论剖析一波。
数据起源
在豆瓣上能找到几千条评论,应该爬下来够用了.
豆瓣地址
https://movie.douban.com/subj...
查看申请
抓看看看数据接口和数据格式
数据格式
在 h5 页面上,一条评论由头像、评分、评语组成。
在查看返回数据并不是返回一个规范的 kv 构造数据,而是一坨 html 构造,而后前端再去渲染。
复制 curl
复制 curl 的目标是,不便通过 postman 调试脚本
应用 header
复用 header 头在脚本获取数据
脚本编写
依赖库
源: https://pypi.doubanio.com/simplepip3 install jieba (分词) pip3 install httpx (发送网络申请)pip3 install logzero (日志)pip3 install beautifulsoup4 (解析html)pip3 install wordcloud (生成词云)pip3 install pyecharts (生成图表)
循环获取评论,通过 start 的数量来查问数据,通过 BeautifulSoup 获取对应的 span 标签数据,最终获取 class="short"就是评语
@staticmethoddef 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 = 0HAIXING = 0TUIJIAN = 0HENCHA = 0LIJIAN = 0QITA = 0for 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 + 1pie = ( 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 jiebadef stopwordslist(): """ 创立停用词列表 :return: """ stopwords = [line.strip() for line in open('chinese_stopword.txt', encoding='UTF-8').readlines()] return stopwordsdef 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+ 为了妻子的事业放弃本人的事业关照孩子,均衡家庭和事业.
最初一张饼图呈现最多的词就是"家庭",联想到咱们做互联网的工作压力大并且常常加班疏忽家人的陪伴.
祝大家工作不加班、多工夫陪陪家人~