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