【问题标题】:How to handle temporary errors which are not signaled by http status code?如何处理 http 状态码未表示的临时错误?
【发布时间】:2018-06-28 03:55:13
【问题描述】:

我正在使用 Scrapy (Python) 编写爬虫,但不知道如何处理某些错误。

我有一个网站有时会返回一个空的正文或一个带有错误消息的正常页面。两个回复都带有标准的 200 HTTP 状态代码。

遇到这种情况我想做的就是告诉Scrapy去

  • 不要将响应保存到缓存(我使用的是HTTPCACHE_ENABLED = True),因为成功请求的内容看起来不同
  • 重新安排请求
  • 降低请求率(我正在使用AUTOTHROTTLE_ENABLED = True

有没有像raise scrapy.TemporaryError 那样引发某个异常的简单方法,还是我必须手动完成所有操作。在后一种情况下,如何从缓存中删除内容或与自动油门模块通信?

我知道我可以在请求上使用dont_cache 来不缓存它们。但通常我确实想缓存我的请求,并且只有在我想保留它时才决定响应。此外,文档还不清楚天气这个标志避免将请求的响应保存到缓存,如果它也避免从缓存中读取请求...

Autothrottle 使用下载延迟来调整请求速率。 throttling algorithm 将非 200 响应视为失败响应,并且不会减少下载延迟。但是我的请求返回 200 个状态码。所以自动油门无法处理这种情况。必须有办法告诉 autothrottle 使用其限制逻辑并将这些特定请求视为失败。

【问题讨论】:

    标签: python scrapy web-crawler scrapy-spider


    【解决方案1】:

    在您的回复中,您可以检查某个条件并决定将 URL 重新排队。

    requests disappear after queueing in scrapy

    def parse(self, response):
        if blank_data or should_rescrape:
           yield Request(respone.url, dont_filter=True, callback=self.response)
    

    动态调整油门

    如果你检查self.crawler.extensions.middlewares,你会看到它已经加载了所有的扩展

    就我而言

    self.crawler.extensions.middlewares[5] 给出<scrapy.extensions.throttle.AutoThrottle object at 0x10b75a208>(当然你会循环遍历元组并找出哪个是AutoThrottle 类型)

    现在您可以使用此对象并在您的刮板中动态调整值

    【讨论】:

    • 好的,谢谢。但这对缓存或节流没有帮助。通常“坏”响应会很快返回,所以这样我只会排队大量请求并使服务器过载。
    • 重新排队 url 时的队列长度是多少?所以你希望这些 url 至少排队 X 时间?
    • 我的队列不是很大(数千个),但所有请求都发往同一台服务器,因此任何请求都可能出现这种行为。我希望自动油门生效(它使用下载延迟来调整请求延迟)。然而,糟糕的响应没有很大的延迟,它们几乎是立即从服务器返回的。所以我想告诉 autothrottle 我刚收到一个错误的请求,它应该开始减慢请求,直到达到不再产生错误请求的速率。
    猜你喜欢
    • 2012-09-25
    • 2013-12-11
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多