python - 在scrapy中处理启动请求动作
问题描述
当我产生请求时,我面临着奇怪的行为,理想情况下,每个请求都会在 6 秒后产生,但实际发生的是,在 60 (6*10) 秒后,所有请求都立即发出,我能够解决这个问题由CONCURRENT_REQUESTS=1
.
import scrapy
import time
from scrapy.utils.response import open_in_browser
class TestSpider(scrapy.Spider):
name = 'Test'
allowed_domains = ['example.com']
def start_requests(self):
for _ in range(10):
time.sleep(6)
url = "http://www.example.com"
yield scrapy.Request(url=url,callback=self.parse,dont_filter=True)
def parse(self,response):
open_in_browser(response)
如果我设置CONCURRENT_REQUESTS=3
它将等待 18 秒产生 3 个请求,然后移动到下一个 3(等待 18 秒然后产生)等等。(我time.sleep(6)
用来替换我拥有的一个需要花费这么多时间才能完成的功能)。如何强制它产生请求(如常规生成器)
解决方案
您需要使用DOWNLOAD_DELAY
设置来在请求之间进行延迟。
import scrapy
import time
from scrapy.utils.response import open_in_browser
class TestSpider(scrapy.Spider):
name = 'Test'
allowed_domains = ['example.com']
custom_settings = {
"DOWNLOAD_DELAY": 6,
"RANDOMIZE_DOWNLOAD_DELAY": False
}
def start_requests(self):
for _ in range(10):
url = "http://www.example.com"
yield scrapy.Request(url=url,callback=self.parse,dont_filter=True)
def parse(self,response):
open_in_browser(response)
此代码执行以下操作:
作为start_requests
方法的结果 - 蜘蛛将向 scrapy 调度程序队列添加 10 个请求。(这并不意味着 scrapy 立即执行 10 个请求)。
使用DOWNLOAD_DELAY
和RANDOMIZE_DOWNLOAD_DELAY
设置:
Scrapy 下载器从调度程序队列中获取请求并将其发送到您的网站。
收到响应时 -> 调用回调方法。
此过程每 6 秒重复一次(如DOWNLOAD_DELAY
设置中所定义)
推荐阅读
- c++ - 有没有办法将两个输入图像堆叠到卤化物发生器中的单个 4 维缓冲区中?
- javascript - 如何检测嵌入上的反应,然后根据反应执行操作?
- python - Pandas to_sql 没有在 sqlalchemy 中声明模式
- ruby - Coinbase API 4.2.1 帐户请求方法,缺少参数:`type`
- php - 查询过去一年 - Laravel 5.8
- html - 使用overflow-y:auto时有没有办法隐藏滚动条?
- r-markdown - 在 Rmarkdown 中使用 Tufte 样式将图表绘制为边距图
- html - 时间延迟打破了针对 iframe 的形式
- influxdb - 将 LAST 与 DISTINCT 或 GROUP BY 结合使用?
- java - 如何在 Google Colab 中更改 Java 版本?