程序说明
一.功能介绍
电影已经成为当今社会人情世故的载体,为了了解当今社会中人民普遍更喜欢哪些电影,本程序旨在用爬虫爬取数据后,经过数据清洗,放入MySQL中,再通过一些数据分析方法,得到我们想要的结果。
本程序选取的网站是豆瓣,因为权威,而且该网站目前比较受欢迎、资源丰富,可信度高,最重要的是,所需的网址规律易于寻找,用来当例子再适合不过。
此外,还做了数据可视化处理。使用json、pandas、matplotlib、wordcloud、jieba这些库做出柱状图和词云图,这些都可以帮助我们分析处哪些电影更受欢迎。
二.程序介绍
(我使用的是pycharm编辑器)
(一)scrapy框架的使用
(1)首先,打开编辑器,新建项目。
建出来是这个样子的。
没有venv这玩意儿,项目和虚拟环境岂能混为一谈。这一步就错的人得好好反省。主要是我在期末周改过的代码中,好多代码都是第一步就错了,给我整的。
(2)先在pycharm编辑器中下载scrapy库
我介绍两种方法:
- File -- > settings -- > Project -- > Python interpreter
然后Package上面有一个加号,点进去,然后找个网络好点的地方, 输入库名scrapy,再点install就ok了。
- 第二种,点最下方的Terminal
就是这个样子。
输入pip install scrapy ,当然也可以加镜像源,那样更快一点,最重要的还是找个网络好一点的地方。
(3)在Terminal中进行以下操作
第一,输入scrapy,进入其中,看看有哪些操作,不出意外是这样:
第二,用scrapy startproject + 工程名来创建我们的工程,如图:
**第三,**它都提醒你了,返回上一级,如图:
当然了,这里也可以写cd.. 这样更方便,还不用记工程名是啥。
第四,打开我们的网站,复制一下网址。
因为我们要用scrapy genspider + 项目名 + 网址
然后,我们不是要运行它嘛,用的是scrapy crawl + 项目名。
至此,创建工作完成。
(4)在工程项目下创建一个main.py文件,写入调试语句,此文件为调试文件。
(5)此时scrapy框架中已经创建好了一个以"工程名"命名的主程序文件,在此处进行数据爬取。
要是没错,应该是这样的。(这张图是我从自己的另一篇文章里面复制过来的)
(6)在settings.py文件中取消对优先级的注释,再将robots协议中的True改为False
(7)在pipelines.py文件中进行数据存储。
(二)确定爬取的信息
本程序爬取的字段是电影名称、导演、评分、简介。
在items.py文件中写入这些字段,如下图:
python
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
movie_name = scrapy.Field()
director = scrapy.Field()
score = scrapy.Field()
desc = scrapy.Field()
(三)爬虫文件的编写
(1)确定爬取网站的时候,应该先研究其每一页的网址规律。
由此图可以看出,该网站每一页的网址的规律仅仅是数字在变化,所以可以得出其网址规律:
python
page_url = "https://movie.douban.com/top250?start={}&filter=".format(page_num * 25)
(2)先爬取包含电影名字、导演、评分、简介的总资源,这里提取数据用的是xpath方法。
经过"检查"并"选择",可以写出以下代码:
python
node_list = response.xpath('//div[@class = "info"]')
接下来用for循环语句从node_list中逐个提取出我们想要的信息。
python
for node in node_list:
movie_name = node.xpath('.//div[@class = "hd"]/a/span/text()').get()
director = node.xpath('.//div[@class = "bd"]/p/text()').get().strip()
score = node.xpath('.//span[@class = "rating_num"]/text()').get()
description = node.xpath('.//p[@class = "quote"]/span/text()').get()
之后,将其存储在字典中。
python
item = {}
item['movie_name'] = movie_name
item['director'] = director
item['score'] = score
item['description'] = description
然后使用生成器关键字yield对获取的小说网址进行访问,可以来个控制爬取页数的操作。
python
yield item
page_num += 1
if page_num <= 2:
page_url = "https://movie.douban.com/top250?start={}&filter=".format(page_num * 25)
yield scrapy.Request(page_url,callback=self.parse)
else:
return
我分成两部分写,有点多。