当前位置: 首页 > 后端技术 > Python

程序员电视剧豆瓣评论分析

时间:2023-03-25 21:27:56 Python

原文由新喜发表于TesterHome论坛,原文链接背景我在春节假期追了一部电视剧《完美伴侣》,主演是女神“高圆圆”,有45集左右,总体感觉剧情还可以,女神的演技和颜值还是在线的。剧情简介:陈山是某知名律师事务所证券部的一名女律师。年近40的她,事业遇到了瓶颈。结果,她全神贯注于工作,无暇顾及丈夫和女儿的情感需求。丈夫孙雷在一家国有企业工作。为了支持妻子的事业,他扛起了照顾家庭的重担,几乎放弃了事业的追求。这种女强男弱的婚姻模式,从过去十年运转良好,到逐渐失去平衡,不知不觉中被淹没。就在此时,投行精英林庆坤出现,他手中的大单成为陈山与竞争对手争夺的目标。面对婚姻和事业的双重危机,陈山拼命兼顾,却越来越适得其反。孙雷和陈山经历重重考验后,终于发现,彼此的初心还在。只要不完美,只要互相珍惜,互相支持,就会是彼此最完美的伙伴。当时这部剧有的地方也很狗血,有褒奖的,也有批评的。想通过网友的评论来分析一波。数据源在豆瓣上能找到几千条评论,爬下来应该够用了。豆瓣地址https://movie.douban.com/subj...查看请求抓取查看数据接口和数据格式数据格式在h5页面上,评论由头像、评分、评论组成。看返回的数据,不是标准的kv结构数据,而是一团html结构,然后前端渲染。复制curl复制curl的目的是方便通过postman调试脚本,使用headers复用headers,获取脚本中的数据。脚本依赖库源:https://pypi.doubanio.com/simplepip3installjieba(分词)pip3installhttpx(发送网络请求)pip3installlogzero(日志)pip3installbeautifulsoup4(解析html)pip3installwordcloud(生成wordcloud)pip3installpyecharts(generatechart)循环获取评论,通过start的数量查询数据,通过BeautifulSoupData获取对应的span标签,最后得到class="short"就是评论@staticmethoddefget_info_by_comments():"""获取评论:return:"""Page_INDEX=0START_INDEX=0IS_RUNNING=TruewhileIS_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+20Page_INDEX=Page_INDEX+1logger.info(url)r=httpx.get(url,headers=headers,timeout=10)if'html'inr.text:html=r.json()['html']汤=BeautifulSoup(html,'html.parser')forkinsoup.find_all('span'):if'class="short"'instr(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获取评论使用脚本离线存储评论在本地文件中,方便后续分析。根据评论生成的词云生成词云脚本。将句子切词成单词font_path="/System/Library/fonts/PingFang.ttc"word=jieba.cut(sentence)words="".join(word)#生成图片的nd数组,传入图片路径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'inr.text:html=r.json()['html']soup=BeautifulSoup(html,'html.parser')forkinsoup.find_all('span'):ifk.get('class')!=None:#Findratingsif'allstar'instr(k.get('class')):title=str(k.get('title').encode()通过pyecharts生成打分蛋糕图withopen(STARFilePath,'r')asf:r_info=f.readlines()JIAOCHA=0HAIXING=0TUIJIAN=0HENCHA=0LIJIAN=0QITA=0foriinr_info:STAR=i.replace("\n","")ifSTAR=="poor":JIAOCHA=JIAOCHA+1elifSTAR=="ok":HAIXING=HAIXING+1elifSTAR=="recommended":TUIJIAN=TUIJIAN+1elifSTAR=="差":HENCHA=HENCHA+1elifSTAR=="推荐":LIJIAN=LIJIAN+1else:QITA=QITA+1pie=(Pie().add("",[('很差',HENCHA),('差',JIAOCHA),('还好',海星),('推荐',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=[]withopen(TIMEFilePath,'r')asf:r_info=f.readlines()foriinr_info:comment_time=i.replace("\n","").split(":")[0]+":00:00"#过滤comment_time_list.append(comment_time)comment_dict={}comment_dict_list=[]foriincomment_time_list:ifinotincomment_dict.keys():comment_dict[i]=comment_time_list.count(i)forkincomment_dict:comment_dict_list.append({"time":k,"value":comment_dict[k]})comment_dict_list.sort(key=lambdak:(k.get('time',0)))#print(comment_dict_list)#根据按时间排序后的time_list=[]value_list=[]forcincomment_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="CommentTime-Histogram"),xaxis_opts=opts.AxisOpts(name="SubmissionTime",axislabel_opts={"rotate":45})).render("comment_time_bar_histogram.html"))折线图没有设置平滑curve折线图并设置平滑曲线得到最多的词,想看看哪些是“最多的词”1.使用jieba进行分词2.过滤包含语气词的语气词,不准确。有些词没有意义,去掉语气助词。过滤一些常用的语气词importjiebadefstopwordslist():"""创建一个停用词列表:return:"""stopwords=[line.strip()forlineinopen('chinese_stopword.txt',encoding='UTF-8').readlines()]returnstopwordsdefseg_depart(sentence):""&qu哦;中文分句:paramsentence::return:"""print("分词")out_str_list=[]sentence_depart=jieba.cut(sentence.strip())stopwords=stopwordslist()outstr=''#Gotostopwordsforwordinsentence_depart:ifwordnotinstopwords:ifword!='\t':outstr+=wordoutstr+=""out_str_list.append(word)returnout_str_list最后,通过电视剧评论分析,你可以获得:1.Python网络请求实战2.Python常用数据结构实战3.Python图表库使用4.常用算法实战最后给大家推荐一下这部剧,平衡家庭和事业。出现次数最多的词最后一个饼图是“家庭”,提醒我们网络工作压力大,经常加班,忽略了家人的陪伴。祝大家工作不加班,多陪陪家人~