爬虫工作量由小到大的思维转变---<第二十三章 Scrapy开始很快,越来越慢(医病篇)>

诊断篇icon-default.png?t=N7T8https://blog.csdn.net/m0_56758840/article/details/135170994?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170333243316800180644102%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170333243316800180644102&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-135170994-null-null.142%5Ev96%5Epc_search_result_base7&utm_term=%E7%88%AC%E8%99%AB%E5%B7%A5%E4%BD%9C%E9%87%8F%E7%94%B1%E5%B0%8F%E5%88%B0%E5%A4%A7%E7%9A%84%E6%80%9D%E7%BB%B4%E8%BD%AC%E5%8F%98---%EF%BC%9C%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%BA%8C%E7%AB%A0%20Scrapy%E5%BC%80%E5%A7%8B%E5%BE%88%E5%BF%AB%2C%E8%B6%8A%E6%9D%A5%E8%B6%8A%E6%85%A2%28%E8%AF%8A%E6%96%AD%E7%AF%87%29%EF%BC%9E&spm=1018.2226.3001.4187

前言:

诊断篇已经讲了(链接在上面),如何分析出自己的scrapy出了什么问题! 一般来说,如果不是网络ip问题,大部分都是内存泄漏问题~

而在内存泄漏里面,普遍的现象就是request和item的处理,在一开始就出现了设计问题;本章,就来讲讲,这两个部位出现问题的`通治法`!

---------就像,看到发热流鼻涕的,就给他999感冒灵!  看到这两出现问题,我也先给开个`通药`!

正文:

问题分析:

当通过Telnet检测到Scrapy中有大量的请求(request)和数据项(item)堆积,并且最老的请求或数据项的时间戳显示为较长时间前(如几百秒前),是什么原因导致的呢?

答:

  • 爬虫逻辑问题:可能的原因是爬虫逻辑中存在问题,导致爬虫无法及时处理或发送请求。这可能是由于某些错误的条件判断或复杂的逻辑流程导致的。例如,在处理请求时,可能发生了死循环或未正确处理返回的响应,导致请求无法完成并持续堆积。
  • 下载或处理延迟:这个问题也可能由于下载或数据处理的延迟引起。如果某些请求需要较长时间才能完成下载或处理,而在此期间新的请求不断被添加到队列中,就会导致堆积的情况。这可能是由于目标网站的响应时间较慢、Scrapy设置的下载延迟较低或数据处理过程较为耗时等原因引起的。
  • 并发设置不合理:Scrapy的并发设置可能会影响请求和数据项的堆积情况。如果并发设置过高,则会导致过多的请求同时发送和处理,可能会造成请求堆积。相反,如果并发设置过低,则处理速度可能无法跟上请求的生成速度,也会导致请求和数据项的堆积。
  • 资源限制:Scrapy运行的系统资源限制(例如CPU、内存、网络带宽等)也可能是问题的原因。如果系统资源不足,Scrapy无法及时处理请求和数据项,导致堆积的情况发生。

剖析+解决:

既然已经知道了,可能是这4项解决影响的;那么怎么解决他们呢?

答:

爬虫逻辑问题:
  • 仔细检查爬虫代码并进行逐行调试,查找可能导致请求堆积的逻辑错误。
  • 检查条件判断和循环语句是否正确,确保它们能够正常终止和跳出。
  • 确保在处理响应或生成请求时,正确地使用回调函数和管道等Scrapy机制。

下载或处理延迟:
  • 增加下载延迟(DOWNLOAD_DELAY),使得请求之间有较长的时间间隔。
  • 检查和优化爬虫中的数据处理过程,确保它们能够高效地处理数据项。
  • 调整Scrapy的并发设置,适当限制同时发送和处理的请求数量。
并发设置不合理:
  • 调整Scrapy的并发设置,适当增加并发请求和并发处理的数量,以提高处理能力。
  • 分析系统资源使用情况,确保调整后的并发设置不会超出系统资源的限制。
  • 根据目标网站的响应速度和服务器负载情况,动态调整并发设置。

资源限制:
  • 增加系统资源,例如更强大的计算机、更高带宽的网络连接等。这样可以提供更多的处理能力以减轻请求堆积的压力。
  • 使用分布式架构,如Scrapy-Redis或Scrapyd,将任务分发到多个节点上进行处理,以扩展处理能力。
  • 优化爬虫代码和数据处理过程,提高其效率以减少资源占用。

问题通治法:

1. 增加并发限制:检查Scrapy的并发设置,例如`CONCURRENT_REQUESTS`和`CONCURRENT_ITEMS`。你可以尝试增加这些设置的值,以允许更多的同时请求和处理,从而减少请求和数据项的堆积。不过,你需要根据自己的网络和系统资源进行适当的调整,避免对服务器和网络造成过大的压力。

        细讲:
  • 打开Scrapy项目的设置文件(通常是settings.py),找到并发设置的相关项,例如CONCURRENT_REQUESTS和CONCURRENT_ITEMS。
  • 增加这些设置的值,以允许更多的同时请求和处理。例如,将CONCURRENT_REQUESTS设置为10,CONCURRENT_ITEMS设置为100。
