从这一章开始,咱们便进入了一个新的模块——scrapy模块,可以说,这是一个爬虫的框架,有了它,能给爬虫带来很大的方便,让它运行更快更强。我们只需要实现少量的代码,就能够快速的抓取数据。
一、Scrapy工作流程二、Scrapy基本操作
一、Scrapy工作流程
Scrapy使用了异步网络框架,可以加快我们的下载速度。
这是异步和同步的区别:
同步,容易造成程序阻塞;异步,则不会出现程序阻塞的情况。这是之前的爬虫流程:
另外一种爬虫方式:
这是Scrapy的爬虫流程:
下面对Scrapy流程的关键部分进行介绍:
部件 | 作用 | 是否需要手写 |
Scrapy engine(引擎) | 总指挥:负责数据和信号的在不同模块间的传递 | scrapy已经实现 |
Scheduler(调度器) | 一个队列,存放引擎发过来的request请求 | scrapy已经实现 |
Downloader(下载器) | 下载把引擎发过来的requests请求,并返回给引擎 | scrapy已经实现 |
Spider(爬虫) | 处理引擎发来的response,提取数据,提取url,并交给引擎 | 需要手写 |
Item Pipline(管道) | 处理引擎传过来的数据,比如存储 | 需要手写 |
Downloader Middlewares(下载中间件) | 可以自定义的下载扩展,比如设置代理 | 一般不用手写 |
Spider Middlewares(中间件) | 可以自定义requests请求和进行response过滤 | 一般不用手写 |
二、Scrapy基本操作
1.基本步骤
(1)咱们先创建一个Scrapy项目
scrapy startproject mySpider # 创建一个名为mySpider的文件
(2)生成一个爬虫
# demo是爬虫名,demo.cn是爬虫的初始网站
scrapy genspider demo demo.cn
(3)提取数据:完善spider,使用xpath等
(4)保存数据:pipeline中保存数据
2.Scrapy运行
在命令中运行爬虫:
scrapy crawl qb # qb爬虫的名字
在pycharm中运行爬虫(这里要在start文件中运行,与以往不同):
from scrapy import cmdline
cmdline.execute("scrapy crawl qb".split())
3.创建Scrapy新项目
3.1 先在pycharm的terminal终端创建爬虫文件
可以看到创建后,有提示:
你能开始你的第一个爬虫用:
cd mySpider # 进入scrapy爬虫项目
scrapy genspider example example.com # example是爬虫项目名字,example.com是爬取的网站如果想在别的文件夹下创建,直接用cd 文件夹路径即可
可以发现,在创建后,出现了新的文件夹mySpider以及一些py文件、配置文件。
3.2 创建爬虫新项目
如我们要爬取豆瓣,就创建一个名为db的爬虫项目
发现又多了一个db.py文件
此时要运行,要通过terminal终端输入:scrapy crawl db
运行结果如下:
可以看到,结果太多了,那么有没有什么方法来消除这些结果,只显示我们想要的呢?这里要到setting设置文件中,加入LOG_LEVEL = ‘WARNING’,加上以后,表示log信息要在出现警告、错误的时候才会出现。
在爬虫文件db中,代码显示如下:
先定义了类,其中第一个参数是爬虫名,第二个参数是允许爬取的网站范围,第三个参数是起始的url(其中的url是可以修改的,根据自己的需求而定);定义了一个解析函数,可以在其中写入爬虫的解析方法,数据获取。这些方法,咱们之前都介绍过。
如要爬取正在热映的电影名称,可以在解析函数parse()下写逻辑:
def parse(self, response):
# 找正在热映的电影信息
print("="*50)
movie_list = response.xpath("//div[@class='movie-list list']/ul/li/div[@class='title']")
print movie_list
结果如下:
现在要把其中的名称提取出来,可以通过遍历来实现:
# 定义字典
item = {}
for movie in movie_list:
item['name'] = movie.xpath("a/text()").extract_first()
# extract_first() 是从中得到文本的数据(去掉了标签)
if item['name'] == None:
item['name'] = movie.xpath("a/text()").extract_first()
print(item)
结果如下:
3.3 运行爬虫新项目的另一种方式
咱们可以在myspider文件夹下新建一个start.py文件,中间写上几条代码:
之后,直接在start.py文件中右键run即可运行程序。
这样运行,跟第一种方法(terminal终端运行)也能达到同样的效果。大家可以从中选择一种自己喜欢的方式取运行scrapy,我个人觉得第二种方法更加方便。
3.4 实现数据的传递
在scrapy中,之前说过,数据是通过pipeline传递,在咱们的pipeline文件中,已经有了提示:Don’t forget to add your pipeline to the ITEM_PIPELINES setting,因此要在setting文件中,要记得把管道相关注释打开,数据才能传递。
管道可以有多个,这里的300是指数据传递的优先级,默认从300开始,数字越大,优先级越往后;数字越小,优先级越高。
还要注意,**在爬虫文件db中,返回数据要用yield,而不是return。**这是一种资源优化问题。yield能实现要几个数就取几个数,且不占用内存。
今天咱们简单介绍了scrapy框架的一些功能,并简单爬取了豆瓣的热映电影。在后面的章节,将会继续深入介绍scrapy爬虫框架。