《少年的你》值得看吗?用Python分析豆瓣影评

《少年的你》值得看吗?用Python爬取和分析豆瓣影评

周末朋友圈最热的四个字—《少年的你》。
Alt

不仅是因为周冬雨和首登大荧幕的易烊千玺,也是因为我们每个人都经历过少年时期。
更是因为我们都直接或间接目睹过校园欺凌,有人选择了挺身而出,但更多人选择过被迫的沉默。

这个叫陈念的女孩,瘦小、平凡,长着一张被霸凌者认定“不怎么好看”的脸。
Alt

小北自觉承担起了保护陈念的责任:
默默跟随着送她上下学、为她威胁施暴却没受到惩罚的女同学……
Alt
以至于再后来小北私自决定承担起一切,执意要给陈念最好的结局。

| 简 介

这几天的朋友圈一直在强烈推荐《少年的你》,由于周末和朋友玩德州扑克,没有及时去刷一下。
今天中午心痒痒去看了豆瓣影评,发现大家真的很爱这个电影,不仅是因为周冬雨和首登大荧幕的易烊千玺,更是因为我们每个人都经历过少年时期。里面的评价中或多或少提及自己的经历,让人越看越感动,一时手痒,所以准备爬一下豆瓣上的影评。

整个项目其实很简单,继续三步走:

  • 爬取数据
  • 清理数据
  • 生成词云图

我使用的python版本是3.7

| 爬取数据

我们先打开影评页面,点进去详细看:
首页:
https://movie.douban.com/subject/26363254/comments?start=0&limit=20&sort=new_score&status=P
第一页:
https://movie.douban.com/subject/26363254/comments?start=20&limit=20&sort=new_score&status=P
第二页:
https://movie.douban.com/subject/26363254/comments?start=40&limit=20&sort=new_score&status=P

观察影评页面URL的结构可以看到,影评页面的基本结构是一致的,后面的limit=20限制的页面影评的显示数量,只需要通过调整start=X,X的值来调整爬取的页面。接下来,我们之间获取我们需要的网页:
查看网页源码:
Alt
或者直接

import requests
url =requests.get("https://movie.douban.com/subject/30166972/comments?start=0&limit=20")
html = r.url

我们能够知道评论内容的具体位置,接下来直接来找我们需要的评论内容就可以啦~
从上面的源码可以知道,我们需要找到class=”mod-bd”的div标签,将获取的网页内容转化为我们需要查到的对象,然后在解析出需要的内容:
通过BeautifulSoup库非常容易实现:

import requests
url =requests.get("https://movie.douban.com/subject/30166972/comments?start=0&limit=20")
html = r.url

comment = BeautifulSoup(html, "html.parser") 
comments_secect = comment .find("div", "mod-bd")

我们已经匹配出我们需要的主体内容,由于这里需要的comment,所以只需要选择这部分文字内容,这里直接通过find_all()方法找到div内所有的class=“”的p标签。

comments_list = comments_secect.find_all("p", "")
print(comments_list)

豆瓣影评内容非常多,我们需要设计一个循环来爬取多个页面的数据,因为我们前面已经找到每一页的规律,所以按照start=X按照20来递增就可以获得所有评论信息。
在爬取过多次后发现豆瓣设置了权限,比如如果不登录就只能查看前20页的评论数据,所以还需要模拟登陆你的豆瓣账号,另外当你爬取的信息超过一定量后可能需要你输入验证信息。权限问题可以通过scrapy来登陆豆瓣账号:

def post_login(self,response):
    sel = Selector(response)
    nodes = sel.xpath("//*[@class='captcha_image']/@src").extract()
    if nodes :           
        print nodes
        xerf = raw_input()
        return scrapy.FormRequest.from_response(
                                                response,
                                                formdata={
                                                          'captcha-solution': xerf,
                                                          'form_email': '*************',
                                                          'form_password': '*************'  
                                                },
                                                callback=self.after_login
                                                ) #这里需要输入你的账号密码

    return scrapy.FormRequest.from_response(
            response,
            formdata={'form_email': '*************',
                      'form_password': '*************'  
                    },
            callback=self.after_login
    )

| 清理数据

通过上面两部分,我们就可以获得具体的评论内容了,获取文字评论后,我们需要对数据进行清洗,剔除无效信息的干扰,
首先将多余的标点剔除:

comments = ''
for k in range(len(eachCommentList)):
    comments = comments + (str(eachCommentList[k])).strip()

pattern = re.compile(r'[\u4e00-\u9fa5]+')
filterdata = re.findall(pattern, comments)
cleaned_comments = ''.join(filterdata)

因为我们直接爬取下来的信息是评论的句子,所以需要先将其分词,jieba分词库非常好用:

comments = jieba.lcut(comment)
words = " ".join(comments)

如果不想在某些词在词云展示里出现,那你可以直接提出这些肯定会出现的词,比如少年,冬雨,四字弟弟等。

| 生成词云图

当你获取你想要的内容后,你可以分析的内容有很多,比如大家的对于《你的少年》情绪是怎么样的,或者大家对这部电影提及最多的是谁,或者大家对校园霸凌的态度。

词云的本质是对文本中的词进行词云统计,根据出现频率的多少来按比例展示大小

生产词云的原理
1.计算每个词在文本中出现的频率,生成一个哈希表
2.根据词频的数值按比例生成一个图片的布局
3.将词按对应的词频在词云布局图上生成图片
4.完成词云上各词的着色,默认是随机着色

"talk is cheap,show you the code"

from wordcloud import WordCloud
from imageio import imread
from matplotlib import pyplot as plt
#读取背景图片
jpg = imread('mask2.jpg')
#生成词云
wordcloud = WordCloud(
    mask = jpg,
    background_color="white",
    font_path='simhei.ttf',  
    width = 1500,
    height = 960,
    margin = 10
).generate(words)

#绘制图片
plt.imshow(wordcloud)
#去除坐标轴
plt.axis("off")
plt.show()

词云的形状可以直接通过jpg = imread(‘mask2.jpg’)来设置。
一起看一下结果:
Alt
“你保护世界,我保护你”

那是一种理想主义的浪漫,从最深的绝望中开出的花朵。
Alt

| 作者Info:

【作者】:A字头
【原创公众号】:数据札记倌(Data_Groom)
【简介】:这是一个坚持原创的技术公众号,每天坚持推送各种 Python基础/进阶文章,数据分析,爬虫实战,机器学习算法,不定期分享各类学习资源。
【福利】:送你新人大礼包一份,关注微信公众号,后台回复:“CSDN” 即可获取!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值