scrapy如何实现分布式爬虫
2024-09-17 05:28:39
使用scrapy爬虫的时候,记录一下如何分布式爬虫问题:
关键在于多台主机协作的关键:共享爬虫队列
主机:维护爬取队列
从机:负责数据抓取,数据处理,数据存储
队列如何维护:Redis队列
Redis 非关系型数据库,key-value形式存储,结构灵活。是内存中的数据结构存储系统,处理速度快,性能好
提供队列,集合等多种存储结构,方便队列维护
怎么去重
Redis集合:Redis提供集合数据结构,在Redis集合中存储每个Request的指纹,在向Request队列中加入Request前首先
验证这个Request的指纹是否已经加入集合中,如果已存在,则不添加到Request队列,如果不存在,则将Request添加到队列
并将指纹添加到集合。
(之前很多框架说利用bloom过滤器来实现去重,但是bloom过滤器有个假阳性的问题,即可能不存在集合的问题,bloom过滤器错误地判断为在集合中。)
怎么防止中断:
启动判断,在每台从机Scrapy启动时首先判断当前的Redis Request队列
是否为空,如果不为空,则从队列中取得下一个Request进行爬取。
如果为空,则重新开始爬取,第一台从机执行爬取向队列中添加Request
如何实现这样的架构
库:scrapy-redis:实现了维护爬取队列、去重、中断、redis接口
改写了Scrapy的调度器、队列等组件,利用它可以实现分布式架构
最新文章
- Ambari服务依赖关系图生成脚本
- android中的广播接收实现总结
- Android ListView 详解
- ASP.NET MVC学习系列(二)-WebAPI请求(转)
- 开源搜索 Iveely Search Engine 0.6.0 发布 -- 黎明前的娇嫩
- xcode7 __weak 导致报错 is unavailable
- Android 6 Marshmallow USB调试授权
- c/c++ 编译器内存对齐问题
- asp.net中runat=";server";的含义
- 【翻译】Zakas解答Baranovskiy的JavaScript测验题
- 增强的for循环(或foreach)
- Android笔记5-与USB HID 设备通信(一)
- POJ 2406
- CArray
- Cocostudio学习笔记(4) LoadingBar+ TextField
- CSS绘制无图片的气泡对话框
- JavaScript 父子页面相互调用总结
- Django模型操作常用方法
- {";errcode";:48001,";errmsg";:";api unauthorized}
- 省赛在即!最大流问题回顾学习!!DInic