博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scrapy-redis
阅读量:6464 次
发布时间:2019-06-23

本文共 2372 字,大约阅读时间需要 7 分钟。

由于Scrapy本身是不支持分布式的,故引入Scrapy-redis组件,Scrapy-redis替换掉Scrapy的调度器,从而把rquests放入redis队列,将Scrapy从单台机器扩展到多台机器,实现较大规模的爬虫集群。

img_ac2372dcb17634f27ba16bd268d8a0e0.png
Scrapy-redis.png

Scrapy-Redis

Scrapy的Redis组件.

文档: .

特点

  • 分布式抓取
    你可以启动多个蜘蛛实例共享一个单一的redis队列。最适合广泛的多域抓取。
  • 分布式处理
    把项目被推到一个redis排队意味着你可以开始需要处理多进程共享的项目队列。
  • Scrapy即插即用的组件
    调度程序+复制过滤器,项目管道,基蜘蛛。

要求

  • Python2.7,3.4 or 3.5
  • Redis >= 2.8
  • Scrapy >=1.1
  • redis-py >= 2.10

用法

在你的项目使用以下设置
# 允许在redis中存储请求队列.SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 确保所有的蜘蛛通过redis共享相同的重复过滤器.DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#警告:在Python 3 x中,序列化程序必须返回字符串键和支持。#字节作为值。因为这个原因,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_ITEMS_KEY = '%(spider)s:items'#该项目是默认的序列化程序ScrapyJSONEncoder 你可以用任何一个可调用对象的重要路径#REDIS_ITEMS_SERIALIZER = 'json.dumps'# 在连接到Redis时指定要使用的主机和端口(可选#REDIS_HOST = 'localhost'#REDIS_PORT = 6379# 为连接指定完整的Redis URL(可选).#如果设置,这将优先于REDIS主机和REDIS端口设置。#REDIS_URL = 'redis://user:pass@hostname:9001'# 定制的redis客户端参数(例如:套接字超时等。)#REDIS_PARAMS  = {}# 使用定制的redis客户端类.#REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'#如果是真的,它使用redis的` ` SPOP ` `操作。你必须使用` ` Sadd ` `#命令添加URL到redis队列。如果你有这个可能有用#要避免重复在您的起始URL列表和顺序处理无所谓。#REDIS_START_URLS_AS_SET = False# 用于redis蛛和re椎间盘爬行器的默认启动url键#REDIS_START_URLS_KEY = '%(name)s:start_urls'#为redis使用其他编码,而不是使用utf-8#REDIS_ENCODING = 'latin1'

注意:

3.0版本修改了从编组到cPickle的请求序列化,因此,使用版本2.0的请求无法使用3.0

运行示例项目

这个例子说明了如何在多个爬虫实例之间共享一个爬虫请求队列,这非常适合广泛的爬虫。

类RedisSpider。redis爬虫能够从redis读取url。redis队列中的url将依次处理,如果第一个请求产生更多请求,那么爬虫处理这些请求,然后从redis获取另一个url。

例如,创建一个文件myspider。下面的代码

from scrapy_redis.spiders import RedisSpiderclass 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且爬虫开始爬行时,它可能会有几秒钟的延迟

转载地址:http://rnezo.baihongyu.com/

你可能感兴趣的文章
ps证件照快速换背景方法
查看>>
服务器CPU使用率过高的处理
查看>>
mysql 数据库 知识体系
查看>>
错误: 必须限制口令文件读取访问: /usr/local/jdk1.6/jre/lib/management/snmp.acl
查看>>
1----apache工作流程和报文详解
查看>>
Web调用安卓,苹果手机摄像头,本地图片和文件
查看>>
WindowsXP VOL,VLK,FPP,RTM的含义
查看>>
在Mac系统中遇到.DS_Store 文件怎么彻底删除
查看>>
centos下搭建svn+apache服务器
查看>>
电脑爱好者GHOSTWIN7纯净版V3.0
查看>>
ORA-00119,ORA-00130问题处理
查看>>
Win8 Metro(C#)数字图像处理--2.44图像油画效果算法
查看>>
XEN 虚拟机安装
查看>>
gradle教程学习笔记(二)
查看>>
腾讯云新购主机怎么添加数据盘
查看>>
python升级导致yum不可用 “ No module named yum”
查看>>
JJavaScript框架——什么是react
查看>>
深入了解passive-interface
查看>>
mac 部署python环境
查看>>
【Linux系统】部分基础命令手册
查看>>