首页 > 解决方案 > 在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)用来替换我拥有的一个需要花费这么多时间才能完成的功能)。如何强制它产生请求(如常规生成器)

标签: pythonscrapy

解决方案


您需要使用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_DELAYRANDOMIZE_DOWNLOAD_DELAY设置:
Scrapy 下载器从调度程序队列中获取请求并将其发送到您的网站。
收到响应时 -> 调用回调方法。
此过程每 6 秒重复一次(如DOWNLOAD_DELAY设置中所定义)


推荐阅读