python爬取《少年的你》影评分析

mac2025-06-02  31

最近在微博热搜上看了很多关于《少年的你》的信息,上映7天票房达到了8.72亿,在猫眼上的评分9.5分。这部剧原计划在6月27日上映,由于广电总局的种种限制,推迟到了9月25日上映。该剧的导演是曾国祥,《七月与安生》也是他指导的,当时小马哥和冬雨也是凭这部电影获得了影后的称呼。该剧的主演是冬雨和易洋千玺,这两个都是我很喜欢的演员,冬雨的演技也是我们有所目睹的,毕竟是影后。对于千玺,我之前只是喜欢听他的歌和喜欢他的颜❤️,这次通过看影评,广大群众还是被他的演技折服了。

我利用最近一直子学习的爬虫从豆瓣上爬取了220条影评和评星数进行分析,下面我会贴上我的代码,希望可以和大家一起交流学习。

1.使用爬虫获取豆瓣上的影评、星级及点赞数

利用BeautifulSoup和正则表达式获取豆瓣上我需要的信息,并将这些信息保存到csv中,代码如下:

''' 1.获取少年的你的影评,存成在csv 2.获取评星数和点赞数 3。统计评星1-5,及或赞数,绘制图形 4。对影评进行分析,制作词云 ''' from bs4 import BeautifulSoup import re import requests from requests.exceptions import RequestException import csv from matplotlib import pyplot as plt #判断网络连接是否异常 def judge_html(url): try: reponse=requests.get(url) if reponse.status_code==200: #判断网页连接状态是否正确 return reponse.text else: return None except RequestException: return None def spidercomment(urltxt): #使用BeautifulSoup解析网页 soup=BeautifulSoup(urltxt,'html.parser') item={'cmt_star':'0'} votes1={'vote':'0'} for j in range(20): commentlist=soup.find_all('span',{'class':'short'})#爬取影评 #保存到csv中 # print(commentlist[0].text) a=commentlist[j].text with open('comment.csv','a',encoding='utf-8') as cfile: cfile.write(a) cfile.write('\n') votes=soup.find_all('span',class_="votes")#获取点赞数 #votes['vote']=votes[j].string votes2=votes[j].text #print(votes2) commentsList2 = soup.find_all('span', class_=re.compile(r'allstar')) # 获取获赞数 #print(commentsList2[0]['title']) if commentsList2[0]['title'] == '力荐': item['cmt_star'] = '5' elif commentsList2[0]['title'] == '较差': item['cmt_star'] = '2' elif commentsList2[0]['title'] == '还行': item['cmt_star'] = '3' elif commentsList2[0]['title'] == '推荐': item['cmt_star'] = '4' else: item['cmt_star'] = '1' with open('vote.csv','a',encoding='utf-8') as vfile: vfile.write(item['cmt_star']) vfile.write('\t') vfile.write(votes2) vfile.write('\n') if __name__=='__main__': id=30166972 for i in range(11): start = i*20 url="https://movie.douban.com/subject/%s/comments?start=" \ "%s&limit=20&sort=new_score&status=P" %(id, start) #print(url) urltext=judge_html(url) spidercomment(urltext) print("爬虫结束")

2.数据清洗及绘制词云图

对获得的影评进行去除标点符号和空行,并将其保存成txt,利用jieba进行分词操作,获取出现频率最高的词语,绘制词云图。

import re # 正则表达式库 import collections # 词频统计库 import numpy as np # numpy数据处理库 import jieba # 结巴分词 import wordcloud # 词云展示库 from PIL import Image # 图像处理库 from PIL import ImageFont import matplotlib.pyplot as plt # 图像展示库 # 1. 对于爬取的评论信息进行数据清洗(删除不必要的逗号, 句号, 表情, 只留下中文或者英文内容) def clear(): with open('comment.csv') as f: comments = f.read() pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z]+)') # 通过正则表达式实现 deal_comments = re.findall(pattern,comments) newComments = '' for item in deal_comments: newComments += item with open('commment1.txt','a',encoding='utf-8') as files: files.write(newComments) def couldword(): # 读取文件 fn = open('/Users/yuanli/PycharmProjects/TEST/commment1.txt') # 打开文件 string_data = fn.read() # 读出整个文件 fn.close() # 关闭文件 plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 文本预处理 pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式 string_data = re.sub(pattern, '', string_data) # 将符合模式的字符去除 # 文本分词 seg_list_exact = jieba.cut(string_data, cut_all=False) # 精确模式分词 object_list = [] remove_words = [u'一个', u'真的', u'就是', u'就是', u'随着', u'啊啊啊', u'其实', u'等', u'不得不', u'都', u'电影', u'也', u'人', u'中', u'在', u'了', u'通常', u'如果', u'我们', u'需要',u'每个','电影院'] # 自定义去除词库 for word in seg_list_exact: # 循环读出每个分词 if word not in remove_words: # 如果不在去除词库中 if len(word)>2: object_list.append(word) # 分词追加到列表 # 词频统计 word_counts = collections.Counter(object_list) # 对分词做词频统计 word_counts_top10 = word_counts.most_common(80) # 获取前10最高频的词 print(word_counts_top10) # 输出检查 # 词频展示 mask = np.array(Image.open('/Users/yuanli/PycharmProjects/TEST/a.jpg')) # 定义词频背景(背景) mask1 = np.array(Image.open('/Users/yuanli/PycharmProjects/TEST/timg.jpg')) # 定义词频背景(字体颜色) wc = wordcloud.WordCloud( font_path='/Users/yuanli/PycharmProjects/TEST/arial unicode ms.ttf', # 设置字体格式 mask=mask, # 设置背景图 min_font_size=6, max_words=80, # 最多显示词数 max_font_size=60 # 字体最大值 ) wc.generate_from_frequencies(word_counts) # 从字典生成词云 image_colors = wordcloud.ImageColorGenerator(mask1) # 从背景图建立颜色方案 wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案 plt.imshow(wc) # 显示词云 plt.axis('off') # 关闭坐标轴 plt.show() # 显示图像 if __name__=='__main__': clear() couldword()

 

选择大于2个字的影评进行绘制词云图:

                                                   

从词云图上可以看出这是一部青春片,讲述的应该是青少年之间的故事,很多人评价说这部剧是值得一看的,这部剧还是很有现实意义的,值得我们去影院去观看。

3.星级及点赞数

                 

通过上面两个图表,我们可以看出绝大多数的观众都给了4分及以上的星级,对于四星级的点赞数也是最高的,由此我们可以推测这部剧还是值得一看的。

4.知识点

记录csv时用‘a’的方式写入,可以不会覆盖原内容苹果电脑显示中文要用plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

 

 

最新回复(0)