分布式爬虫那些事儿

什么是分布式爬虫?

假设你有一群小伙伴,他们每个人都在帮你剥花生壳,然后把剥好的花生仁都丢到你面前的盘子里。分布式爬虫也差不多,许多台电脑一起上阵,各自负责去同一个网站获取数据,这叫建立一个分布式机群。

为什么要用分布式?

你一个人剥花生,速度自然慢。如果有一大堆人帮你,速度嗖嗖的上升。同理,为了提升爬取数据的效率,我们就用分布式爬虫。

怎么实现分布式爬虫?

我们用 scrapy+redis,具体是通过 scrapy-redis 这个组件来实现分布式。

为什么原版 scrapy 做不了分布式?

因为它的调度器和管道不能共享,像你只能独享这堆花生仁,别人就只能干瞪眼了。

scrapy-redis 组件有啥用?

它提供了可以被大家一起分享的调度器和管道!

环境安装:

  • 安装 redis
  • 安装 scrapy-redis
    pip install scrapy-redis
    

编码流程:

1. 创建一个新的工程

2. 创建一个爬虫文件

这个爬虫文件可以是基于 CrawlSpider 的,也可以是普通爬虫文件。

3. 修改爬虫文件

  • 导入必要的包:

    from scrapy_redis.spiders import RedisCrawlSpider  # 如果你用普通的Spider可以用 RedisSpider
    
  • start_urls 替换成:

    redis_key = 'your_queue_name'
    

    表示这是一个共享调度器的队列名称。

  • 编写爬虫类爬取数据的逻辑(注意:这时候不写起始URL):

    class MySpider(RedisCrawlSpider):  name = 'my_spider'redis_key = 'my_spider:start_urls'def parse(self, response):# your parsing logic herepass
    

4. 对 settings.py 进行配置:

  • 开启共享管道:
    ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400
    }
    
  • 指定调度器:
    # 使用Redis的set集合来存储请求的指纹数据,实现请求去重
    DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'# 使用scrapy-redis组件自己的调度器
    SCHEDULER = 'scrapy_redis.scheduler.Scheduler'# 配置调度器是否要持久化,爬虫结束后是否清空Redis中请求队列和去重指纹的set
    SCHEDULER_PERSIST = True
    
  • 指定Redis服务地址和端口:
    REDIS_HOST = 'your_redis_server_ip'
    REDIS_PORT = 6379
    

5. 修改Redis配置文件:redis.windows.conf

  • 在第56行,将 #bind 127.0.0.1 去掉注释。
  • 在第75行,将 protected-mode 设置为 no

6. 启动Redis服务

带上配置文件启动:

redis-server redis.windows.conf

7. 启动Redis客户端

redis-cli

执行我们的工程:

  • 进入爬虫文件对应的目录,运行爬虫:
    scrapy runspider your_spider.py
    

最后一步,向调度器队列中添加一个起始URL:

在Redis客户端中输入:

lpush your_queue_name 'http://www.example.com'

这个 your_queue_name 就是你在爬虫文件中定义的 redis_key

现在,就可以看着你的分布式爬虫计算机群高效地运行了!

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

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

相关文章

CSS学习记录03

CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下: body {background-color: lightblue; } 通过CSS,颜色通常由以下方式指定: 有效的颜色名称-比如“…

Matlab mex- setup报错—错误使用 mex,未检测到支持的编译器...

错误日志: 在使用mex编译时报错提示:错误使用 mex,未检测到支持的编译器。您可以安装免费提供的 MinGW-w64 C/C 编译器;请参阅安装 MinGW-w64 编译器。有关更多选项,请访问https://www.mathworks.com/support/compile…

23种设计模式之外观模式

目录 1. 简介2. 代码2.1 SelectFoodService (选择食品)2.2 PayService (支付服务)2.3 TakeService (制作服务)2.4 OrderService (下单服务)2.5 Food (食品)2.6 TackingSystem (外观类)2.7 Test (测试类) 3. 优缺点3. 总结 1. 简介…

vue3 路由跳转携带参数以及其他页面接收参数

vue3 路由跳转携带参数以及其他页面接收参数 传参页面 <script setup> import { useRouter } from "vue-router"; const router useRouter();// 路由 const goToDetail () > {router.push({ path: /about, query: { id: 123 } }); }; function goToDeta…

MeterSphere VS 其他开源接口测试工具

对比项 swagger yapi postman httprunner2.x/3.x jmeter metersphere UI界面 支持支持支持 不支持&#xff08;无界面/UI不够便捷 脚本编写量大 文档不够清晰&#xff09; 支持支持 单接口 支持支持支持支持支持支持 业务场景自动化 不支持支持支持支持支持支持 操作数据…

