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

news2025/1/19 14:32:44

诊断篇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.coloradmin.cn/o/1331023.html

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

相关文章

更改WiseAlign软件界面图标方法

更改WiseAlign软件界面图标方法 未替换时 首先将图片转换为BMP格式,在搜索栏处输入画图,点击打开画图工具 按住图标拖动到画布内,或是直接CtrlV将图标复制到画布内 点击文件,再点击另存为 保存类型选择“24位位图(*.bm…

SpringBoot3-基础特性

文章目录 自定义 banner自定义 SpringApplicationFluentBuilder APIProfiles指定环境环境激活环境包含Profile 分组Profile 配置文件 外部化配置配置优先级 外部配置导入配置属性占位符 单元测试-JUnit5测试组件测试注解断言嵌套测试参数化测试 自定义 banner banner 就是启动…

MySQL数据库 触发器

目录 触发器概述 语法 案例 触发器概述 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的soL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录&am…

idea多光标无法取消

通常按住alt 鼠标左键。是多光标操作 但是不知道怎么按照了导致一直多光标 使用 altshiftinsert 取消多光标

【优质书籍推荐】LoRA微调的技巧和方法

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

【Unity基础】9.地形系统Terrain

【Unity基础】9.地形系统Terrain 大家好,我是Lampard~~ 欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢 (一)地形编辑器Terrain (1)创建地形 游戏场景中大多数的山川河流地表地貌都是基…

vue微乾坤子应用开发及ele组件开发时问题记录

一. 微乾坤 1. 新增page页面路由,pmi权限中心配置正常,跳转链接正确,但路由未找到403. 解决: 新增的配置是page类型,transformQianKunRoute方法转换微前端路由数据 时,过滤未兼容page型的路由, 解决 [menu,…

Git的总体认知与具体实现

GIt概念 是一种分布式控制管理器 tips:敏捷开发 -> 先上线,后续开发再继续开发 集中式和分布式 集中式的版本控制系统每次在写代码时都需要从服务器中拉取一份下来,并且如果服务器丢失了,那么所有的就都丢失了,你本机客户端仅…

神经网络:深度学习基础

1.反向传播算法(BP)的概念及简单推导 反向传播(Backpropagation,BP)算法是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见算法。BP算法对网络中所有权重计算…

MySQL代码笔记

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻表的增删查改创建表格&…

word2003 open word2007+

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

Python+Playwright自动化测试--playwright处理浏览器多窗口切换

1.简介 浏览器多窗口的切换问题相比大家不会陌生吧,之前小编在javaselenium系列文章中就有介绍过。大致步骤就是:使用selenium进行浏览器的多个窗口切换测试,如果我们打开了多个网页,进行网页切换时,我们需要先获取各…

使用Java语言解决古典猴子分桃问题

一、主要思想 五只猴子分桃 第一只猴子呀 平均分成五分 挤出来多一个 多的扔入海中 拿了其中一份 来了五只猴子 均是如此操作 第五只猴子呀 还存有多少只 二、基本代码 public class MonkeyPeach {public static void main(String[] args){int n 1;int m 0;int flag1;int…

MyBatis的延迟加载!!!

首先:MyBatis的关联查询!!!(一对一、一对多、多对多)-CSDN博客以这个项目为基础。 1.在UserMapper接口中创建一个方法: package com.by.mapper;import com.by.pojo.User;import java.util.Lis…

GDAL3.7编译一:普通压缩类算法库编译(zlib/zstd/lz4/liblzma/brotli)

通过整理gdal所有依赖库,发现压缩类的三方库被依赖的频率很高,而且这些三方库又不依赖别的库,因此首先编译。 1.zlib库编译: 源码下载地址:GitHub - madler/zlib: A massively spiffy yet delicately unobtrusive co…

电力系统风储联合一次调频MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 简介: 同一电力系统在不同风电渗透率下遭受同一负荷扰动时,其频率变化规律所示: (1)随着电力系统中风电渗透率的不断提高,风电零惯性响…

HTML5+CSS3+Vue小实例:彩带圣诞树

实例:彩带圣诞树 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><…

⭐Unity 读取本地图片再区域裁剪

现在需求是将本地的图片读取之后再区域截图成新的图片 话不多说直接上代码 using UnityEngine; using System.IO;public class LocalRegionCapture : MonoBehaviour {public string fullScreenImagePath "Assets/SavedImages/fullScreenScreenshot.png";public str…

C语言学习NO.9-指针(一)内存和地址,指针变量,指针变类型的意义,const修饰指针,指针运算,野指针,assret断言,指针的使用和传址调用

指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 1.指针是内存中一个最小单元的编号&#xff0c;也就是地址&#xff1b; 2.平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量。 总结&#xff1a;指针就是地址&#xff08;变量的地…

玩转大数据21:基于FP-Growth算法的关联规则挖掘及实现

1.引言 关联规则挖掘是大数据领域中重要的数据分析任务之一&#xff0c;其可以帮助我们发现数据集中项目之间的关联关系。关联规则挖掘是指在交易数据或者其他数据集中&#xff0c;发现一些常见的关联项&#xff0c;如购物篮中经常一起出现的商品组合。关联规则挖掘的应用非常…