分布式爬虫Scrapy-Redis
分布式爬虫是由一组通过网络进行通信、为了完成共同的爬虫任务而协调工作的计算机节点组成的系统。分布式爬虫是将多台主机组合起来,共同完成一个爬取任务,大大提高爬取效率。
调度器扩展多个,对应的下载器也扩展多个,但是保证爬取的队列是惟一的,也就是共享爬取队列。并且应该要保证,一个调度器调度一个请求以后,其他调度器不会重复调度这个请求。
Scrapy-Redis
Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件。安装如下:
pip install scrapy-redis
Scrapy-redis提供了下面四种组件(components):(四种组件意味着这四个模块都要做相应的修改)
- Scheduler(调度器)
- Duplication Filter(去重)
- Item Pipeline(管道)
- Base Spider(爬虫类)
安装reids
pip install redis
修改redis配置文件redis.windows.conf
修改 bind 127.0.0.1 为 bind 0.0.0.0 ,这样Slave端才能远程连接到Master端的Redis数据库。
测试Slave端远程连接Master端
Slave端启动redis-cli -h master端ip, -h 参数表示连接到指定主机的redis数据库 。
实现分布式步骤
Scrapy-Redis分布式的实现是较为简单的,核心步骤只需三步:
-
将爬虫主文件中继承自Scrapy中的scrapy.Spider 或 CrawlSpider 替换成 Scrapy-Redis的 RedisSpider 或 RedisCrawlSpider。
-
初始的start_urls改为redis_key。
-
在settings.py文件中修改Scrapy自带的调度器类和去重类为Scrapy-Redis提供的类
SCHEDULER = "scrapy_redis.scheduler.Scheduler" DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER_PERSIST = True
-
在settings.py文件中配置Redis(两种方式)
- 单独配置(Scrapy-Redis优先使用)
REDIS_URL = redis://[password]@host:port
- 分开配置
# redis master端ip
REDIS_HOST = '127.0.0.1'
# redis master端的端口
REDIS_PORT = 6379
# redis master端的密码 'foobared' 是redis的默认密码
REDIS_PASSWORD = 'foobared'