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"。
这些参数和我们设置的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秒,避免被网站检测到。
根据以上内容,你是否能够理解这些参数的重要性以及如何进行设置了呢?可以拿自己的项目试试新技能,一起`上分`吧!