使用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的调度器、队列等组件,利用它可以实现分布式架构

最新文章

  1. Ambari服务依赖关系图生成脚本
  2. android中的广播接收实现总结
  3. Android ListView 详解
  4. ASP.NET MVC学习系列(二)-WebAPI请求(转)
  5. 开源搜索 Iveely Search Engine 0.6.0 发布 -- 黎明前的娇嫩
  6. xcode7 __weak 导致报错 is unavailable
  7. Android 6 Marshmallow USB调试授权
  8. c/c++ 编译器内存对齐问题
  9. asp.net中runat="server"的含义
  10. 【翻译】Zakas解答Baranovskiy的JavaScript测验题
  11. 增强的for循环(或foreach)
  12. Android笔记5-与USB HID 设备通信(一)
  13. POJ 2406
  14. CArray
  15. Cocostudio学习笔记(4) LoadingBar+ TextField
  16. CSS绘制无图片的气泡对话框
  17. JavaScript 父子页面相互调用总结
  18. Django模型操作常用方法
  19. {"errcode":48001,"errmsg":"api unauthorized}
  20. 省赛在即!最大流问题回顾学习!!DInic

热门文章

  1. SQL Server 2008 角色
  2. Node.js-npm安装包目录修改
  3. s7nodave用于上位机连接西门子PLC,开源项目epics
  4. leetcode: 贪心
  5. 转:spring mvc返回json数据格式
  6. jenkin+centos 7 环境搭建
  7. CPP-STL:用vector保存对象时保存指针的优点, 以及reserve的使用(转)
  8. Linux---who命令学习
  9. CSS font-size字体大小样式属性
  10. powerdesigner15 反向工程