[英]Wait for a Request to complete - Python Scrapy
我有一个Scrapy Spider,它会抓取一个网站,该网站需要刷新令牌才能访问它们。
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
方法刷新令牌并分配给self.p_token
找到Captcha时调用get_p_token
,但问题是,其他请求继续执行。
我希望如果找到Captcha,在get_p_token
执行完成之前不要发出下一个请求。
我有priority=1
但这没有帮助。
PS:
实际上,令牌被传递到每个URL,这就是为什么我要等到找到新的令牌然后刮掉其余的URL。
您应该将CAPTCHA解决逻辑实现为中间件 。 请参阅captcha-middleware获取灵感。
中间件应该注意为请求分配正确的令牌(来自process_request()
)并检测CAPTCHA提示(来自process_response()
)。
在中间件中,您可以使用除Scrapy之外的其他内容(例如请求 )以同步方式执行CAPTCHA解决所需的请求,以防止新请求在完成之前启动。
当然,任何已经触发的并行请求都已经启动,因此技术上可以在没有更新令牌的情况下发送一些请求。 但是,这些应该自动重试。 您可以配置中间件,以便在重试时通过确保中间件与重试中间件很好地协作来更新这些请求的令牌。
这是我将如何继续:
def get_p_token(self, response):
# generate token
...
yield Request(url = response.url, callback=self.no_captcha, method = "GET",priority=1, meta = response.meta, dont_filter=True)
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 = ''
yield Request(url = url_, callback=self.get_p_token, method = "GET",priority=1, meta = response.meta)
except Exception:
print("Captcha was not found")
yield Request(url = url_, callback=self.no_captcha, method = "GET",priority=1, meta = response.meta)
你还没有提供工作代码,所以这只是问题的证明...这里的逻辑非常简单:
如果找到验证码,则转到get_p_token
并在生成令牌后,它会请求您之前请求的URL。 如果没有找到验证码,它会正常进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.