Scrapy / Python: запуск логики после завершения выданных запросов

#python #scrapy

#python #scrapy

Вопрос:

Что я делаю:

 def parse(self, response):

    products_urls = response.css('.product-item a::attr(href)').extract()

    for product_url in product_urls:
        yield Request(product_url, callback=self.parse_product)

    print( "Continue doing stuff...." )


def parse_product(self, response):
    title = response.css('h1::text').extract_first()
    print( title )
}
  

В этом примере сначала будет выведен код, Continue doing stuff.. а затем будут напечатаны названия продуктов. Я бы хотел, чтобы она выполнялась иначе, сначала выполняйте запросы и печатайте заголовки, и только потом печатайте Continue doing stuff..

ОБНОВЛЕНИЕ: @Georgiy в комментариях спросил, нужны ли мне ранее очищенные данные о продукте.

Ответ — да, это упрощенный пример. После получения данных я хочу манипулировать этими данными.

Комментарии:

1. Это зависит от … что именно «Продолжать делать вещи ….» ожидается, что ваше приложение будет делать?. Требуется ли для этого ранее очищенные данные продукта?

2. @Georgiy Я обновил свой вопрос ответом на ваш комментарий.

Ответ №1:

Вы можете переместить логику в parse_product функцию. Например:

     def parse(self, response):
        products_urls = response.css('.product-item a::attr(href)').extract()

        self.count = len(products_urls)
        if self.count == 0:
            self.onEnd()
        else:
            for product_url in product_urls:
                yield Request(product_url, callback=self.parse_product)

    def onEnd(self):
        print( "Continue doing stuff...." )


    def parse_product(self, response):
        title = response.css('h1::text').extract_first()
        print( title )
        self.count -= 1
        if (self.count == 0):
            self.onEnd()