缓存响应
Scrapy 具有缓存 HTTP 请求的功能。 如果页面已经被访问过,这可以大大减少爬行时间。 通过启用缓存,Scrapy 将存储每个请求和响应。
如何做
06/10_file_cache.py 脚本中有一个工作示例。 在 Scrapy 中,缓存中间件默认是禁用的。 要启用此缓存,请将 HTTPCACHE_ENABLED 设置为 True,并将 HTTPCACHE_DIR 设置为文件系统上的目录(使用相对路径将在项目的数据文件夹中创建目录)。 为了进行演示,此脚本运行 NASA 站点的爬网,并缓存内容。 它使用以下内容进行配置:
if __name__ == "__main__":
process = CrawlerProcess({
'LOG_LEVEL': 'CRITICAL',
'CLOSESPIDER_PAGECOUNT': 50,
'HTTPCACHE_ENABLED': True,
'HTTPCACHE_DIR': "."
})
process.crawl(Spider)
process.start()
我们要求 Scrapy 缓存使用文件并在当前文件夹中创建一个子目录。 我们还指示它将爬网限制为大约 500 个页面。 运行此程序时,爬网将花费大约一分钟(取决于您的互联网速度),并且将有大约 500 行输出。
第一次执行后,您可以看到目录中现在有一个 .scrapy
文件夹,其中包含缓存数据。 该结构如下所示:

再次运行脚本只需要几秒钟,并且会产生相同的解析页面输出/报告,只不过这次内容将来自缓存而不是 HTTP 请求。
还有更多
Scrapy 中有许多用于缓存的配置和选项。 默认情况下,由 HTTPCACHE_EXPIRATION_SECS 指定的缓存过期设置为 0。0 表示缓存项永不过期,因此一旦写入,Scrapy 将不再通过 HTTP 请求该项。 实际上,您需要将其设置为某个会过期的值。
缓存的文件存储只是缓存的选项之一。 还可以通过将 HTTPCACHE_STORAGE 设置分别设置为 scrapy.extensions.httpcache.DbmCacheStorage 或 scrapy.extensions.httpcache.LeveldbCacheStorage,将项目缓存在 DMB 和 LevelDB 中。 如果您愿意,您还可以编写自己的代码,将页面内容存储在其他类型的数据库或云存储中。
最后,我们来讨论缓存策略。 Scrapy 内置了两个策略:Dummy(默认)和 RFC2616。 可以通过将 HTTPCACHE_POLICY 设置更改为 scrapy.extensions.httpcache.DummyPolicy 或 scrapy.extensions.httpcache.RFC2616Policy 来设置。
RFC2616 策略通过以下操作启用 HTTP 缓存控制感知:
-
不要尝试使用无存储缓存控制指令集来存储响应/请求
-
如果设置了 no-cache 缓存控制指令,则不提供来自缓存的响应,即使对于新响应
-
根据 max-age 缓存控制指令计算新鲜度寿命
-
从 Expires 响应标头计算新鲜度寿命
-
根据 Last-Modified 响应标头计算新鲜度生命周期(Firefox 使用的启发式)
-
从 Age 响应头计算当前年龄
-
从日期标题计算当前年龄
-
根据 Last-Modified 响应标头重新验证过时的响应
-
根据 ETag 响应标头重新验证过时的响应
-
为任何收到的缺少响应设置日期标头
-
支持请求中的 max-stale 缓存控制指令