Является ли Scrapy асинхронным по умолчанию? - PullRequest
1 голос
/ 07 мая 2020

Я недавно запускал паука в своем проекте, но мне кажется, что он ждет, пока одна страница не будет завершена, чтобы перейти на другую. если я прав в характере scrapy, он перемещается на другую страницу, пока не будет получен предыдущий ответ. на этой странице после прокрутки я увидел, что используется async def, что означает, что метод был явно сделан асинхронным путем добавления этого. и если я не добавлю async-await в свои пауки, они не станут асинхронными. они ждут ответа? пожалуйста, дайте мне знать, если у меня возникнут какие-либо заблуждения и заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Scrapy по умолчанию является асинхронным.

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

Единственная причина, по которой ваши пауки могут показаться синхронными, заключается в том, что вы получаете новый объект Request только из обратного вызова предыдущего запроса. Если вы получаете несколько запросов из start_requests или имеете несколько URL-адресов в start_urls, они будут обрабатываться асинхронно в соответствии с вашими настройками параллелизма (по умолчанию Scrapy - 8 одновременных запросов на домен, всего 16).

0 голосов
/ 08 мая 2020

да, поскольку @Gallaecio сказал, что scrapy по умолчанию асинхронный. и я хочу добавить, что могу сделать синхронную часть кода асинхронной. при этом

синхронный запрос

def parse(self, response, current_page):
    url = 'https://example.com/search?page={}'
    # do some stuff
    self.current_page += 1
    yield Request(url.format(current_page), call_back=self.parse)

асинхронный запрос

def parse(self, response):
    url = 'https://example.com/something?page={}'
    # do some stuff
    for page in range(self.total_pages): # variables are self explainable
        yield Requests(url.format(page), callback=self.parse)


...