我有一个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
get_p_token
,但问题是,其他请求仍在继续执行。
我希望如果找到了Captcha,在完成get_p_token
的执行之前不要发出下一个请求。
我有priority=1
但这没有帮助。
P.S:
实际上,令牌被传递到每个URL,这就是为什么我要等到找到新的令牌然后刮掉其余的URL。
答案 0 :(得分:0)
这就是我将继续谈论它的方式:
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。如果没有找到验证码,它会正常进行。
答案 1 :(得分:0)
您应将验证码求解逻辑实现为middleware。参见captcha-middleware以获得灵感。
中间件应注意为请求分配正确的令牌(来自process_request()
),并检测验证码提示(来自process_response()
)。
在中间件中,您可以使用Scrapy以外的其他工具(例如requests)以同步方式执行CAPTCHA解决所需的请求,以防止新请求开始执行。
当然,任何已经触发的并行请求都已经开始,因此从技术上来说,可以发送一些请求而无需更新令牌。但是,这些应该自动重试。您可以将中间件配置为通过确保您的中间件与重试中间件正常工作,在重试时更新这些请求的令牌。