(Scrapy)生成请求/生成并执行请求/执行请求

时间:2019-10-04 09:07:41

标签: python scrapy request yield

我正在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 :(得分:0)

您可能会发现figure here对回答问题很有用。

来自yield方法的parse_list_page正在将请求产生回“引擎”(图中的步骤7)。 yield中的extract_product正在退回到parse_list_pageparse_list_page然后立即将它们放回引擎。

请注意,extract_product中的所有代码也可以直接进入parse_list_page以形成一个方法。拥有两种方法可以很好地分离逻辑。

scrapy data flow

答案 1 :(得分:0)

谢谢你,汤姆。我可以更好地理解它。 我知道有Scheduler,并且可能会有延迟。

但是,当我通过 yield req 代码时,该过程完成了,而没有执行请求。

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

为什么调度程序直到整个过程完成才执行接收到的请求?