项目地址:https://github.com/rmax/scrapy-redis
特征
- 分布式抓取
- 您可以启动多个蜘蛛实例,它们共享一个redis队列。最适合广泛的多域抓取。
- 分布式后处理
- Scraped项目被推送到redis排队,这意味着您可以根据需要启动共享项目队列所需的后处理过程。
- Scrapy即插即用组件
- 调度程序+复制过滤器,项目管道,基础蜘蛛
用法
在项目中使用以下设置:
# 启用在redis中调度存储请求队列。 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 确保所有爬行器通过redis共享相同的副本。 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 默认的请求序列化器是pickle,但它可以更改为任何模块 # 具有加载和转储功能。注意pickle在enpython版本之间是不兼容的。 # 警告: 在python 3.x, 序列化器必须返回字符串键和supportbytes作为值。由于这个原因, # json或msgpack模块在默认情况下不能工作。在python中2。不存在这样的问题,您可以使 # 用“json”或“msgpack”作为序列化器。 #SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat" # 不清理redis队列,允许暂停/恢复抓取。 #SCHEDULER_PERSIST = True # 使用优先级队列调度请求。(默认) #SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue' # 其他队列。 #SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue' #SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue' # 最大空闲时间,以防止蜘蛛在分布式爬行时被关闭。 # 这只适用于队列类为SpiderQueue或SpiderStack时, # 而且还可能在爬行器第一次启动时阻塞相同的时间(因为队列是空的)。 #SCHEDULER_IDLE_BEFORE_CLOSE = 10 # 在redis中存储被抓取的项目,以便进行后处理。 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300 } # 项目管道序列化并将项目存储在这个redis键中。 #REDIS_ITEMS_KEY = '%(spider)s:items' # 默认情况下,条目序列化器是ScrapyJSONEncoder。您可以使用任何可导入路径到可调用对象。 #REDIS_ITEMS_SERIALIZER = 'json.dumps' # 指定连接到Redis时要使用的主机和端口(可选)。 #REDIS_HOST = 'localhost' #REDIS_PORT = 6379 # 指定用于连接的完整Redis URL(可选)。 # 如果设置了,这将优先于REDIS_HOST和REDIS_PORT设置. #REDIS_URL = 'redis://user:pass@hostname:9001' # 自定义redis客户端参数(即。:套接字超时等) #REDIS_PARAMS = {} # 使用自定义的redis客户端类。 #REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 如果为真,则使用redis' ' ' ' SPOP ' '操作。你必须使用" SADD " # 命令向redis队列添加url。如果您希望避免开始url列表中的重复,并且处理顺序无关紧要,那# 么这将非常有用。 #REDIS_START_URLS_AS_SET = False # RedisSpider和RedisCrawlSpider的默认开始url键。 #REDIS_START_URLS_KEY = '%(name)s:start_urls' # 对redis使用utf-8之外的其他编码。 #REDIS_ENCODING = 'latin1'
允许示例项目
此示例说明如何跨多个蜘蛛实例共享蜘蛛的请求队列,非常适合广泛爬取。
- 在PYTHONPATH中设置scrapy_redis包
- 首次允许爬虫然后停止
- cd 项目名称
- scrapy crawl 爬虫名
- ctrl + c # 停止
- 再次运行爬网程序以恢复停止爬网:
- scrapy crawl 爬虫名
- 启动一个或多个其他scrapy抓取工具:
- 启动一个或多个后处理工作人员:
- python process_items.py dmoz:items -v
Feeding a Spider from Redis
scrapy_redis.spiders.RedisSpider类使蜘蛛能够从redis中读取URL。redis队列中的url将一个接一个地处理,如果第一个请求产生更多请求,蜘蛛将在从redis获取另一个url之前处理这些请求。
例如,用下面的代码创建一个文件myspider.py:
from scrapy_redis.spiders import RedisSpider class MySpider(RedisSpider): name = 'myspider' def parse(self, response): # do stuff pass
然后
- 启动爬虫
- scrapy runspider myspider.py
- 将url推送到redis:
- redis-cli lpush myspider:start_urls http://google.com
提示:
这些爬行器依赖爬行器空闲信号来获取开始url,因此在您推送新url和爬行器开始抓取url之间可能有几秒钟的延迟。