Python爬虫从入门到放弃(二十)之 Scrapy分布式原理

关于Scrapy工作流程回顾

Scrapy单机架构

上图的架构其实就是一种单机架构,只在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列。

分布式架构

我将上图进行再次更改

这里重要的就是我的队列通过什么维护? 这里一般我们通过Redis为维护,Redis,非关系型数据库,Key-Value形式存储,结构灵活。 并且redis是内存中的数据结构存储系统,处理速度快,提供队列集合等多种存储结构,方便队列维护

如何去重? 这里借助redis的集合,redis提供集合数据结构,在redis集合中存储每个request的指纹 在向request队列中加入Request前先验证这个Request的指纹是否已经加入集合中。如果已经存在则不添加到request队列中,如果不存在,则将request加入到队列并将指纹加入集合

如何防止中断?如果某个slave因为特殊原因宕机,如何解决? 这里是做了启动判断,在每台slave的Scrapy启动的时候都会判断当前redis request队列是否为空 如果不为空,则从队列中获取下一个request执行爬取。如果为空则重新开始爬取,第一台丛集执行爬取向队列中添加request

如何实现上述这种架构? 这里有一个scrapy-redis的库,为我们提供了上述的这些功能 scrapy-redis改写了Scrapy的调度器,队列等组件,利用他可以方便的实现Scrapy分布式架构 关于scrapy-redis的地址:https://github.com/rmax/scrapy-redis

搭建分布式爬虫

参考官网地址:https://scrapy-redis.readthedocs.io/en/stable/

前提是要安装scrapy_redis模块:pip install scrapy_redis 这里的爬虫代码是用的之前写过的爬取知乎用户信息的爬虫

修改该settings中的配置信息:

替换scrapy调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler"

添加去重的class DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

添加pipeline 如果添加这行配置,每次爬取的数据也都会入到redis数据库中,所以一般这里不做这个配置 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300 }

共享的爬取队列,这里用需要redis的连接信息 这里的user:pass表示用户名和密码,如果没有则为空就可以 REDIS_URL = 'redis://user:pass@hostname:9001'

设置为为True则不会清空redis里的dupefilter和requests队列 这样设置后指纹和请求队列则会一直保存在redis数据库中,默认为False,一般不进行设置

SCHEDULER_PERSIST = True

设置重启爬虫时是否清空爬取队列 这样每次重启爬虫都会清空指纹和请求队列,一般设置为False SCHEDULER_FLUSH_ON_START=True

分布式

将上述更改后的代码拷贝的各个服务器,当然关于数据库这里可以在每个服务器上都安装数据,也可以共用一个数据,我这里方面是连接的同一个mongodb数据库,当然各个服务器上也不能忘记: 所有的服务器都要安装scrapy,scrapy_redis,pymongo

这样运行各个爬虫程序启动后,在redis数据库就可以看到如下内容,dupefilter是指纹队列,requests是请求队列

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木制robot技术杂谈

Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页

Scrapy爬虫框架教程(一)– Scrapy入门 Scrapy爬虫框架教程(二)– 爬取豆瓣电影TOP250 Scrapy爬虫框架教程(三)– 调试(Debu...

76090
来自专栏ASP.NETCore

Asp.Net Core 通过中间件防止图片盗链

  要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的...

18030
来自专栏纯洁的微笑

分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

35030
来自专栏友弟技术工作室

常用python爬虫框架整理Python中好用的爬虫框架1.Scrapy2.PySpider3.Crawley4.Portia5.Newspaper6.Beautiful Soup7.Grab8.Co

一般比价小型的爬虫需求,我是直接使用requests库 + bs4就解决了,再麻烦点就使用selenium解决js的异步 加载问题。相对比较大型的需求才使用框架...

16130
来自专栏针针小站

【Soft】NetSarang Xshell 6 Free for Home & School 申请

33320
来自专栏大数据挖掘DT机器学习

用scrapy爬虫抓取慕课网课程数据详细步骤

关于如何安装scrapy框架,可以参考这篇文章 史上最完全Mac安装Scrapy指南 http://www.jianshu.com/p/a03aab073...

60380
来自专栏Jed的技术阶梯

Spark性能调优05-Shuffle调优

在Spark的源码中,负责shuffle过程的执行、计算和处理的组件主要就是ShuffleManager,也即shuffle管理器。而随着Spark的版本的发展...

32030
来自专栏企鹅号快讯

用Python抓取非小号网站数字货币(一)

一、环境 OS:win10 python:3.6 scrapy:1.3.2 pymongo:3.2 pycharm 环境搭建,自行百度 二、本节内容说明 本节主...

56160
来自专栏技术小站

Python3 Scrapy 安装方法

转自:https://blog.csdn.net/zjiang1994/article/details/52689144

14420
来自专栏cnblogs

Hi,给他介绍一款markdown的帮助文档生成器

      当今大多数的团队都实现了前、后端分支。前端与后端的沟通都是通过接口来实现的(一般情况下都是webapi接口)。这种情况你肯定需要一个接口查询的帮助文...

14620

扫码关注云+社区

领取腾讯云代金券