基于Scrapy框架爬取豆瓣《复联4》影评,并生成词云

  • 1. 介绍及开发环境
  • 2. 爬虫实现
    • 2.1 新建项目
    • 2.2 构造请求
    • 2.3 提取信息
    • 2.4 数据存储
    • 2.4 运行结果
  • 3. 生成词云
    • 3.1 数据处理
    • 3.2 词云生成
    • 3.3 运行结果

1. 介绍及开发环境

Python爬虫及数据分析的初学者,最近在学习崔庆才的《Python3网络爬虫开发实战》,试着写了一个小Demo,通过Scrapy框架爬取豆瓣电影影评(以《复联4》为例),并通过WordCloud生成词云。
       开发环境为python + Pycharm,需要安装Scrapy、pymysql以及WordCloud库。

2. 爬虫实现

2.1 新建项目

首先新建项目,名为ScrapySeleniumTest,命令如下:

scrapy startproject ScrapyAvengers

在该项目下新建爬虫,命令如下:

scrapy genspider avengers movie.douban.com

新建项目完成之后可以看到项目的目录结构如下:

在settings.py中修改配置文件:

ROBOTSTXT_OBEY = False

2.2 构造请求

爬取的URL地址为:https://movie.douban.com/subject/26100958/comments?start=0&limit=20&sort=new_score&status=P ,点击后页,发现URL地址变为:https://movie.douban.com/subject/26100958/comments?start=20&limit=20&sort=new_score&status=P 。对比可以发现,只有start参数的发生了变化,所以可以通过改变start参数来改变请求。
       在avenger.py添加start_requests()函数,代码如下:

def start_requests(self):base_url = 'https://movie.douban.com/subject/26100958/comments?'data = {'limit': 20, 'sort': 'new_score', 'status': 'P', 'start': 0}url = base_url + urlencode(data)yield Request(url=url, callback=self.parse)for page in range(0, self.settings.get('MAX_PAGE') + 1):data['start'] = page * 20parmas = urlencode(data)url = base_url + parmasyield Request(url, callback=self.parse)

2.3 提取信息

首先在items.py中定义一个item,叫作CommentsItem,如下所示:

class CommentsItem(scrapy.Item):table = 'AvengersComments'  # 存储在mysql中的数据表名name= scrapy.Field()  # 用户名stars = scrapy.Field()  # 打分:五星为力荐、四星为推荐、三星为还行、两星为较差、一星为很差votes = scrapy.Field()  # 赞同数short = scrapy.Field()  # 用户短评time = scrapy.Field()  # 评论时间

在这里我们定义了4个字段,包括评论的用户名、打分、赞同数、评论内容以及评论时间。另外还有table,代表MySQL存储的表名称。
       根据URL获取网页源码后,通过CSS选择器其来提取信息。
       在avenger.py重写parse()方法,代码如下:

 def parse(self, response):items = response.css('.comment-item')for item in items:comment = CommentsItem()name = str(item.css('.comment-item .comment .comment-info a::text').extract_first())comment['name'] = name.strip()stars = str(item.css('.comment .comment-info .rating::attr(title)').extract_first())stars = stars.strip()dic = {'力荐': 5, '推荐': 4, '还行': 3, '较差': '2', '很差': 1}  # 将打分转化为评分comment['stars'] = dic[stars]comment['votes'] = int(item.css('.comment .comment-vote .votes::text').extract_first())short = str(item.css('.comment .short::text').extract_first())short = short.replace('\n', ',')comment['short'] = shorttime = str(item.css('.comment .comment-info .comment-time::text').extract_first())time = time.replace(' ', '')time = time.replace('\n', '')comment['time'] = timeyield comment

2.4 数据存储

将读取的数据保存在MySQL数据库中,在pipelines.py文件中添加类MySQLPipeline(),代码如下:

