Ruby 我的缓存抓取网页的选项是什么?

Ruby 我的缓存抓取网页的选项是什么?,ruby,http,postgresql,caching,mechanize,Ruby,Http,Postgresql,Caching,Mechanize,我的应用程序进行了大量的页面抓取,例如获取历史天气数据。获取特定页面后,我希望将其缓存在PostgreSQL数据库中,这样就不必再次访问远程服务器以获取特定请求 由于历史数据永远不会更改,我希望“永远”缓存它们——这需要将缓存的页面存储在长期持久存储中,例如数据库 我已经编写了一个围绕Mechanize的基本缓存机制。这是可行的,但似乎有人比我有更好的编码能力已经实现了这一点 是否有任何gem或库已经这样做了?可能是您想要的。也许您应该使用代理缓存,如。这将比自己动手更快、更容易、更可靠。所以我

我的应用程序进行了大量的页面抓取,例如获取历史天气数据。获取特定页面后,我希望将其缓存在PostgreSQL数据库中,这样就不必再次访问远程服务器以获取特定请求

由于历史数据永远不会更改,我希望“永远”缓存它们——这需要将缓存的页面存储在长期持久存储中,例如数据库

我已经编写了一个围绕Mechanize的基本缓存机制。这是可行的,但似乎有人比我有更好的编码能力已经实现了这一点


是否有任何gem或库已经这样做了?

可能是您想要的。

也许您应该使用代理缓存,如。这将比自己动手更快、更容易、更可靠。

所以我想了又想,看了Mechanize和VCR的源代码,我决定我只是想得太多了。以下内容正好适合我的需要。(我使用的是DataMapper,但将其转换为ActiveRecord模型很简单):

用法示例:

def fetch(uri)
  WebCache.with_db_cache(uri) {|uri| 
    # arrive here only on cache miss
    Net::HTTP.get_response(URI(uri))
  }
end
评论 我以前认为,一个合适的web缓存方案可以观察和尊重头字段,如缓存控制、自修改后等,并自动处理超时和其他web异常。但对实际网页的检查清楚地表明,真正的静态数据经常被标记为短缓存时间。因此,让调用方决定应该缓存多长时间以及何时重试失败的查询更有意义

在这一点上,代码变得非常简单


寓意:不要过度思考你的问题。

你可以看看或。第一个可能更接近你需要的。这两种方法都不需要登录数据库,但也许您可以编写自己的存储层。我没有使用Heroku的经验,但文件系统似乎是这种缓存的合适位置

我认为这不是一个复制品。仅仅提供一个包含所有可能的ruby HTTP客户端的大表并不能帮助OP回答关于如何在数据库中缓存网页的特定问题。@gonzalo:该电子表格很有用,但MVP是正确的:我如何扩展Mechanize或Typhous或其他缓存响应的程序,以充当db支持的缓存方案?VCR肯定接近我想要的,我花了很多时间研究它。虽然我可能会编写一个自定义序列化程序,将其持久化到db,但不清楚键查找在播放时如何工作。为什么使用db很重要?我预计会有超过100k的缓存页。在Heroku上主持节目。理由够多了?我以前用录像机做过很多。你只是把它分成不同的“磁带”。不过,您是对的,保存到db(或memcached)对于大型工作来说是很好的。除非您以前做过,否则为此配置squid将是一场噩梦。@tometzky:pguardiario说的是实话。似乎大多数squid示例都是关于加速web页面服务的。
def fetch(uri)
  WebCache.with_db_cache(uri) {|uri| 
    # arrive here only on cache miss
    Net::HTTP.get_response(URI(uri))
  }
end