Обработка элементов Scrapy, блокирующих новые запросы в режиме широкого сканирования - PullRequest
0 голосов
/ 08 ноября 2019

В настоящее время я создаю сценарий Scrapy, который выполняет широкий обход со следующими настройками:

'CONCURRENT_REQUESTS': 600,
'CONCURRENT_REQUESTS_PER_DOMAIN': 25,
'CONCURRENT_ITEMS': 250,
'REACTOR_THREADPOOL_MAXSIZE': 600,

Чтобы выполнить широкий обход, я перебираю список доменов в моем пауке следующим образом:

    def start_requests(self):
        for domain in self.domains:
            yield scrapy.Request("https://www." + domain['domain'], self.parse, meta={'domain':domain})

Цикл работает хорошо, совершая более 10 вызовов в секунду.

Я заметил, однако, что весь мой отход замедляется, как только я отправляю свои первые элементы для обработки в моем конвейере(который выполняет простые циклы и условные проверки).

Похоже, что проблема в том, что цикл в start_requests () ожидает завершения обработанных в данный момент элементов, прежде чем продолжить мой общий обход новых доменов, и это несмотря на то, что это не так. ниже моего предела 'CONCURRENT_REQUESTS'.

Результатом является сценарий, который выполняется в 2–3 раза медленнее.

Разве обработка элементов не должна блокировать запросы?

1 Ответ

1 голос
/ 08 ноября 2019

Scrapy использует параллелизм, а не многопоточность .

Сетевой ввод и вывод (отправленные запросы и полученные ответы) не блокируют ваш код, но никогда не будут двумя частями вашего кодавыполняется одновременно.

Scrapy использует Twisted, и если вы не можете сделать свой код более эффективным, вы можете сделать так, чтобы ваш конвейерный код выполнялся в отдельном потоке Twisted way .

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