class MySQLPipeline():def __init__(self, host, database, user, password, port):self.host = hostself.database = databaseself.user = userself.password = passwordself.port = port@classmethoddef from_crawler(cls, crawler):return cls(host=crawler.settings.get('MYSQL_HOST'),database=crawler.settings.get('MYSQL_DATABASE'),user=crawler.settings.get('MYSQL_USER'),password=crawler.settings.get('MYSQL_PASSWORD'),port=crawler.settings.get('MYSQL_PORT'),)def open_spider(self, spider):self.db = pymysql.connect(self.host, self.user, self.password, self.database, charset='utf8mb4', port=self.port)self.cursor = self.db.cursor()def close_spider(self, spider):self.db.close()def process_item(self, item, spider):data = dict(item)keys = ', '.join(data.keys())values = ', '.join(['%s'] * len(data))sql = 'insert into %s (%s) values (%s)' % (item.table, keys, values)self.cursor.execute(sql, tuple(data.values()))self.db.commit()return item

最后在settings.py中添加配置信息:

MAX_PAGE = 30MYSQL_HOST = '数据库地址'
MYSQL_DATABASE = 'Avengers'
MYSQL_USER = '用户名'
MYSQL_PASSWORD = '密码'
MYSQL_PORT = 3306DEFAULT_REQUEST_HEADERS = {'Host': 'movie.douban.com','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:67.0) Gecko/20100101 Firefox/67.0','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding': 'gzip, deflate, brr','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive'
}

2.4 运行结果

新建一个entry.py文件,内容如下:

from scrapy import cmdlinecmdline.execute(['scrapy', 'crawl', 'avengers'])

执行该文件,查看数据库,可以看到影评信息已经爬取完成:

3. 生成词云

3.1 数据处理

从数据库中读取所有评论数据,并用’ , '连接,使用jieba进行分词,代码如下:

# 连接数据库
db = pymysql.connect(host='1数据库地址', user='用户名', password='密码', port=3306, db='数据库名')
cursor = db.cursor()
sql = 'SELECT short from AvengersComments'
cursor.execute(sql)# 获取文本,用","连接
data = cursor.fetchall()
text = ''.join(str(data))# 添加自定义词语
addword = open('addword.txt', encoding='utf-8').read()
addwords = addword.split(' ')
for word in addwords:jieba.add_word(word)# 屏蔽无意义词语
stop_path = 'stopwords.txt'
stopword = open('stopwords.txt', encoding='utf-8').read()
stopword = stopword.replace('\n', ' ')
stopwords = stopword.split(' ')
for word in stopwords:STOPWORDS.add(word)

其中addword.txt是自定义的词典,将例如惊奇队长、钢铁侠之类的词语加入到分词的结果之中。stopwords.txt是停用词词典,用来屏蔽一些无意义的词语,例如“今天”、“那时”等等。

3.2 词云生成

通过WordCloud库生成词云,simfang.ttf为必要的字体库,代码如下:

    font_path = 'simfang.ttf'words = jieba.cut(text, cut_all=True)result = " ".join(words)wordcloud = WordCloud(background_color="white", width=1000, height=860, font_path=font_path, stopwords=stopwords).generate(result)plt.imshow(wordcloud)plt.axis("off")plt.show()

3.3 运行结果

运行结果如下图所示,其中,字号越大,代表出现的频率越高:

