python - 等待请求完成 - Python Scrapy

标签 python scrapy screen-scraping scrapy-spider

我有一个抓取网站的 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 但这没有帮助。

HERE is full code of Spider

附言:

实际上,该 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/

相关文章:

python - 如何从字典填充 StructuredProperty?

python - Postgresql 和 Python : Selecting data (datetime) from SQL

python - Pandas 、数据框 set_index 和重新索引

python - Scrapy 爬行历史

python - 让网络抓取工具产生更多信息

python - 使用 Scrapy 抓取游戏商店时出现问题 - 如果有折扣和处理 null,HTML 会发生变化

ruby - 使用 Ruby Mechanize 时 stub 测试

python - conda 在 python2.7 环境中安装 basemap 给出运行时错误 R6034

web-crawler - 如何使用Goutte

javascript - 在 IE7/8 中将 excanvas 元素保存为图像