python - 在 Python 中维护网页的更新文件缓存?

标签 python caching web

我正在编写一个应用程序,它需要对通过 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/

相关文章:

python - 保留以某些文本字符串开头的行

javascript - 在 jQuery POST 之后渲染页面

python - os.path.exists 无法识别 C :\Windows\system32\drivers 下的子目录

caching - 将 MemoryCacheHandle 与 RedisCacheBackplane 一起使用,但不使用 RedisCacheHandle

java - 更新应用程序状态(java缓存)与数据库同步

spring-mvc - 将缓存 Redis 过期时间设置为 1 年

python - 使用 html 模板格式化 csv 文件数据

image - 如何避免 "To protect your privacy, some pictures in this message were not downloaded"出现在 Outlook 中

javascript - Reactjs控制台错误: 'Components object is deprectated' & 'ReferenceError: require is not defined'

c# - 从网站读取信息c#