暂停初始解析功能,直到其他功能完成

Pause initial parse function until others are completed

首先post这里,潜伏已久。 我想问一些关于scrapy的问题。这是我第一次使用它,我设法让它工作,但我对处理请求的顺序有一些疑问。

我有一个 for 循环,它产生一些对不同链接的请求,并调用另一个解析函数在那里做一些事情。

有没有办法暂停第一个解析函数,以便让出的请求先完成,然后再继续下一个?

    evenselectorlist = response.css('table[id="result_table"] tr.even')
    for evenselector in evenselectorlist:
        item = LetsgoItem()
        relative = evenselector.css('a[title="links"]::attr(href)').extract_first()
        item['url'] = response.urljoin(relative)
        yield scrapy.Request(response.urljoin(relative), callback=self.parse2,meta={'item':item},dont_filter=True)

    #do some more stuff AFTER the requests have been completed

例如,我的 parse2 函数检查请求的 url 是否有特定的 html 元素,然后如果它存在,它会更新计数器。我想在请求全部完成后看到最后的计数器。 有什么办法吗? 非常感谢。

你可以做到,但这不是使用 scrapy 的好方法。我建议发送第一个请求,然后在回调之后发送其余请求,例如:

    ...
    evenselectorlist = response.css('table[id="result_table"] tr.even')
    relative = evenselectorlist[0].css('a[title="links"]::attr(href)').extract_first()
    item = LetsgoItem()
    item['url'] = response.urljoin(relative)
    yield scrapy.Request(
        response.urljoin(relative),
        callback=self.extra_parse,
        meta={'item': item, 'extra_selectors': evenselectorlist[1:]},
        dont_filter=True,
    )

def extra_parse(self, response):
    yield response.meta['item']

    for evenselector in response.meta['extra_selectors']:
        item = LetsgoItem()
        relative = evenselector.css('a[title="links"]::attr(href)').extract_first()
        item['url'] = response.urljoin(relative)
        yield scrapy.Request(
            response.urljoin(relative), 
            callback=self.parse2,
            meta={'item':item},
            dont_filter=True
        )

    #do some more stuff AFTER the requests have been completed