Scrapy 教程(八)-分布式爬虫
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 教程(八)-分布式爬虫的更多相关文章
- 基于Python,scrapy,redis的分布式爬虫实现框架
原文 http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...
- scrapy如何实现分布式爬虫
使用scrapy爬虫的时候,记录一下如何分布式爬虫问题: 关键在于多台主机协作的关键:共享爬虫队列 主机:维护爬取队列从机:负责数据抓取,数据处理,数据存储 队列如何维护:Redis队列Redis 非 ...
- scrapy——7 scrapy-redis分布式爬虫,用药助手实战,Boss直聘实战,阿布云代理设置
scrapy——7 什么是scrapy-redis 怎么安装scrapy-redis scrapy-redis常用配置文件 scrapy-redis键名介绍 实战-利用scrapy-redis分布式爬 ...
- Scrapy+redis实现分布式爬虫
概述 什么是分布式爬虫 需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一网络资源进行联合且分布的数据爬取. 原生Scrapy无法实现分布式的原因 原生Scrapy中调度器 ...
- Python爬虫教程-新浪微博分布式爬虫分享
爬虫功能: 此项目实现将单机的新浪微博爬虫重构成分布式爬虫. Master机只管任务调度,不管爬数据:Slaver机只管将Request抛给Master机,需要Request的时候再从Master机拿 ...
- 基于scrapy框架的分布式爬虫
分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...
- Scrapy分布式爬虫,分布式队列和布隆过滤器,一分钟搞定?
使用Scrapy开发一个分布式爬虫?你知道最快的方法是什么吗?一分钟真的能 开发好或者修改出 一个分布式爬虫吗? 话不多说,先让我们看看怎么实践,再详细聊聊细节~ 快速上手 Step 0: 首先安装 ...
- Python分布式爬虫必学框架Scrapy打造搜索引擎 学习教程
Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 1.创建搜索自动补全字段suggest自动补全需要用 ...
- scrapy简单分布式爬虫
经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网 ...
随机推荐
- Idea中Springboot热部署无效解决方法
仅适用IDEA中,eclipse中不需要设置 一.开启idea自动make功能 1 - Enable Automake when the application is running PRESS: C ...
- spring自带工具类
在spring-core.jar包中,org.springframework.util package下有很多工具类,这些工具类十分具有参考意义.
- 今天跟outlook顶上牛了
之前使用的是2007,然后之前弄东西的时候给升到2010了,之前就是把所有的邮件都保存到本地的文件中,我还想使用之前的文件,然后2010就是不好使,后来查了半天发现原来是需要手动创建账户,参考http ...
- [BZOJ5463][APIO2018]铁人两项:Tarjan+圆方树
分析 根据题目中的要求,从\(s\)出发前往\(f\)一定可以,并且只可能经过这两个结点所在的点双连通分量和它们之间的点双连通分量,因此切换点\(c\)只能从这些点中选取. 建出圆方树后,因为圆方树上 ...
- Maven开发环境搭建
配置Maven流程: 1.下载Maven,官网:http://maven.apache.org/ 2.安装到本地: 1 ).解压apache-maven-x.x.x-bin.zip文件 2 ).配置M ...
- 初始化Thread
此处初始化的步骤和上文中介绍的一样,也是调用runClinit方法.首先设置初始化线程为CurrentThread,然后由于其父类Object此时的状态为CLASS_READY,因此就不需要初始化父类 ...
- controller大全(推荐)
@Controller @RequestMapping("/router") @SessionAttributes(value = { "username" } ...
- 20182335实验一《Linux基础与Java开发环境》
课程:<程序设计与数据结构> 班级: 1823 姓名: 李金泉 学号:20182335 实验教师:王志强 实验日期:2019年9月9日 必修/选修: 必修 1.实验内容 基于命令行和IDE ...
- Oracle Mysql MSSql 三种数据库 随机查询 条 语句
1. Oracle,随机查询查询语句-20条 select * from ( select * from 表名 order by dbms_random.value ) where rownum ...
- 微信小程序 API 界面(1)
界面 有关屏幕的api 交互: wx.showToast() 显示消息提示框 参数:object object的属性: title:类型 字符串 提示的内容(文本最多7个汉字) icon:类型 字符串 ...