爬虫的分布式思维与实现思路

news/2024/7/19 8:43:56 标签: 爬虫, 分布式

爬虫分布式思维与实现思路

基本构架

scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的核心服务器称为master,而把用于爬虫程序的机器称为slave

我们知道,采用scrapy框架抓取网页,我们需要首先给定它一些start_urls,爬虫首先访问start_urls里面的url,再根据我们的具体逻辑,对里面的元素、或者是其他的二级、三级页面进行抓取。而要实现分布式,我们只需要在这个starts_urls里面做文章就行了

我们在master上搭建一个redis数据库(注意这个数据库只用作url的存储),并对每一个需要爬取的网站类型,都开辟一个单独的列表字段。通过设置slave上scrapy-redis获取url的地址为master地址。这样的结果就是,尽管有多个slave,然而大家获取url的地方只有一个,那就是服务器master上的redis数据库

并且,由于scrapy-redis自身的队列机制,slave获取的链接不会相互冲突。这样各个slave在完成抓取任务之后,再把获取的结果汇总到服务器上

好处

程序移植性强,只要处理好路径问题,把slave上的程序移植到另一台机器上运行,基本上就是复制粘贴的事情

分布式爬虫思路

  1. 任务分发和调度:需要一个中心节点或者调度器来分发任务给各个爬虫节点,并监控任务的执行情况。可以使用消息队列(如RabbitMQ、Kafka)或分布式任务调度框架(如Celery)来实现任务的分发和调度。

  2. 数据存储和去重:在分布式环境下,需要统一管理爬取的数据,并进行数据去重。可以使用分布式数据库(如MongoDB、Cassandra)或者分布式存储系统(如Hadoop HDFS)来存储数据,并使用分布式去重算法(如布隆过滤器)来进行数据去重。

  3. URL管理:在分布式环境下,需要管理待爬取的URL队列,并保证每个URL只被爬取一次。可以使用分布式队列(如Redis队列)来管理URL队列,并使用分布式锁来保证URL的唯一性。

  4. 爬虫节点间通信:爬虫节点之间需要进行协作和通信,比如共享URL队列、传递爬取结果等。可以使用分布式消息系统(如RabbitMQ、Kafka)或者分布式存储系统来实现节点间的通信和数据共享。

  5. 容错和重试机制:由于分布式爬虫环境中存在多个节点,节点之间可能存在网络故障、节点宕机等问题,需要考虑容错和重试机制,保证系统的稳定性和可靠性。可以使用心跳机制、故障恢复策略等来处理节点故障和网络异常。

  6. 爬虫任务监控和日志:为了实时监控爬虫节点的状态和任务执行情况,可以引入日志记录和监控系统,对爬虫任务进行监控和统计分析,及时发现和解决问题。

分布式爬虫的实现">分布式爬虫的实现

  1. 使用三台机器,一台是windows,两台是centos,分别在两台机器上部署scrapy来进行分布式抓取一个网站

  2. windows的ip地址为192.168.xxx.XXX,用来作为redis的master端,centos的机器作为slave

  3. master的爬虫运行时会把提取到的url封装成request放到redis中的数据库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”

  4. slave从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis

  5. 重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到mongodb中

  6. master里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的

scrapy-redis框架的安装

一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能

github地址: GitHub - rmax/scrapy-redis: Redis-based components for Scrapy.

安装

pip install scrapy-redis==0.7.3

 


http://www.niftyadmin.cn/n/1395942.html

相关文章

水面Alpha混合与边界柔和

水面原来采用渲染质量较高的菲捏珥水面,这样渲染出来的效果确实不错,不过这需要渲染折射图与反射图,再加上最后一遍场景渲染,整个场景需要渲染三遍,虽然GPU GEM2里面提到了这类水面的优化,经过项目中使用发…

汇编指令汇总

汇编指令汇总 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,S…

图像基础:5种Web图像格式简述

BMP 图像文件BMP图像文件最早应用于Windows操作系统,是Windows操作系统中的标准图像文件格式,是最简单的图像格式。BMP图像格式非常简单,仅具有最基本的图像数据存储功能,能存储每个像素1位、4位、8位和24位的位图。虽然它提供的信…

加壳与脱壳理论详解

加壳与脱壳理论详解 在自然界中,我想大家对壳这东西应该都不会陌生了,由上述故事,我们也可见一斑。自然界中植物用它来保护种子,动物用它来保护身体等等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改…

Java版SLG游戏开发入门[0]--让绘制的窗口响应鼠标事件

什么是SLG呢?也就是Simulation Game的缩写,即模拟策略游戏。以我这种准骨灰级玩家的视点来看(鄙人88年开始玩FC,时年6岁),早期的SLG游戏,大体只是《三国志》(I由1985年开始发售)这类…

Http协议答疑

Http协议答疑 1、说一下什么是Http协议? 对器客户端和 服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。 2、什么是Http协议无状态协议?怎么解决Http协议无状态协议? 无状态协议对于事务处理没有记忆能力。缺少状态…

索引碎片处理

部份资料来源MSDN 给表添加索引是查询速度好处,但您却多了份维护索引,在数据更改期间索引可能产生碎片,所以一些维护是必要的。碎片可能是你查询产生性能问题的来源。 那么到底什么是索引碎片呢?索引碎片实际上有2种形式&#xff…

CTF-前期资源收集

CTF-前期资源收集 ctf比赛/学习资源整理,记得收藏!https://mp.weixin.qq.com/s/JSINcOxv6qwuypm_hWuzxw CTF资料总结、各种在线靶场题库、实验靶场、各大赛writeup()https://mp.weixin.qq.com/s/gAtSOdzMJd8s6y8l4aqWmQ CTF工具大合集(4.5G)https://mp.w…