爬虫工作量由小到大的思维转变---<第二十章 Scrapy几个常规参数的调整策略心得>

发布时间:2023年12月22日

前言:

CONCURRENT_REQUESTS = 32 ?# 设置请求并发数
DOWNLOAD_TIMEOUT = 5 ?# 设置超时时间为5秒
RETRY_TIMES = 2 ?# 设置你想要的重试次数
DOWNLOAD_DELAY= 0.1 ?# 控制两个连续请求之间的延迟时间,设置为0.1表示每次请求之间的等待时间为0.1秒
CONCURRENT_REQUESTS_PER_DOMAIN = 20 ?# 每个域名的并发请求数,设置为3表示同时只能有3个请求发送到同一个域名。
CONCURRENT_REQUESTS_PER_IP= 2 ?# 每个IP的并发请求数,控制在同一时间向同一个IP地址发送的并发请求数量

前面章节没有详细讲述这些看似简单的参数的调整方法,导致这些参数的作用没有得到充分发挥。就像在王者荣耀中,吕布的技能一挥、一吸和一跳,看似简单,但在实际运用中,如何使技能,才能够让你的队友打出一波"666"?

因此,在本章中,我将充当一个"Scrapy参数技能教官"的角色,带你把这个设置(技能)给他嚼透了,让你的项目"666"。

正文:

问题思考:

  1. CONCURRENT_REQUESTS和CONCURRENT_REQUESTS_PER_DOMAIN参数在Scrapy中扮演着什么角色?为什么要区分全局和局部的并发请求数?
  2. 如果将CONCURRENT_REQUESTS_PER_DOMAIN设置得过高,会出现什么问题?如何合理设置该参数以避免被目标网站封禁?
  3. RETRY_TIMES参数控制爬虫的重试次数。在网络不稳定或请求频率过高的情况下,如何合理设置重试次数,以确保爬取的数据完整性和稳定性?
  4. DOWNLOAD_DELAY参数用于控制连续请求之间的延迟时间。当请求速度过快时,可能会对目标网站造成压力,甚至被封禁。如何根据目标网站的反爬策略合理设置该参数?
  5. CONCURRENT_REQUESTS_PER_IP参数用于控制同时向同一IP地址发送的并发请求数量。为什么要限制并发请求数,以及合理设置该参数的依据是什么?
  6. 在设置DOWNLOAD_DELAY时,应注意哪些因素?如何在单机调试和实际生产环境中合理设置DOWNLOAD_DELAY值?

解决复盘:

这些参数和我们设置的CONCURRENT_REQUESTS(调整全局的,并且整个Scrapy项目都遵循这个最高限制)以及CONCURRENT_REQUESTS_PER_DOMAIN(同一个域名的并发最高限制)有关!举个例子,假设在你的Scrapy项目中,需要分别对"百度/B站/抖音"三个网站发起请求,然后

CONCURRENT_REQUESTS = 32
CONCURRENT_REQUESTS_PER_DOMAIN = 8

那么,最高并发数是8*3(域名数)= 24个,并不是32个——这一点需要你明确。

所以,即使你把CONCURRENT_REQUESTS调节到100,也不会有太大影响,因为整个项目的最高并发是24个!

有些人可能会将全局设置为30,局部域名设置为10;达到了最高限制...

然而,他们没有考虑到其他问题,比如"重试/异常/超时"。

重试次数:RETRY_TIMES
异常:抛出(根据自己的代码设置)
超时:DOWNLOAD_TIMEOUT

当程序正常运行时,我们的并发量已经达到了最高限制,30/10。但一旦出现"重试/异常/超时"的情况,就需要新的线路进行请求。这时候,我们的程序已经达到负荷极限,应该如何完成由"超时/异常"引发的重试任务呢?

因此,在设置局部并发数时,不要将其与全局并发数设置得一样,要留出一些余量,以便将"重试请求"分配到全局中的空闲线路上。

这时候,我们可以有更好的设置方式:全局36/局部10 —— 留出6个空闲线路,以备突发事件。

......(当你明确理解了上述问题,请继续阅读以下内容!)

你理解了余量,就可以理解CONCURRENT_REQUESTS_PER_IP了!

接下来还是以前面的案例为例,假设我每次通过API请求代理IP的数量设置是多少比较合适呢?

如果你的最高请求数是30,那你的IP池最好保持在35-40个左右;也就是说,每次通过API请求这个数量(因为很多网站对同一个IP同时请求的次数有限制,稍微错开时间即可)。因此,个人建议将CONCURRENT_REQUESTS_PER_IP设置为1。

这样设置后,你可以同时发起最高30个请求,并使用额外的5-10个IP填充到全局空闲线路中。这样,你的程序只要其他逻辑没有问题,速度就是每次30个请求,多出来的空余线路用于后续请求和维护,程序运行流畅且高效。

对于DOWNLOAD_DELAY这个值,在单机调试时,建议将其调高;例如设置为3秒基本延迟,在使用代理IP后,可以将其设置为0或0.1秒。你也可以设置DOWNLOAD_DELAY为(2.5, 3)这样的浮动范围,不至于卡死在3秒,避免被网站检测到。

总结:

根据以上内容,你是否能够理解这些参数的重要性以及如何进行设置了呢?可以拿自己的项目试试新技能,一起`上分`吧!

文章来源:https://blog.csdn.net/m0_56758840/article/details/135136719
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。