哪吒票房超复联4,100行python代码抓取豆瓣短评,看看网友怎么说

点击上方“Python爬虫与数据挖掘”,进行关注

这次是用python登录并爬取豆瓣短评,并做词云分布,分别用到requests、xpath、lxml、jieba、wordcloud等python库。

全文步骤如下:

第一步登录豆瓣

第二步爬取豆瓣短评

第三步分词处理

第四步词云展示

话不多说,开始上代码吧!

# 导入需要的库
import requests
import time
import pandas as pd
import random
from lxml import etree
from io import BytesIO
import jieba
from wordcloud import WordCloud
import numpy as np
from PIL import Image

# 为该项目创建一个类,命名nezha
# 该类有三个方法,分别是爬虫、分词、词云
class nezha():
    def __init__(self):
        # 定义session,用以加载HTML
        self.session = requests.session()
        # 定义爬虫的header,输入你浏览器上的header
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
        # 豆瓣登录网址
        self.url_login = 'https://www.douban.com/login'
        #哪吒电影短评网址,注意有改动,为了动态翻页,start后加了格式化数字,短评页面有20条数据,每页增加20条
        self.url_comment = 'https://movie.douban.com/subject/26794435/comments?start=%d&limit=20&sort=new_score&status=P'

    def scrapy_(self):
        # 加载登录界面HTML
        login_request = self.session.get(self.url_login, headers=self.headers)
        # 解析HTML
        selector = etree.HTML(login_request.content)
        # 以下是登录需要填的一些信息
        post_data = {'source': 'None',  # 不需要改动
                     'redir': 'https://www.douban.com',  # 不需要改动
                     'form_email': 'your douban account',  # 填账号
                     'form_password': 'your password',  # 填密码
                     'login': '登录'}  # 不需要改动
        # 下面是获取验证码图片的链接
        captcha_img_url = selector.xpath('//img[@id="captcha_image"]/@src')
        # 如果有验证码,获取验证码图片,并填写图片上的验证码
        if captcha_img_url != []:
            # 获取验证码图片
            pic_request = requests.get(captcha_img_url[0])
            # 打开验证码图片
            img = Image.open(BytesIO(pic_request.content))
            img.show()
            # 填写验证码
            string = input('请输入验证码:')
            post_data['captcha-solution'] = string
            # 获取验证码匹配的字符
            captcha_id = selector.xpath('//input[@name="captcha-id"]/@value')
            # 将字符放入登录信息里
            post_data['captcha-id'] = captcha_id[0]
        # 登录
        self.session.post(self.url_login, data=post_data)
        print('已登录豆瓣')

        # 下面开始抓取短评
        # 初始化4个list用于存储信息,分别存用户名,评星,时间,评论文字
        users = []
        stars = []
        times = []
        comment_texts = []
        # 抓取500条,每页20条,这也是豆瓣给的上限
        for i in range(0, 500, 20):
            # 获取HTML
            data = self.session.get(self.url_comment % i, headers=self.headers)
            # 状态200表明页面获取成功
            print('进度', i, '条', '状态是:',data.status_code)
            # 暂停0~1秒时间,防止IP被封
            time.sleep(random.random())
            # 解析HTML
            selector = etree.HTML(data.text)
            # 用xpath获取单页所有评论
            comments = selector.xpath('//div[@class="comment"]')
            # 遍历所有评论,获取详细信息
            for comment in comments:
                # 获取用户名
                user = comment.xpath('.//h3/span[2]/a/text()')[0]
                # 获取评星
                star = comment.xpath('.//h3/span[2]/span[2]/@class')[0][7:8]
                # 获取时间
                date_time = comment.xpath('.//h3/span[2]/span[3]/@title')
                # 有的时间为空,需要判断下
                if len(date_time) != 0:
                    date_time = date_time[0]
                else:
                    date_time = None
                # 获取评论文字
                comment_text = comment.xpath('.//p/span/text()')[0].strip()
                # 添加所有信息到列表,以下相同
                users.append(user)
                stars.append(star)
                times.append(date_time)
                comment_texts.append(comment_text)
        # 用字典包装
        comment_dic = {'user': users, 'star': stars, 'time': times, 'comments': comment_texts}
        comment_df = pd.DataFrame(comment_dic)  # 转换成DataFrame格式
        comment_df.to_csv('duye_comments.csv')  # 保存数据
        comment_df['comments'].to_csv('comment.csv', index=False)  # 将评论单独再保存下来,方便分词
        print(comment_df)

    def jieba_(self):
        # 打开评论数据文件
        content = open('comment.csv', 'r', encoding='utf-8').read()
        # jieba分词
        word_list = jieba.cut(content)
        # 添加自定义词,该片经典台词‘我命由我不由天’必须加进去
        with open('自定义词.txt') as f:
            jieba.load_userdict(f)
        # 新建列表,收集词语
        word = []
        # 去掉一些无意义的词和符号,我这里自己整理了停用词库
        for i in word_list:
            with open('停用词库.txt') as f:
                meaningless_file = f.read().splitlines()
                f.close()
            if i not in meaningless_file:
                word.append(i.replace(' ', ''))
        # 全局变量,方便词云使用
        global word_cloud
        # 用逗号隔开词语
        word_cloud = ','.join(word)
        print(word_cloud)

    def word_cloud_(self):
        # 打开你喜欢的词云展现背景图,这里选用哪吒电影里的图片
        cloud_mask = np.array(Image.open('nezha.jpg'))
        # 定义词云的一些属性
        wc = WordCloud(
            background_color="white",  # 背景图分割颜色为白色
            mask=cloud_mask,  # 背景图样
            max_words=300,  # 显示最大词数
            font_path='./fonts/simhei.ttf',  # 显示中文
            min_font_size=5,  # 最小尺寸
            max_font_size=100,  # 最大尺寸
            width=400  # 图幅宽度
        )
        # 使用全局变量,刚刚分出来的词
        global word_cloud
        # 词云函数
        x = wc.generate(word_cloud)
        # 生成词云图片
        image = x.to_image()
        # 展示词云图片
        image.show()
        # 保存词云图片
        wc.to_file('pic.png')

