обрабатывать стартовые запросы в скрапе - PullRequest
0 голосов
/ 07 февраля 2020

Я сталкиваюсь со странным поведением при выдаче запросов. В идеале каждый запрос будет получен через 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 se c, а затем уступить) и скоро. (Я использую time.sleep(6) для замены имеющейся у меня функции, которая занимает столько времени). Как я могу заставить его выдать запрос (как обычный генератор)

1 Ответ

0 голосов
/ 08 февраля 2020

Вам необходимо использовать настройку 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 - паук добавит 10 запросов в очередь планировщика scrapy. (Это не означает, что scrapy немедленно выполнит 10 запросов)

Использование настроек DOWNLOAD_DELAY и RANDOMIZE_DOWNLOAD_DELAY:
Загрузчик Scrapy получает запрос из очереди планировщика и отправляет его на ваш сайт.
При получении ответа -> вызывается метод обратного вызова.
Этот процесс повторяется каждые 6 секунд (как определено в настройке DOWNLOAD_DELAY)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...