如何处理HTTP状态代码未指示的临时错误?

时间:2018-06-28 03:55:14

标签: python scrapy web-crawler scrapy-spider

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

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

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

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

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

我知道我可以在请求上使用dont_cache而不缓存它们。但是通常我确实想缓存我的请求,并且仅在我想保留它时才决定响应。此外,文档也不清晰,如果此标志还避免了从缓存中读取请求,则此标志避免保存对缓存的请求的响应。

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

1 个答案:

答案 0 :(得分: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的元组)

Throttling

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