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

原文地址https://www.cnblogs.com/zhaof/p/7306374.html

关于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是请求队列

 

 

转载于:https://www.cnblogs.com/111testing/p/10325428.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-入门

Python入门 阅读目录 一 编程与编程语言二 编程语言分类三 主流编程语言介绍四 python介绍五 安装python解释器六 第一个python程序七 变量八 用户与程序交互九 基本数据类型十 格式化输出十一 基本运算符十二 流程控制之if...else十三 流程控制之while循环十四 流程控制之for循…

图论算法(一)--最短路径的DFS/BFS解法(JAVA )

最短路径–城市路径问题: 问题描述:求从1号城市到5号城市的最短路径长度 Input: 5 8 1 2 2 1 5 10 2 3 3 2 5 7 3 1 4 3 4 4 4 5 5 5 3 3 Output: 9 DFS import java.util.Scanner; public class minPath {stati…

win7安装composer

一、下载安装包 二、安装 1、双击安装包进行安装 2、安装选项,点击next 3、选择php.exe的路径 4、选择并next 5、代理 6、准备安装 7、信息 8、安装成功 9、测试是否安装成功 10、安装位置 11、密钥位置 12、添加路径到环境变量 13、配置国内镜…

图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )

一、Dijkstra算法 问题描述:求一个点到任意个点的距离 思路:单源最短路径问题,使用Dijkstra算法 Input: 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 3 4 4 5 13 4 6 15 5 6 4 Output: 0 1 8 4 13 17 imp…

MySQL日志分析

一、MySQL日志简介 (一)、mysql日志的种类,一般来说,日志有五种,分别为: 错误日志:log_error (记录启动,运行,停止mysql时出现的信息)二进制日志:log_bin &…

图论算法(三)--最短路径 的Bellman-Flod [ 带负权值图 ] 的解法(JAVA )

Bellman-Flod算法 对于带有负权值的图,我们已经不能通过Dijkstra算法进行求解了 原因:Dijkstra每次都会找一个距源点(设为s)最近的点,然后将该距离定为这个点到源点的最短路径;如果一个顶点u被加入了book…

SpringCloud介绍(一)

1.1 SpringCloud介绍 1.1.1 微服务架构演化 简而言之,微服务就是开发一组小型服务的方式来开发一个独立的应用系统,每个小型服务都运行在自己的进程中,并采用HTTP资源API轻量级的机制来互相通信。这些服务围绕业务功能进行构建&…

最短路径问题总结,时间复杂度,空间复杂度对比(JAVA)

最短路径问题总结 图中还有些地方没有完善,但是一时也没没办法解决,希望大家知道的能够提供一下表中不足的地方,万分感谢!!! 最短路径算法(一)–DFS/BFS求解(JAVA &…

树--树的基本性质(JAVA)

前几篇文章介绍了图的搜索算法,最短路径算法,接下来介绍树: 树和图 树实际上就是不含回路的无向连通图 虽然树不连通,没有回路了,但是这也使得树这种数据结构有了更多的特性: 1.一棵树中的任意两个结点…

看后端程序员调试CORS的姿势

# 目录 为什么有同源策略? 需要解决的问题CORS跨域请求方案 preflightwithCredentials附:高效、优雅地调试CORS实现为什么有同源策略? 同源策略Same Origin Policy 是一种约定,是浏览器最核心的安全功能:该策略允许在…

图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)

之前我们介绍了求最短路径算法,现在又讲最小生成树算法,这两个算法有什么区别呢? 首先要明确,最短路径和最小生成树是两个不同的概念。 最短路径是对于一个图的两个结点而言的。在一个图中,结点A通过某些结点和边可以…

express+handlebars 快速搭建网站前后台

最近在重构公司网站,原来网站使用PHP,前后端不分离,添加与更新网站内容仍使用原始方法,先出布局再把调好的布局给PHP后端开发,花时间长,维护不易。因此决定将网站前后端分离,核心功能含网站下单…

定义一个二维数组并输入数据,将二维数组元素的值按升序排列,并输出排序后的二维数组。

目录 问题: 回顾: 给出两种做法: 解法一:调用qsort 函数进行排序 代码: 运行结果: 解法二:冒泡排序 代码: 运行结果: 回顾里的4种方法的模板参考: 1.冒泡排序…

第五届省赛(软件类)真题----Java大学C组答案及解析

第五届省赛(软件类)真题—-Java大学C组答案及解析 杨辉三角调和级数回文素数过大年位平方和单位分数n级台阶 一、杨辉三角 二项式的系数规律,我国数学家很早就发现了。 如【图1.png】,我国南宋数学家杨辉1261年所著的《详解九…

Angular4.x 安装|创建项目|目录结构|创建组件

Angular4.x 安装|创建项目|目录结构|创建组件 安装最新版本的 nodejs node.js 官网:https://nodejs.org/zh-cn/ 去官网下载 node.js,下一步下一步就可以了。只要 node.js 安装成功,那么 npm 也会帮你安装完成! 注意:请…

第五届省赛(软件类)真题----Java大学B组答案及解析

第五届省赛(软件类)真题—-Java大学B组答案及解析 正则切分调和级数n的n次幂七对数字勾股定理九阶数独G将军 一、正则切分 java中提供了对正则表达式的支持。 有的时候,恰当地使用正则,可以让我们的工作事半功倍! …

第五届省赛(软件类)真题----Java大学A组答案及解析

第五届省赛(软件类)真题—-Java大学A组答案及解析 子序列最大长度莱布尼茨公式n的n次幂七对数字勾股定理九阶数独矩阵射线 一、子序列最大长度 一个串的子串是指该串的一个连续的局部。如果不要求连续,则可称为它的子序列。 比如对串&…

第六届省赛(软件类)真题----Java大学C组答案及解析

第六届省赛(软件类)真题----Java大学C组答案及解析隔行变色立方尾无穷分数循环节长度格子中输出奇妙的数字加法变乘法移动距离打印大X垒骰子 一、隔行变色 Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的…

spring_01概念及案例

1.什么是IOC?   IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContext.xml),而程序本身不再维护 2.什么是di? dependency injection,依赖注入,di和IOC是一个概念,spring的设计者认为di等…

斐波那契数列(二)--矩阵优化算法

之前写了一篇从斐波那契数列分析递归与动态规划(JAVA)来优化斐波那契数列,这样可以使算法的时间复杂度从O(n^2)变到O(n),这是使用递归公式f(n)f(n-1)f(n-2)求斐波那契数列的最优算法,但是这只是一维世界下的极限。下面我们将其从一…