STM32CUBEIDE FreeRTOS操作教程(十):interrupt on/off中断开关

STM32CUBEIDE FreeRTOS操作教程&#xff08;十&#xff09;&#xff1a;interrupt on/off中断开关 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发…

【系统架构设计师论文】微服务架构设计与实践

一、微服务架构概述 1.1 什么是微服务架构? 微服务架构(Microservices Architecture)是一种将应用程序拆分为多个小型服务的架构模式,每个服务都可以独立开发、部署、扩展,并通过轻量级的通信协议(通常是 HTTP/REST 或 gRPC)进行交互。这种架构的核心思想是将大型单体…

长安汽车嵌入式面试题及参考答案

数据结构中的堆栈和编程中的堆栈有什么区别? 在数据结构中,堆栈是一种抽象的数据类型。它遵循后进先出(LIFO)的原则。从操作角度来看,有入栈(push)和出栈(pop)操作。例如,想象有一个装有盘子的栈,只能从栈顶放入和取出盘子。数据结构中的堆栈主要关注其逻辑结构和操…

Python学习38天

class Person:def __init__(self, name, age, job):self.name nameself.age ageself.job job# 重写函数返回属性def __str__(self):return f"{self.name}--{self.age}--{self.job}"# 冒泡排序法 def bubble_sort(my_list: list[Person]):"""冒泡排…

Python 调用 Umi-OCR API 批量识别图片/PDF文档数据

目录 一、需求分析 二、方案设计&#xff08;概要/详细&#xff09; 三、技术选型 四、OCR 测试 Demo 五、批量文件识别完整代码实现 六、总结 一、需求分析 市场部同事进行采购或给客户报价时&#xff0c;往往基于过往采购合同数据&#xff0c;给出现在采购或报价的金额…

docker x86环境构建arm镜像出现failed to fetch oauth token问题

问题&#xff1a;最近在使用x86的MAC机器准备打包arm的镜像时使用命令如下 docker buildx build --platform linux/arm64 --load --no-cache -t deepface:v1-arm .出现连接问题 [] Building 31.7s (3/3) FINISHED …

C语言中map的用法和其他数据结构的区别

在C语言中&#xff0c;没有直接内置的map数据结构&#xff08;类似于C的std::map&#xff09;&#xff0c;但可以通过结构体、数组、链表或哈希表来实现类似功能。下面将从map的概念、实现方法和与其他数据结构的区别等方面进行详细讲解。 一、Map的概念 Map是一种键值对&…

【AI系统】AI 编译器基本架构

AI 编译器基本架构 在上一篇文章中将 AI 编译器的发展大致分为了 3 个阶段&#xff0c;分别为 1&#xff09;朴素编译器、2&#xff09;专用编译器以及 3&#xff09;通用编译器。 本文作为上一篇文章 AI 编译器架构的一个延续&#xff0c;着重讨论 AI 编译器的通用架构。首先…

java版工程项目管理系统源码:Spring Cloud与前后端分离的完美结合

在现代化的工程项目管理中&#xff0c;一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统&#xff0c;结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…

近几年,GIS专业的五类就业方向!

近二十几年来&#xff0c;地理信息科学毕业生的就业方向在不断发生变化。 早期的地理信息科学技术主要应用于政府部门&#xff0c;因此学生就业主要在高校、交通运输、规划勘测设计、国土、矿业、水利电力、通讯、农林、城市建设、旅游等国家政府部门或事业单位。 随着地理信…

css选择当前元素前面的一个元素

选择text-danger前面的ant-divider: .ant-divider:has( .text-danger) {display: none; }

动态代理如何加强安全性

在当今这个信息爆炸、网络无孔不入的时代&#xff0c;我们的每一次点击、每一次浏览都可能留下痕迹&#xff0c;成为潜在的安全隐患。如何在享受网络便利的同时&#xff0c;有效保护自己的隐私和信息安全&#xff0c;成为了每位网络使用者必须面对的重要课题。动态代理服务器&a…

el-table 纵向 横向 多级表头

<el-table :data"tableData" class"diaTable":span-method"handleSpanMethod"border:header-cell-style"{background:#292929,color:#fff}"><!-- 纵向表头 --><el-table-column label"纵向表头" width"…

网页端五子棋对战(二)---数据库连接用户登录注册接口设计postman验证

文章目录 1.用户模块--数据库的设计1.1idea新建db.sql文件1.2mysql建库建表 2.使用mybatis操作数据库2.1修改spring配置文件2.2创建实体类用户user2.3创建Mapper接口2.4实现xml配置文件 3.前后端交互接口架构4.后端代码实现4.1登录模块4.2注册模块4.3获取用户信息 5.postman验证…

【导航查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…