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

潘粤明的《龙岭迷窟》呢?我使用Python得出了一些结论!

时间:2023-03-26 01:42:58 Python

至于天下霸唱的鬼吹灯,相信很多朋友都知道,可以说是中国盗墓寻宝系列小说的巅峰之作。它于4月1日开始播出。主要演员潘粤明、姜潮、张雨绮等都是一些熟悉的面孔。网剧质量和剧情还原度如何?让我们简单地看一下这篇文章。我们都知道,要理解一个东西,就需要用数据来说话。我们选择豆瓣评论区的数据作为本文的数据来源。首先打开该剧的豆瓣地址:https://movie.douban.com/subject/30488569/看一看:我们发现有超过27000人参与了评分,其中大部分评分为4星和5星.总分8.3分,算是比较不错的分数了。然后我们把网页下拉到短评位置,如下图:目前有6000多人写了短评,但是我们知道豆瓣最多只能查看500条短评数据,而我们的数据源取500条短评评论数据。获取数据首先,我们通过Python爬取了《龙岭迷窟》500条豆瓣短评数据。爬取的具体细节这里不再赘述。我们爬取的数据项包括:评论用户、评论时间、评论星级、评论内容,我们将爬取的数据存储在一个csv文件中。实现代码如下:defspider():url='https://accounts.douban.com/j/mobile/login/basic'headers={"User-Agent":'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}#龙陵初音网址,用于动态转页面,start后添加格式化数字,短评页面有20条数据,每页添加20条url_comment='https://movie.douban.com/subject/30488569/comments?start=%d&limit=20&sort=new_score&status=P'data={'ck':'','name':'我的用户名','password':'我的密码','remember':'false','ticket':''}session=requests.session()session.post(url=url,headers=headers,data=data)#初始化4个列表保存用户名、星级、时间和评论文本users=[]stars=[]times=[]content=[]#抓取500条,每页20条,也是豆瓣给的上限foriinrange(0,500,20):#获取HTMLdata=session.get(url_comment%i,headers=headers)#状态码200表示成功print('th',i,'page','statuscode:',data.status_code)#暂停0-1秒防止IP被封time.sleep(random.random())#解析HTMLselector=etree.HTML(data.text)#使用xpath获取单个页面上的所有评论comments=selector.xpath('//div[@class="comment"]')#遍历所有评论,获取评论中评论的详细信息:#获取用户名user=comment.xpath('.//h3/span[2]/a/text()')[0]#获取starrating=comment.xpath('.//h3/span[2]/span[2]/@class')[0][7:8]#获取时间date_time=comment.xpath('.//h3/span[2]/span[3]/@title')#某时间为空,需要判断iflen(date_time)!=0:date_time=date_time[0]date_time=date_time[:10]else:date_time=None#获取评论文本comment_text=comment.xpath('.//p/span/text()')[0].strip()#添加所有信息到列表users.append(user)stars.append(star)次。append(date_time)content.append(comment_text)#用字典包裹comment_dic={'user':users,'star':stars,'time':times,'comments':content}#转换成DataFrame格式comment_df=pd.DataFrame(comment_dic)#保存数据comment_df.to_csv('data.csv')#单独保存评论comment_df['comments'].to_csv('comment.csv',index=False)我们已经获取到分析数据了,接下来我们开始对获取到的数据进行分析评论数首先,我们来看一下不同时期的用户评论数。实现代码如下:csv_data=pd.read_csv('data.csv')df=pd.DataFrame(csv_data)df_gp=df.groupby(['time']).size()values=df_gp.values.tolist()index=df_gp.index.tolist()#设置画布大小plt.figure(figsize=(8,5))#数据plt.plot(index,values,label='CommentNumber')#设置数量zip中a、b的标签(索引,值):plt.text(a,b,b,ha='center',va='bottom',fontsize=13,color='black')plt.title('评论数随时间变化的折线图')plt.tick_params(labelsize=10)plt.ylim(0,300)plt.legend(loc='右上角')plt.show()看效果图:虽然该剧目前只有4天的评论数据,但从图中不难发现一些规律:我们可以看到4月1日和2日的评论较多,其中4月1日是首播日,而评论数在情理之中,4月2日的评论数比4月1日还要多,推测是因为该剧播出后传播速度快播出,也就是让更多人知道节目的热度会随着时间的推移而下降,评论量会呈现下降的趋势。评论数的变化趋势也反映了该剧热度变化的总趋势。人物接下来,我们来看一下获取到的评论数据中,剧中主要人物被提及的次数。实现代码如下:csv_data=pd.read_csv('data.csv')roles={'胡八一':0,'王胖子':0,'雪莉杨':0,'鹧鸪哨':0,'金牙':0,'盲陈':0}names=list(roles.keys())fornameinnames:jieba.add_word(name)forrowincsv_data['comments']:row=str(row)fornameinnames:count=row.count(name)roles[name]+=countplt.figure(figsize=(8,5))#dataplt.bar(list(roles.keys()),list(roles.values()),width=0.5,label='references',color=['r','dodgerblue','c','m','y','g'])#为a设置数字标签,binzip(list(roles.keys()),list(roles.values())):plt.text(a,b,b,ha='center',va='bottom',fontsize=13,color='black')plt.title('字符提及次数直方图')plt.xticks(rotation=270)plt.tick_params(labelsize=10)plt.ylim(0,200)plt.legend(loc='右上')plt.show()看一下效果图:从图中我们可以看出,提到人物数量前三名的分别是:胡八一、王胖子y,还有大金牙。通过人物被提及的次数,我们也可以大致推断出剧中人物的受欢迎程度。角色被提及的次数越多,说明它的知名度应该越高。接下来,我们来看看该剧的日常用户评分。最高评级为5星。如果一天有多个评分,我们会取平均值。代码实现如下:csv_data=pd.read_csv('data.csv')df_time=csv_data.groupby(['time']).size()df_star=csv_data.groupby(['star']).size()index=df_time.index.tolist()value=[0]*len(index)#生成字典dic=dict(zip(index,value))fork,vindic.items():stars=csv_data.loc[csv_data['time']==str(k),'star']#平均值avg=np.mean(list(map(int,stars.values.tolist())))dic[k]=round(avg,2)#设置画布大小plt.figure(figsize=(8,5))#dataplt.plot(list(dic.keys()),list(dic.values()),label='star',color='red',marker='o')plt.title('评论星级随时间变化的折线图')plt.tick_params(labelsize=10)plt.ylim(0,5)plt.legend(loc='右上')plt.show()取效果图一看:从图中我们可以看出,该剧的星级普遍保持在4星以上,说明大部分用户对该剧的质量认可。满意。词云展示最后,我们展示评论内容的词云,看看哪些词是评论区最热门的词。代码实现如下:defjieba_():#打开评论数据文件content=open('comment.csv','rb').read()#jiebaword_list=jieba.cut(content)words=[]#过滤词remove_words=['and','not','some','that','only','but','something','this','all','so','but','全片','有点','一个','一个','什么','虽然','一切','看','一样','只','不','一个','this','for']forwordinword_list:ifwordnotinremove_words:words.append(word)globalword_cloud#用逗号分隔单词word_cloud=','.join(words)defcloud():#Openword云背景图cloud_mask=np.array(Image.open('bg.jpg'))#定义词云的一些属性wc=WordCloud(#背景图分割颜色为白色background_color='white',#背景图案mask=cloud_mask,#显示最大字数max_words=100,#显示中文font_path='./fonts/simhei.ttf',#最大字数max_font_size=80)globalword_cloud#词云函数nx=wc.generate(word_cloud)#生成词云图image=x.to_image()#显示词云图image.show()#保存词云图wc.to_file('anjia.png')看效果图:如需完整代码,可微信搜索公众号Python小二,后台回复龙岭迷窟