# 创建类对象
nezha = nezha()
# 抓取豆瓣短评
nezha.scrapy_()
# 使用jieba对短评进行分词
nezha.jieba_()
# 使用wordcloud展示词云
nezha.word_cloud_()

看看我们抓取到的短评:

然后对短评分词处理:

选一张喜欢的图片做词云背景:

最后,制作词云图:

可以看到几个关键词:

哪吒、故事、国漫、大圣归来、我命由我不由天、喜欢、偏见

看来,大家对这部动画的故事情节比较满意,不经意地和大圣归来作对比。让人最感动的台词是“我命由我不由天”,一部良心的国产动画,大家期待已久,怎么能让人不喜欢呢?

------------------- End -------------------

本文分享自微信公众号 - Python爬虫与数据挖掘(crawler_python)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏相约机器人

从头开始在20行代码中查找面部边缘

正在阅读一本机器学习书,并了解到边缘是机器的重要特征输入,用于了解图片中是否有物体,在这种情况下是面部。看看左边只有边缘的图,可以很容易地说出它是人眼所面孔的,...

7910
来自专栏陶士涵的菜地

[Python] 函数基本

使用def 函数名(): 来定义一个函数,函数体一缩进块的形式写,返回结果是return xx

7520
来自专栏小詹同学

骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站

我们日常浏览网站的时候,时不时会遇到些新奇的东西( 你懂的.jpg ),于是我们就默默的点了个收藏或者加书签。然而当我们面对成百上千的书签和收藏夹的时候,总会头...

8520
来自专栏机器之心

IEEE 2019编程语言排行榜出炉:趋势、开源、职位需求,Python都是第一

这是 IEEE Spectrum 的第六次年度编程语言排行统计。今年的统计进行了重大改革,一些基础指标进行了重构,而最终的排行榜也进一步得到了简化。但其基本理念...

9350
来自专栏大道七哥

使用binlog2sql针对mysql进行数据恢复

DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚。传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来...

14140
来自专栏陶士涵的菜地

[Python] 使用dict和set

使用{“key”:value}初始化dict对象,例如:d={“name”:”taoshihan”}

10530
来自专栏陶士涵的菜地

[Python] Python基础字符串

把英文字母和其他语言编码成一张Unicode编码表,一个字符两个字节 例如:中是20013

7530
来自专栏大道七哥

Linux下升级Python到3.5.2版本

本文主要介绍在Linux(CentOS)下将Python的版本升级为3.5.2的方法

35930
来自专栏用户1175783的专栏

# 基础类型

多继承在某些时候还是很有用的,所以python将多继承定义为mixin功能,字面理解为混入。

7930
来自专栏陶士涵的菜地

[javaSE] 看知乎学习反射

简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。

8720

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励