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

最近在微博热搜上看了很多关于《少年的你》的信息,上映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个字的影评进行绘制词云图:

                                                   python爬取《少年的你》影评分析_第1张图片

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

3.星级及点赞数

python爬取《少年的你》影评分析_第2张图片                 python爬取《少年的你》影评分析_第3张图片

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

4.知识点

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

 

 

你可能感兴趣的:(Python)