# settings.py
CONCURRENT_REQUESTS = 10
CONCURRENT_ITEMS = 100

2. 调整下载延迟:如果请求过多导致了堆积,你可以尝试调整下载延迟。通过增加`DOWNLOAD_DELAY`设置的值,可以让Scrapy在发送请求之间增加延迟,以减缓请求速率,防止过快地发送请求。这样有助于控制请求的堆积情况。

  • 在Scrapy项目的设置文件中找到DOWNLOAD_DELAY设置项。
  • 增加DOWNLOAD_DELAY的值,以减慢请求的发送速率。例如,将DOWNLOAD_DELAY设置为2秒。
# settings.py
DOWNLOAD_DELAY = 2

3. 优化爬虫逻辑:检查你的爬虫逻辑,确保它们高效而无死循环。确保你所写的爬虫逻辑能够在合理的时间内处理请求和数据项,不会由于错误的逻辑导致大量的堆积。

  • 检查你的爬虫逻辑,确保它们高效而无死循环。
  • 确保你的代码在处理每个请求时能够合理地执行必要的操作,而不会导致过度延迟或占用过多资源。


4. 使用分布式爬虫或调度器:如果以上方法无法解决问题,可以考虑使用分布式爬虫框架,如Scrapy-Redis或Scrapyd,以分散请求和数据项的处理负载。这样可以将请求和数据项分发到多个爬虫节点进行处理,从而减轻单个Scrapy进程的压力。

5. 调整资源配置:检查你的系统资源配置,确保Scrapy运行时有足够的CPU、内存和网络带宽。如果你的系统资源不足,可能会导致请求和数据项积压的问题。

总结:

在我们的Scrapy世界中,当遇到请求堆积和数据项积压的问题时,我们需要像一名智慧医生一样,找出病因并施以治疗。
首先,爬虫逻辑问题就像是食道中的狭窄,导致食物无法顺利通过。我们需要检查代码,确保没有死循环的陷阱,并确保正确处理返回的响应,避免请求不断堆积在那里。
其次,下载延迟问题就像是吞咽过快,导致食物堆积在胃里。调整下载延迟就像是调整我们的吃饭速度,减慢发送请求的速率,让Scrapy有足够的时间处理已下载的数据。
并发设置不合理就像是刚开的高速公路上交通堵塞。我们需要合理调整并发设置,增加交通流量的容量,使更多的请求能够顺畅通过。
最后,资源限制就像是我们缺乏能量和力量来处理大量请求和数据项。我们需要增加系统资源,就像补充营养和锻炼身体一样,让Scrapy拥有更强的处理能力。
通过综合利用这些治疗方法,就像一名医生调配药方一样,我们可以很好地解决Scrapy中的请求和数据项堆积问题,让我们的爬虫在网络世界中自由畅行。

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

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

相关文章

面试题:JVM 对锁都进行了哪些优化?

文章目录 锁优化自旋锁和自适应自旋锁消除锁粗化逃逸分析方法逃逸线程逃逸通过逃逸分析,编译器对代码的优化 锁优化 jvm 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。 自旋锁和自适应自旋 现在大多的处理器都是…

node-red:使用node-red-contrib-amqp节点,实现与RabbitMQ服务器(AMQP)的消息传递

node-red-contrib-amqp节点使用 一、简介1.1 什么是AMQP协议?1.2 什么是RabbitMQ? -> 开源的AMQP协议实现1.3 RabbitMQ的WEB管理界面介绍1.3 如何实现RabbitMQ的数据采集? -> node-red 二、node-red-contrib-amqp节点安装与使用教程2.1 节点安装2.2 节点使用2.2.1 amq…

LTE之接口协议

一、接口协议栈 接口是指不同网元之间的信息交互方式。既然是信息交互,就应该使用彼此都能看懂的语言,这就是接口协议。接口协议的架构称为协议栈。根据接口所处位置分为空中接口和地面接口,响应的协议也分为空中接口协议和地面接口协议。空…

WEB 3D技术 three.js 通过lil-gui 控制x y z轴数值 操作分组 设置布尔值控制 颜色材质控制

上文 WEB 3D技术 three.js 通过lil-gui管理公共事件中 我们用 lil-gui 处理了一下基础事件和按钮的管理 那么 本文 我们来具体说说它能做的其他事 我们先将基础代码改成这样 import ./style.css import * as THREE from "three"; //引入lil-gui import { GUI } fro…

基于docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

算法模板之队列图文详解

