原文由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+ 为了妻子的事业放弃本人的事业关照孩子,均衡家庭和事业.

最初一张饼图呈现最多的词就是"家庭",联想到咱们做互联网的工作压力大并且常常加班疏忽家人的陪伴.

祝大家工作不加班、多工夫陪陪家人~