项目地址: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'

允许示例项目

此示例说明如何跨多个蜘蛛实例共享蜘蛛的请求队列,非常适合广泛爬取。

  1. 在PYTHONPATH中设置scrapy_redis包
  2. 首次允许爬虫然后停止
    • cd 项目名称
    • scrapy crawl 爬虫名
    • ctrl + c # 停止
  3. 再次运行爬网程序以恢复停止爬网:
    • scrapy crawl 爬虫名
  4. 启动一个或多个其他scrapy抓取工具:
  5. 启动一个或多个后处理工作人员:
    • 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

然后

  1. 启动爬虫
    • scrapy runspider myspider.py
  2. 将url推送到redis:
    • redis-cli lpush myspider:start_urls http://google.com

提示:
这些爬行器依赖爬行器空闲信号来获取开始url,因此在您推送新url和爬行器开始抓取url之间可能有几秒钟的延迟。

发表回复