我有一个抓取网站的 Scrapy Spider,该网站需要刷新 token 才能访问它们。
def get_ad(self, response):
temp_dict = AppextItem()
try:
Selector(response).xpath('//div[@class="messagebox"]').extract()[0]
print("Captcha found when scraping ID "+ response.meta['id'] + " LINK: "+response.meta['link'])
self.p_token = ''
return Request(url = url_, callback=self.get_p_token, method = "GET",priority=1, meta = response.meta)
except Exception:
print("Captcha was not found")
我有一个 get_p_token
方法可以刷新 token 并分配给 self.p_token
get_p_token
在发现验证码时调用,但问题是,其他请求继续执行。
我希望如果找到验证码,在 get_p_token
执行完成之前不要发出下一个请求。
我有 priority=1
但这没有帮助。
附言:
实际上,该 token 已传递到每个 URL,因此我想等到找到新 token ,然后再抓取其余 URL。
最佳答案
您应该将验证码解决逻辑实现为 middleware .参见 captcha-middleware寻找灵感。
中间件应负责为请求分配正确的 token (来自 process_request()
)并检测 CAPTCHA 提示(来自 process_response()
)。
在中间件中,您可以使用 Scrapy 以外的东西(例如 requests )以同步方式执行 CAPTCHA 解决所需的请求,以防止新请求在完成之前开始。
当然,任何已触发的并行请求都已经开始,因此在技术上可以在没有更新 token 的情况下发送一些请求。但是,这些应该自动重试。您可以将中间件配置为在重试时更新这些请求的 token ,方法是确保您的中间件与重试中间件能够很好地协同工作。
关于python - 等待请求完成 - Python Scrapy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39836404/