爬虫工作量由小到大的思维转变---<第二十三章 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.mfbz.cn/a/266908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaOOP篇----第十四篇

系列文章目录 文章目录 系列文章目录前言一、Hashcode的作用二、Java的四种引用,强弱软虚三、Java创建对象有几种方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码…

mac m1芯片 pytorch安装及gpu性能测试

pytorch 使用mac的m1芯片进行模型训练。 #小结:在数据量小和模型参数少,batch_size小时,cpu训练更快(原因:每次训练时数据需要放入GPU中,由于batch_size小。数据放入gpu比模型计算时间还长&#xff09…

SpringIOC之AbstractMessageSource

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

K8S 外部访问配置、 Ingress、NodePort

将K8S部署应用提供给外部访问一般有三种方式: NodePort 暴露端口到节点,提供了集群外部访问的入口LoadBalancer 需要负载均衡器(通常都需要云服务商提供,裸机可以安装 METALLB 测试)Ingress 统一管理 svc的外部访…

Bloom过滤器

Bloom过滤器 一、概述二、原理三、优缺点1. 优点2.缺点 四、Bloom过滤器在比特币中的应用五、项目应用步骤1. pom.xml引入依赖2. 样例代码 六、Java版简易实现 一、概述 Bloom过滤器是一个允许用户描述特定的关键词组合而不必精确表述的基于概率的过滤方法。它能让用户在有效搜…

详解Vue3中的内置组件(transition)

本文主要介绍Vue3中的内置组件(transition)的普通写法和setup写法。 目录 一、在普通写法中使用内置组件(transition)二、在setup写法中使用内置组件(transition)三、使用注意项 在Vue3中,内置了…

Linux poll 和 select 机制

poll select 介绍 使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个 或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来 读或写.…

Nessus详细安装-windows (保姆级教程)

Nessus描述 Nessus 是一款广泛使用的网络漏洞扫描工具。它由 Tenable Network Security 公司开发,旨在帮助组织评估其计算机系统和网络的安全性。 Nessus 可以执行自动化的漏洞扫描,通过扫描目标系统、识别和评估可能存在的安全漏洞和弱点。它可以检测…

使用 Spring Boot + MyBatis开发需要注意的事项以及开发模版

前言: 注意,本篇不适用于有相关开发经验的开发者,作为一个在职开发者,我经常在完成从0-1的模块,也就是从数据库表开始到创建实体类,以及dao层,Service层等业务需要添加相关注解,这样…

使用office打开word文档时候提示错误:0x426-0x0的解决方案

在使用office打开word文档时候提示错误:0x426-0x0。如下图: 昨天还用的好好的,怎么今天就不行了?为什么呢? 更多工作中遇到问题见:凯哥BK 这个错误导致office无法启动通常是由于office软件所依赖的服务无…

vue的表单收集案例

Vue的表单收集案例 这只是最基础的表单收集&#xff0c;并未涉及到element-ui。 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>收集表单数据</title><script type"text/javascript" src"../js…

Hago 的 Spark on ACK 实践

作者&#xff1a;华相 Hago 于 2018 年 4 月上线&#xff0c;是欢聚集团旗下的一款多人互动社交明星产品。Hago 融合优质的匹配能力和多样化的垂类场景&#xff0c;提供互动游戏、多人语音、视频直播、 3D 虚拟形象互动等多种社交玩法&#xff0c;致力于为用户打造高效、多样、…

物理模拟重力 斜抛运动计算 抛物线计算

物理模拟重力 斜抛运动计算 抛物线计算 一、介绍二、原理三、实现如下PhysicsUtil.cs 工具类Missile.cs 四、资源分享 一、介绍 模拟Unity原始重力系统进行重写&#xff0c;可是实现发射到指定目标位置并能继续当前力进行自身的弹力与摩擦继续运动 二、原理 将Unity原始不受控…

word2003 open word2007+

Win 7 C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates 还是不行&#xff0c;重装office2003吧&#xff0c;再安装转换插件&#xff0c;但是再高版本好像没转换工具

【Linux】进程管理

ps&#xff1a;报告当前进程快照。top&#xff1a;显示任务。kill&#xff1a;给一个进程发送信号。shutdown&#xff1a;关机或重启系统。 一个程序可以发动另一个程序被表述为一个父进程可以产生一个子进程&#xff0c;内核维护每个进程的信息&#xff0c;以此来保持事情有序…

【新版】软考 - 系统架构设计师(总结笔记)

个人总结学习笔记&#xff0c;仅供参考&#xff01;&#xff01;&#xff01;! →点击 笔者主页&#xff0c;欢迎关注哦&#xff08;互相学习&#xff0c;共同成长&#xff09; 笔记目录 &#x1f4e2;【系统架构设计系列】系统架构设计专业技能 计算机组成与结构操作系统信…

如何快速实现地源热泵远程监控

地源热泵远程监控解决方案 一、项目背景 山东省潍坊市盛世花园小区地源热泵项目是一个先进的供暖与制冷系统&#xff0c;旨在为整个小区提供高效且节能的温控服务。该系统主要由地下管道网络、地源热泵单元以及室内分配系统组成。 针对现有的地源热泵系统的管理和监控问题&a…

1162字符串逆序

一&#xff1a;题目 二.思路分析 1.如果不用递归&#xff0c;可以输入字符串后&#xff0c;再逆序输出&#xff0c;但是题目要求使用递归 2.使用递归&#xff1a; 2.1输入字符&#xff0c;直到输入的字符是‘&#xff01;’&#xff0c;停止输入&#xff0c;否则继续输入&…

Redis数据一致解决方案

文章目录 前言技术积累查询缓存业务流程更新缓存业务流程 更新缓存问题解决方案写在最后 前言 当前的应用服务很多都有着高并发的业务场景&#xff0c;对于高并发的解决方案一般会用到缓存来降低数据库压力&#xff0c;并且还能够提高系统性能减少请求耗时&#xff0c;比如我们…

AndroidStudio无法新建Java工程解决办法

我用的 AS 版本是 Android Studio Giraffe | 2022.3.1 Build #AI-223.8836.35.2231.10406996, built on June 29, 2023 以往新建工程都是 New project >> Empty Activity &#xff0c; 有个选择 Java 还是 Kotlin 语言的选项&#xff0c; 之后会默认生成一个 MainActi…
最新文章