我正在编写一个应用程序,它需要对通过 http 获取的大文件进行持久的本地访问。我希望将文件保存在本地目录(某种部分镜像)中,以便应用程序的后续执行只需注意到 URL 已在本地镜像,以便其他程序可以使用它们。
理想情况下,它还会保留时间戳或 etag 信息,并能够使用 If-Modified-Since 或 If-None-Match header 发出快速 http 请求以检查新版本,但避免完整下载,除非文件已经升级。但是,由于这些网页很少更改,我可能可以忍受陈旧副本中的错误,并在适当的时候找到其他方法从缓存中删除文件。
环顾四周,我看到 urllib.request.urlretrieve 可以保存缓存的副本,但它看起来无法处理我的 If-Modified-Since 缓存更新目标。
requests 模块看起来是最新最好的,但它似乎不适用于这种情况。有一个 CacheControl支持我的缓存更新目标的附加模块,因为它执行完整的 HTTP 缓存。但它似乎没有以可直接用于其他(非 python)程序的方式存储获取的文件,因为 FileCache 将资源存储为腌制数据。以及 can python-requests fetch url directly to file handle on disk like curl? - Stack Overflow 的讨论建议可以使用一些额外的代码来保存到本地文件,但这似乎不能很好地与 CacheControl 模块融合。
那么有没有一个网络抓取库可以满足我的需求?这基本上可以维护过去获取的文件的镜像(并告诉我文件名是什么),而我不必明确地管理所有这些?
最佳答案
我有同样的要求,找到了requests-cache .添加它非常容易,因为它扩展了 requests
。您可以让缓存在内存中并在脚本结束后消失,或者使用 sqlite、mongodb 或 redis 使其持久化。这是我写的两行,它像宣传的那样工作:
import requests, requests_cache
requests_cache.install_cache('scraper_cache', backend='sqlite', expire_after=3600)
关于python - 在 Python 中维护网页的更新文件缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27118086/