1.启动Redis
在CMD中cd进入存放Redis.exe的文件夹,并运行:
redis-server.exe
2.爬虫代码的写法
安装
pip install scrapy-redis
不用分布式的话爬虫代码是继承自scrapy.Spider这个父类。这是Scrapy里面最基本的一个爬虫类,只能实现基本的爬虫功能,使用分步式需要把它替换掉,从而实现更高级的功能。
下面是爬虫代码的写法,
from scrapy_redis.spiders import RedisSpider
class ReadColorSpider(RedisSpider):
name = "readcolorspider"
redis_key = 'readcolorspider:start_urls'
可以看出,这里爬虫的父类已经改成了RedisSpider,同时多了一个
redis_key = 'readcolorspider:start_urls'
其实redis_key实际上就是一个变量名,之后爬虫爬到的所有URL都会保存到Redis中这个名为“readcolorspider:start_urls”的列表下面,爬虫同时也会从这个列表中读取后续页面的URL。这个变量名可以任意修改。
除了这两点以外,在爬虫部分的其他代码都不需要做修改。
分布式爬虫就是使用多台服务器爬取同一个队列,现在只是实现简单分布式配置,然而还需要多态机器一同工作。
3.修改setting.py的配置
(1)Scheduler调度员
首先是Scheduler的替换,这个东西是Scrapy中的调度员。在settings.py中添加以下代码:
# Enables scheduling storing requests queue in redis.
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
(2)去重
# Ensure all spiders share same duplicates filter through redis.
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
(3)不清理redis队列
# Don't cleanup redis queues, allows to pause/resume crawls.
SCHEDULER_PERSIST = True
如果这一项为True,那么在Redis中的URL不会被Scrapy_redis清理掉,这样的好处是:爬虫停止了再重新启动,它会从上次暂停的地方开始继续爬取。但是它的弊端也很明显,如果有多个爬虫都要从这里读取URL,需要另外写一段代码来防止重复爬取。
如果设置成了False,那么Scrapy_redis每一次读取了URL以后,就会把这个URL给删除。这样的好处是:多个服务器的爬虫不会拿到同一个URL,也就不会重复爬取。但弊端是:爬虫暂停以后再重新启动,它会重新开始爬。
4.爬虫请求的调度算法
(1)队列
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'
如果不配置调度算法,默认就会使用这种方式。它实现了一个先入先出的队列,先放进Redis的请求会优先爬取。
(2)栈
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'
这种方式,后放入到Redis的请求会优先爬取。
(3)优先级队列
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderPriorityQueue’
5.host和port
Redis信息,如果不配置的话,Scrapy_redis会默认Redis就运行在现在这台电脑上,IP和端口也都是默认的127.0.0.1和6379。如果Redis不在本地的话,就需要将它们写出来:
REDIS_HOST = '127.0.0.1' #修改为Redis的实际IP地址
REDIS_PORT = 6379 #修改为Redis的实际端口