scrapy 本身并不是一个分布式框架,而 Scrapy-redis 库使得分布式成为可能;

Scrapy-redis 并没有重构框架,而是基于redis数据库重写了框架的某些组件。

分布式框架要解决两个问题

分配爬取任务:为每个爬虫分配不重复的任务

scrapy-redis 使用 redis 数据库存储所有请求,利用 redis 数据库实现请求队列,所有爬虫从该队列中获取任务,并将新产生的请求添加到该队列中;

汇总爬取数据:将所有爬虫的数据汇总到一处

scrapy-redis 使用 RedisPipeline 将数据存储于同一个 redis 数据库中,并用 twisted 框架实现并发存储。

具体实现参考

Scrapy-redis 源码  https://github.com/rmax/scrapy-redis/tree/master/src/scrapy_redis

环境搭建

1. 多台服务器

2. 分别配置 单机爬虫 所需环境

3. 选择一台服务器搭建 redis 数据库

4. 测试集群能否连接 redis

具体实施

1. 创建单机项目

2. 修改配置文件

# 必选项
# =================================================================
# 指定爬虫所使用的Redis数据库(在云服务器116.29.35.201 上)
REDIS_URL = 'redis://116.29.35.201:6379'
# 使用scrapy_redis的调度器替代Scrapy 原版调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 使用scrapy_redis的RFPDupeFilter作为去重过滤器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 启用scrapy_redis的RedisPipeline将爬取到的数据汇总到Redis数据库
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300,
}
# 可选项
# =================================================================
#爬虫停止后,保留/清理Redis中的请求队列以及去重集合
# True:保留,False:清理,默认为False
SCHEDULER_PERSIST = True

3. 修改爬虫

from scrapy_redis.spiders import RedisSpider
# 1.更改基类
# class BooksSpider(spider.Spider):
class BooksSpider(RedisSpider): # 2.注释 start_urls
# start_urls = ['http://books.toscrape.com/']

【如何为多个爬虫设置起始爬取点】

单机爬虫 的起始爬取点由 start_urls 确定,但是分布式去掉了 start_urls,然后重写了 start_requests 方法,它尝试从 redis 数据库的某个特定列表中获取起始爬取点,构造request对象,并设置 dont_filter=False,

该列表可通过配置文件设定,REDIS_START_URLS_KEY,默认为 <spider_name>:start_urls;

在分布式爬取时,运行所有爬虫后,需要手动向该列表添加起始爬取点,之后只有其中一个爬虫获取到该起始点,避免重复。

4. 分发代码到其他机器

5. 每台机器上运行爬虫

6. 爬虫处于等待状态,在任一台机器上连接redis,设置爬取起始点

 lpush books:start_urls 'http://books.toscrape.com'

其中一个爬虫获取该url,此后整个爬虫开始运转。

参考资料:

《精通scrapy网络爬虫》   pdf

Scrapy 教程(八)-分布式爬虫的更多相关文章

  1. 基于Python,scrapy,redis的分布式爬虫实现框架

    原文  http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...

  2. scrapy如何实现分布式爬虫

    使用scrapy爬虫的时候,记录一下如何分布式爬虫问题: 关键在于多台主机协作的关键:共享爬虫队列 主机:维护爬取队列从机:负责数据抓取,数据处理,数据存储 队列如何维护:Redis队列Redis 非 ...

  3. scrapy——7 scrapy-redis分布式爬虫,用药助手实战,Boss直聘实战,阿布云代理设置

    scrapy——7 什么是scrapy-redis 怎么安装scrapy-redis scrapy-redis常用配置文件 scrapy-redis键名介绍 实战-利用scrapy-redis分布式爬 ...

  4. Scrapy+redis实现分布式爬虫

    概述 什么是分布式爬虫 需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一网络资源进行联合且分布的数据爬取. 原生Scrapy无法实现分布式的原因 原生Scrapy中调度器 ...

  5. Python爬虫教程-新浪微博分布式爬虫分享

    爬虫功能: 此项目实现将单机的新浪微博爬虫重构成分布式爬虫. Master机只管任务调度,不管爬数据:Slaver机只管将Request抛给Master机,需要Request的时候再从Master机拿 ...

  6. 基于scrapy框架的分布式爬虫

    分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...

  7. Scrapy分布式爬虫,分布式队列和布隆过滤器,一分钟搞定?

    使用Scrapy开发一个分布式爬虫?你知道最快的方法是什么吗?一分钟真的能 开发好或者修改出 一个分布式爬虫吗? 话不多说,先让我们看看怎么实践,再详细聊聊细节~ 快速上手 Step 0: 首先安装 ...

  8. Python分布式爬虫必学框架Scrapy打造搜索引擎 学习教程

    Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 1.创建搜索自动补全字段suggest自动补全需要用 ...

  9. scrapy简单分布式爬虫

    经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网 ...

随机推荐

  1. linux-ntp-10

    Unix/linux类:ntp.aliyun.com,ntp1-7.aliyun.com windows类: time.pool.aliyun.com s1a.time.edu.cn 北京邮电大学 s ...

  2. 微信小程序访问后台出现 对应的服务器证书无效。控制台输入 showRequestInfo() 可以获取更详细信息。

    检查微信开发者平台配置 https 服务端 nginx 配置 ssl 协议是否有效 在开发者工具中可以使用(详情 > 不校验合法域名.web-view(业务域名).TLS 版本以及 HTTPS ...

  3. spring cloud:hystrix-dashboard-turbine

    hystrix-dashboard-turbine-server 1. File-->new spring starter project 2.add dependency <parent ...

  4. eclipse 简单配置

    1.安装STS4 help-->Eclipse Maketplace-->search 'STS'-->install 2.代码提示 Window-->preferences- ...

  5. JSON.stringify方法报错:Converting circular structure to JSON

    别以为JSON.parse(JSON.stringify(data))做深拷贝无敌,对于以下这种情况,当你需要保留父级对象,即 对象存在循环引用,就会报错. var a = [ { "id& ...

  6. nginx location的优先级

    原来一直以为location的优先级是先后顺序,结果有次项目中傻眼了,赶紧百度一下,下面的内容参考了这个链接 location表达式类型 ~ 表示执行一个正则匹配,区分大小写~* 表示执行一个正则匹配 ...

  7. springboot日期格式转换

    post: @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") GET: @Dat ...

  8. WPF在资源内嵌入字体

    比如需要有这种电子表的字体风格--这种样式叫 :longzhoufeng 字体 在微软的字体有 Quartz MS.TTF或者Quartz Regular.TTF字体.下面以Quartz Regula ...

  9. 浅谈防火墙对FTP的影响及故障排除

    本文转载自:http://www.cnblogs.com/emanlee/archive/2013/01/07/2849680.html  向作者致敬! TP是常见的基于TCP的网络服务,它使用了两个 ...

  10. 用ajax提交请求,预期Json返回 406错误的解决办法!

    正常情况下在Controller端已经配置好了 @ResponseBody    @RequestMapping  返回Json格式数据 发生406错误 ,应该检查提交的请求路径是否含有 .html ...