(Scrapy) Генерация запроса / Генерация и выполнение запроса / Выполнение запроса - PullRequest
0 голосов
/ 04 октября 2019

Я изучаю примеры терапии на https://www.accordbox.com/blog/how-crawl-infinite-scrolling-pages-using-python/

Относительно запроса на доходность кода решения Scrapy там, я очень запутался.

Есть три запрос на доходность с. Иногда Запрос просто генерируется, иногда он генерируется и выполняется, иногда он просто выполняется.

Не могли бы вы посоветовать мне разницу между ними, пожалуйста?

Спасибо!.

def parse_list_page(self, response):
    next_link = response.xpath(
        "//a[@class='page-link next-page']/@href").extract_first()
    if next_link:
        url = response.url
        next_link = url[:url.find('?')] + next_link

        ################################
        # Generate and Execute Request
        ################################

        yield Request(                           
            url=next_link,
            callback=self.parse_list_page
        )

    for req in self.extract_product(response):
        ################################
        #Just Execute Request
        ################################
        yield req       

def extract_product(self, response):
    links = response.xpath("//div[@class='col-lg-8']//div[@class='card']/a/@href").extract()
    for url in links:
        result = parse.urlparse(response.url)
        base_url = parse.urlunparse(
            (result.scheme, result.netloc, "", "", "", "")
        )
        url = parse.urljoin(base_url, url)

        ################################
        #Just Generate Request
        ################################

        yield Request (
            url=url,
            callback=self.parse_product_page
        )

def parse_product_page(self, response):
    logging.info("processing " + response.url)
    yield None

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Спасибо, Томин. Я могу понять это немного лучше. Я могу понять, что есть Планировщик и может быть задержка.

Однако, когда я передаю код yield req , процесс завершается без выполнения запроса.

for req in self.extract_product(response):
        #yield req
        pass

Почему планировщик не выполняет полученный запрос, пока не завершится весь процесс?

0 голосов
/ 04 октября 2019

Вы можете найти цифру здесь , полезную для ответа на ваш вопрос.

yield s из метода parse_list_page возвращает запросы обратно в «Engine» (шаг 7 на рисунке). yield in extract_product возвращается к parse_list_page. parse_list_page затем немедленно возвращает их в движок.

Обратите внимание, что весь код в extract_product также может просто войти в parse_list_page, чтобы создать один единственный метод. Наличие двух методов просто прекрасно разделяет логику.

scrapy data flow

...