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

时间:2017-05-25 18:50:56

标签: python scrapy web-crawler scrapy-spider

首先发布在这里,很长一段时间潜伏着。 我想问一下关于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元素,如果存在,则更新计数器。我希望在请求完成后看到最终的计数器。 有没有办法做到这一点? 非常感谢你。

1 个答案:

答案 0 :(得分:0)

您可以这样做,但这不是使用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