使用scrapy-redis搭建分布式爬虫环境

 scrapy-redis简介

scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署。html

有以下特征:python

 分布式爬取git

  您能够启动多个spider工程,相互之间共享单个redis的requests队列。最适合普遍的多个域名网站的内容爬取。github

 分布式数据处理redis

  爬取到的scrapy的item数据能够推入到redis队列中,这意味着你能够根据需求启动尽量多的处理程序来共享item的队列,进行item数据持久化处理数据库

 Scrapy即插即用组件json

  Scheduler调度器 + Duplication复制 过滤器,Item Pipeline,基本spider架构

scrapy-redis架构

scrapy-redis总体运行流程以下:框架

 

1. 首先Slaver端从Master端拿任务(Request、url)进行数据抓取,Slaver抓取数据的同时,产生新任务的Request便提交给 Master 处理;scrapy

2. Master端只有一个Redis数据库,负责将未处理的Request去重和任务分配,将处理后的Request加入待爬队列,而且存储爬取的数据。

Scrapy-Redis默认使用的就是这种策略,咱们实现起来很简单,由于任务调度等工做Scrapy-Redis都已经帮咱们作好了,咱们只须要继承RedisSpider、指定redis_key就好了。

缺点是,Scrapy-Redis调度的任务是Request对象,里面信息量比较大(不只包含url,还有callback函数、headers等信息),

可能致使的结果就是会下降爬虫速度、并且会占用Redis大量的存储空间,因此若是要保证效率,那么就须要必定硬件水平。

scrapy-redis安装

经过pip安装便可:pip install scrapy-redis

通常须要python、redis、scrapy这三个安装包

官方文档:https://scrapy-redis.readthedocs.io/en/stable/

源码位置:https://github.com/rmax/scrapy-redis

参考博客:http://www.javashuo.com/article/p-gesudfwk-s.html

scrapy-redis经常使用配置

通常在配置文件中添加以下几个经常使用配置选项:

1(必须). 使用了scrapy_redis的去重组件,在redis数据库里作去重

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

 

 

2(必须). 使用了scrapy_redis的调度器,在redis里分配请求

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

3(可选). 在redis中保持scrapy-redis用到的各个队列,从而容许暂停和暂停后恢复,也就是不清理redis queues

SCHEDULER_PERSIST = True

4(必须). 经过配置RedisPipeline将item写入key为 spider.name : items 的redis的list中,供后面的分布式处理item 这个已经由 scrapy-redis 实现,不须要咱们写代码,直接使用便可

ITEM_PIPELINES = {
   'scrapy_redis.pipelines.RedisPipeline': 100 ,
}

5(必须). 指定redis数据库的链接参数

REDIS_HOST = '127.0.0.1' 
REDIS_PORT = 6379

scrapy-redis键名介绍

scrapy-redis中都是用key-value形式存储数据,其中有几个常见的key-value形式:

一、 “项目名:items”  -->list 类型,保存爬虫获取到的数据item 内容是 json 字符串

二、 “项目名:dupefilter”   -->set类型,用于爬虫访问的URL去重 内容是 40个字符的 url 的hash字符串

三、 “项目名: start_urls”   -->List 类型,用于获取spider启动时爬取的第一个url

四、 “项目名:requests”   -->zset类型,用于scheduler调度处理 requests 内容是 request 对象的序列化 字符串

scrapy-redis简单实例

在原来非分布式爬虫的基础上,使用scrapy-redis简单搭建一个分布式爬虫,过程只须要修改一下spider的继承类和配置文件便可,很简单。

原非分布式爬虫项目,参见:http://www.javashuo.com/article/p-zbxjdtee-d.html

首先修改配置文件,在settings.py文件中添加代码:

 

而后须要修改的文件,是spider文件,原文件代码为:

修改成:

 

 只修改了两个地方,一个是继承类:由scrapy.Spider修改成RedisSpider

而后start_url已经不须要了,修改成:redis_key = "xxxxx",其中,这个键的值暂时是本身取的名字,

通常用项目名:start_urls来代替初始爬取的url。因为分布式scrapy-redis中每一个请求都是从redis中取出来的,所以,在redis数据库中,设置一个redis_key的值,做为初始的url,scrapy就会自动在redis中取出redis_key的值,做为初始url,实现自动爬取。

所以:来到redis中,添加代码:

即:在redis中设置一个键值对,键为tencent2:start_urls , 值为:初始化url。便可将传入的url做为初始爬取的url。

如此一来,分布式已经搭建完毕。

相关文章
相关标签/搜索