Scrapy-redis

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 由于Scrapy本身是不支持分布式的,故引入Scrapy-redis组件,Scrapy-redis替换掉Scrapy的调度器,从而把rquests放入redis队列,将Scrapy从单台机器扩展到多台机器,实现较大规模的爬虫集群。

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


img_ac2372dcb17634f27ba16bd268d8a0e0.png
Scrapy-redis.png

Scrapy-Redis

Scrapy的Redis组件.

文档: https://scrapy-redis.readthedocs.org.

特点

  • 分布式抓取
    你可以启动多个蜘蛛实例共享一个单一的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 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且爬虫开始爬行时,它可能会有几秒钟的延迟

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
数据采集 存储 NoSQL
Redis 与 Scrapy:无缝集成的分布式爬虫技术
Redis 与 Scrapy:无缝集成的分布式爬虫技术
|
数据采集 存储 云安全
在阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis
Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取。但是当我们要爬取的页面非常多的时候,单个服务器的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求的并发数),这时候分布式爬虫的优势就显现出来。 而Scrapy-Redis则是一个基于Redis的Scrapy分布式组件。它利用Redis对用于爬取的请求(Requests)进行存储和调度(Schedule),并对爬取产生的项目(items)存储以供后续处理使用。scrapy-redi重写了scrapy一些比较关键的代码,将scrapy变成一个可以在多个主机上同时运行的分布式爬虫。
在阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis
|
数据采集 存储 Web App开发
阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis将任务队列push进redis
Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取。
1088 0
阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis将任务队列push进redis
|
数据采集 NoSQL 数据库
分布式爬虫scrapy+redis入门
利用分布式爬虫scrapy+redis爬取伯乐在线网站,网站网址:http://blog.jobbole.com/all-posts/ 后文中详情写了整个工程的流程,即时是新手按照指导走也能使程序成功运行。
1680 0
|
NoSQL Redis Python
scrapy中scrapy_redis分布式内置pipeline源码及其工作原理
scrapy_redis分布式实现了一套自己的组件,其中也提供了Redis数据存储的数据管道,位于scrapy_redis.pipelines,这篇文章主要分析器源码及其工作流程,源码如下: from scrapy.
2295 0
|
数据采集 NoSQL Redis
Scrapy框架-分布式爬虫实现及scrapy_redis使用
scrapy是不支持分布式的。分布式爬虫应该是在多台服务器(A B C服务器),他们不会重复交叉爬取(需要用到状态管理器)。 有主从之分的分布式结构图 重点 一、我的机器是Linux系统或者是MacOSX系统,不是Windows 二、区别,事实上,分布式爬虫有几个不同的需求,会导致结构不一样,我举个例子: 1、我需要多台机器同时爬取目标url并且同时从url中抽取数据,N台机器做一模一样的事,通过redis来调度、中转,也就是说它根本没有主机从机之分。
2618 0
|
数据采集 NoSQL Redis
scrapy-redis学习记录(一)
最近在搞爬虫,总听说scrapy多么多么强大,个人认为初学者先自己去理解爬虫的几个重要的点,手动去写爬虫,等到熟悉过后觉得没有提升了再去看框架之类的东西。
1198 0
|
Web App开发 JSON 数据格式
scrapy-redis 和 scrapy-splash结合 做分布式渲染爬取
本人在scrapy-redis项目中的setting.py中配置,可时中有问题。但是可以使用以下方法: 首先,你要确保安装了splash,并且已经启动 (1)先安装scrapy-splash库: [python] view plain copy pip install scrapy-splash   (2)然后
5072 0
|
NoSQL Redis Python
Scrapy结合Redis实现增量爬取
Scrapy适合做全量爬取,但是,我们不是一次抓取完就完事了。很多情况,我们需要持续的跟进抓取的站点,增量抓取是最需要的。 Scrapy与Redis配合,在写入数据库之前,做唯一性过滤,实现增量爬取。
2009 0
|
20天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
164 85