暂停初始解析功能,直到其他功能完成
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
首先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