🌈个人主页:聆风吟 🔥系列专栏:算法模板、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️模拟队列1.1 🔔用数组模拟实现队列1.1.1 👻队列的定…

【设计模式】RBAC 模型详解

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是 RBAC 呢? 二、RBAC 的组成 三、RBAC 的优缺点 3.1 优点: 3.2 缺点: 四、RBAC 的…

java定义三套场景接口方案

一、背景 在前后端分离开发的背景下,后端java开发人员现在只需要编写接口接口。特别是使用微服务开发的接口。resful风格接口。那么一般后端接口被调用有下面三种场景。一、不需要用户登录的接口调用,第二、后端管理系统接口调用(需要账号密…

2024华为OD机试真题指南宝典—持续更新(JAVAPythonC++JS)【彻底搞懂算法和数据结构—算法之翼】

PC端可直接搜索关键词 快捷键:CtrlF 年份关键字、题目关键字等等 注意看本文目录-快速了解本专栏 文章目录 🐱2024年华为OD机试真题(马上更新)🐹2023年华为OD机试真题(更新中)🐶新…

《工具箱-SVN》SVN安装、备份、迁移教程

文章目录 一、服务器搭建SVN1.检查SVN是否存在2.安装SVN3.创建版本库4.创建版本库存放文件地址5.修改配置文件5.1 vim authz5.2 vim passwd5.3 vim svnserve.conf 6.启动并查看SVN7.SVN Checkout8.SVN Update9.SVN Commit 二、SVN-无法连接主机,目标计算机积极拒绝&…

【MySQL】表的基本查询

表的基本查询 表的增删查改1. Create(1)单行数据 全列插入(2)多行数据 指定列插入(3)插入否则更新(4)替换 2. Retrieve(1)select 列a. 全列查询b. 指定列查…

【第七在线】数据分析与人工智能在商品计划中的应用

随着技术的不断进步,数据分析和人工智能(AI)已经成为了现代商品计划的关键组成部分。在服装行业,这两项技术正在帮助企业更好地理解市场需求、优化库存管理、提高生产效率和提供更好的客户体验。本文将深入探讨数据分析和人工智能…

java并发编程十 原子累加器和Unsafe

文章目录 原子累加器cas 锁原理之伪共享 UnsafeUnsafe CAS 操作 原子累加器 累加器性能比较 private static <T> void demo(Supplier<T> adderSupplier, Consumer<T> action) {T adder adderSupplier.get();long start System.nanoTime();List<Thread…

2023年12月GESP Python五级编程题真题解析

【五级编程题1】 【试题名称】&#xff1a;小杨的幸运数 【问题描述】 小杨认为&#xff0c;所有大于等于a的完全平方数都是他的超级幸运数。 小杨还认为&#xff0c;所有超级幸运数的倍数都是他的幸运数。自然地&#xff0c;小杨的所有超级幸运数也都是幸运数。 对于一个…

智能优化算法应用:基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金枪鱼群算法4.实验参数设定5.算法结果6.…

LINUX系统安装和管理

目录 一.应用程序 对比应用程序与系统命令的关系 典型应用程序的目录结构 常见的软件包装类型 二.RPM软件包管理 1.RPM是什么&#xff1f; 2.RPM命令的格式 查看已安装的软件包格式 查看未安装的软件包 3.RPM安装包从哪里来&#xff1f; 4.挂载的定义 挂载命令moun…

JavaWeb笔记之SVN

一、版本控制 软件开发过程中 变更的管理&#xff1b; 每天的新内容;需要记录一下&#xff1b; 版本分支;整合到一起&#xff1b; 主要的功能对于文件变更的追踪&#xff1b; 多人协同开发的情况下,更好的管理我们的软件。 大型的项目;一个团队来进行开发; 1: 代码的整合 2: 代…

机器人创新实验室任务三参考文档

一、JAVA环境配置 需要在Linux里面下载并且安装java。 sudo apt-get install openjdk-17-jre-headless 打开终端并且运行指令&#xff0c;用apt下载安装java。官方用的好像是java11&#xff0c;我安装的是java17。 如果无法定位软件安装包&#xff0c;可以试试更新一下 sudo …

4.svn版本管理工具使用

1. 什么是SVN 版本控制 它可以记录每一次文件和目录的修改情况,这样就可以借此将数据恢复到以前的版本,并可以查看数据的更改细节! Subversion(简称SVN)是一个自由开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空 SVN的优势 统一的版本号 Subversi…

【clickhouse】在CentOS中离线安装clickhouse

一、下载地址 通过以下链接进行rpm安装包的下载 https://packages.clickhouse.com/rpm/stable/ 根据需求下载对应版本 注意&#xff1a;ClickHouse 20.8.2.3版本新增加了 MaterializeMySQL 的 database 引擎&#xff0c;该 database 能映射到 MySQL 中的某个 database&#…