运行项目

这个项目演示了在多个spiders实例之间,如何共享(share)一个爬虫spider的请求队列;

  • 第一次运行的爬虫,然后停止它:
  1. cd redis-youyuan
  2. scrapy crawl youyuan
  3. ... [youyuan] ...
  4. ^C
  • 重新运行停止的爬虫:
  1. scrapy crawl youyuan
  2. 2016-08-22 22:32:04 [youyuan] DEBUG: Resuming crawl (13 requests scheduled)
  • 启动一个或更多的scrapy爬虫:
  1. scrapy crawl youyuan
  2. ... [dmoz] DEBUG: Resuming crawl (8712 requests scheduled)

过程分析

假定有两个爬虫,那么是如何实现分布式,具体的步骤如下:

1) 首先运行爬虫A

爬虫A中start_urls push 待下载request队列、调度器从待下载request队列取出一个request,交给spider下载,spider根据定义的rules得到链接,然后把链接push到redis request队列中。

备注:待下载request队列是redis 队列实现的,也就是将生成request(url)push到queue中,(调度器)请求时pop出来。

运行项目 - 图1

2) 停止爬虫A, 重新运行爬虫A、B

爬虫 A 和 B 同时到 待下载request队列中取request任务,等待下载request完成之后,爬虫A和B 各自下载自定义的链接(比如start_urls,一般来讲,此时大部分请求连接都被去重,任务基本完成)。

备注:在scrapy-redis中 待下载request队列 默认使用的是SpiderPriorityQueue方式,这是由sorted set实现的一种非FIFO,LIFO方式。

注意

每次执行重新爬取时,应该将redis中存储的数据清空,否则会影响爬虫运行。