基于Scrapy框架爬取豆瓣《复联4》影评,并生成词云相关推荐

  1. scrapy获取a标签的连接_python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求[前期准备] 2.分析及代码实现(1)获取五大板块详情页url(2)解析每个板块(3)解析每个模块里的标题中详情页信息 点击此处,获取 ...

  2. 19. python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求 [前期准备] 2.分析及代码实现 (1)获取五大板块详情页url (2)解析每个板块 (3)解析每个模块里的标题中详情页信息 1.需 ...

  3. 14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容

    python爬虫--基于scrapy框架爬取糗事百科上的段子内容 1.需求 2.分析及实现 3.实现效果 4.进行持久化存储 (1)基于终端指令 (2)基于管道 [前置知识]python爬虫--scr ...

  4. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  5. 爬取qq音乐的评论并生成词云——以《听妈妈的话》为例

    爬取qq音乐的评论并生成词云 我们选取的是歌曲的周杰伦的 听妈妈的话 先看效果图 首先,我们进去qq音乐找到这首歌 网易云出来挨打 https://y.qq.com/n/yqq/song/002hXD ...

  6. 用Scrapy框架爬取豆瓣电影,构建豆瓣电影预测评分模型

    文章目录 前言 一.Scrapy爬虫爬取豆瓣电影 1. Scrapy框架介绍 (1) Scrapy框架构造: (2) 数据流 (3) 项目结构 2. 创建爬虫爬取豆瓣 (1)创建项目 (2) 创建It ...

  7. 03_使用scrapy框架爬取豆瓣电影TOP250

    前言: 本次项目是使用scrapy框架,爬取豆瓣电影TOP250的相关信息.其中涉及到代理IP,随机UA代理,最后将得到的数据保存到mongoDB中.本次爬取的内容实则不难.主要是熟悉scrapy相关 ...

  8. 爬虫项目实操三、用scrapy框架爬取豆瓣读书Top250的书名,出版信息和评分

    安装方法:Windows:在终端输入命令:pip install scrapy:mac:在终端输入命令:pip3 install scrapy,按下enter键,再输入cd Python,就能跳转到P ...

  9. python爬取豆瓣评论,并制作成词云

    一.爬取豆瓣热评 该程序进行爬取豆瓣热评,将爬取的评论(json文件)保存到与该python文件同一级目录下 注意需要下载这几个库:requests.lxml.json.time import req ...

最新文章

  1. 字体大小的设置_ios 设置的字体大小与实际的字体大小不一致
  2. 互联网亿级日志实时分析平台,一个码农半小时就可以搞定,只因ELK
  3. 团队作业9——第二次项目冲刺2(Beta阶段)
  4. badboy录制乱码_Badboy 录制脚本参数化和回放
  5. eclipse编辑器未包含main类型_Shopify模版编辑器问题排查及解决办法汇总
  6. 有没有一些细分IT行业,没有35岁现象
  7. 3.修改和编译XposedBridge.jar 和 api.jar
  8. 游戏目标的三个核心组成部分
  9. 计算机鼠标左右键作用,win7电脑鼠标右键有什么功能和作用
  10. php架构师都会有什么面试题,PHP架构师面试题目和答案
  11. java安装后为什么是英文_java用到英语多吗
  12. pb 如何导出csv_打开CSV格式文件?英雄请留步
  13. 【EasyClick iOS免越狱常见问题】iPhone重启后无法启动代理程序
  14. 嘉立创EDA原理图封装画错了怎么办
  15. Rplidar 报错提示:Error, operation time out. RESULT_OPERATION_TIMEOUT!
  16. 【博学谷学习记录】超强总结,用心分享|大数据之Hive
  17. 复旦情商课魅力女教师陈果上课语录(复制)
  18. 关于利用入门JAVA制作简易RPG
  19. 二战前线2 (commando2) flash 修改
  20. 【尖端干货】星域CDN极速高清技术详解

热门文章

  1. Python的异步编程介绍(MD)
  2. 6-1 调用函数打印闰年 (15 分)
  3. 谷歌八年算法工程师分享几点算法学习小技巧
  4. iOS StoreKit 2 新特性解析
  5. 关于十六进制、asc码
  6. [CTSC2016]时空旅行(线段树+凸包)
  7. cannot import name ‘gcd’ from ‘fractions’
  8. 如何检查DirectX的版本(用于Windows Phone Developer Tools的安装检查)
  9. layui表头宽度和表格一致_layui表格固定表头统一处理方案
  10. echat3没有数据的时候,如何设置文字提示:“没有数据”