等待请求完成 - Python Scrapy

时间:2016-10-03 16:40:47

标签: python scrapy screen-scraping scrapy-spider

我有一个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但这没有帮助。

HERE is full code of Spider

P.S:

实际上,令牌被传递到每个URL,这就是为什么我要等到找到新的令牌然后刮掉其余的URL。

2 个答案:

答案 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解决所需的请求,以防止新请求开始执行。

当然,任何已经触发的并行请求都已经开始,因此从技术上来说,可以发送一些请求而无需更新令牌。但是,这些应该自动重试。您可以将中间件配置为通过确保您的中间件与重试中间件正常工作,在重试时更新这些请求的令牌。