Scrapy持久缓存

Spa*_*man 5 caching scrapy

我们需要能够重新抓取历史数据。想象一下今天是 6 月 23 日。我们今天抓取了一个网站,但几天后我们意识到我们必须重新抓取它,“看到”它与 23 日一模一样。这意味着,包括所有可能的重定向、GET 和 POST 请求等。无论如何,蜘蛛看到的所有页面都应该与 23 日完全相同。

用例:如果网站发生变化,并且我们的蜘蛛无法抓取某些内容,我们希望能够回到“过去”并在修复它后重新运行蜘蛛。

一般来说,这应该很容易 - 子类化标准 Scrapy 的缓存,强制它使用子文件夹的日期,并具有类似的内容:

cache/spider_name/2015-06-23/HERE ARE THE CACHED DIRS

但当我尝试这个时,我意识到有时蜘蛛会爬行实时网站。这意味着,它不会从缓存中获取某些页面(尽管磁盘上存在适当的文件),而是从实时网站中获取它们。这种情况尤其发生在带有验证码的页面上,但也可能发生在其他一些页面上。

我们如何强制 Scrapy始终从缓存中获取页面,而不访问实时网站?理想情况下,它甚至应该在没有互联网连接的情况下工作。

更新:我们使用了虚拟策略和 HTTPCACHE_EXPIRATION_SECS = 0

谢谢你!

小智 4

要准确地执行您想要的操作,您应该在设置中包含以下内容:

HTTPCACHE_IGNORE_MISSING = True

然后,如果启用,在缓存中找不到的请求将被忽略而不是下载。

当您设置:HTTPCACHE_EXPIRATION_SECS = 0

它只是向您保证“缓存的请求永远不会过期”,但如果页面不在您的缓存中,那么它将被下载。

您可以查看文档。