在Python中缓存选项或加速urlopen

在Python中缓存选项或加速urlopen,python,sql,caching,urlopen,Python,Sql,Caching,Urlopen,嘿,我有一个网站,可以为最终用户查找信息,是用Python编写的,需要几个urlopen命令。因此,加载一个页面需要一点时间。我想知道是否有办法让它更快?有没有一种简单的Python缓存方法,或者让urlopen脚本最后变得有趣的方法 URL可以访问AmazonAPI以获取价格,因此该站点需要某种程度上是最新的。我能想到的唯一选择是编写一个脚本来创建一个mySQL数据库,并时不时地运行它,但那会很麻烦 谢谢 价格多久变化一次?如果它们是非常恒定的(比如一天一次,或者每小时左右),只需编写一个cr

嘿,我有一个网站,可以为最终用户查找信息,是用Python编写的,需要几个urlopen命令。因此,加载一个页面需要一点时间。我想知道是否有办法让它更快?有没有一种简单的Python缓存方法,或者让urlopen脚本最后变得有趣的方法

URL可以访问AmazonAPI以获取价格,因此该站点需要某种程度上是最新的。我能想到的唯一选择是编写一个脚本来创建一个mySQL数据库,并时不时地运行它,但那会很麻烦

谢谢

价格多久变化一次?如果它们是非常恒定的(比如一天一次,或者每小时左右),只需编写一个cron脚本(或等效脚本),用于检索值并将其存储在数据库或文本文件中,或者您需要的任何内容中


我不知道你是否可以从AmazonAPI检查时间戳数据——如果他们报告了类似的事情

你可以做几件事

  • urllib
    缓存机制很简单,但是您可以通过将从Amazon获得的数据存储在内存中或某个文件中来轻松实现

  • 与上面类似,您可以有一个单独的脚本,每隔一段时间刷新一次价格,并且
    cron
    it每半小时运行一次(比如)。这些可以存放在任何地方

  • 您可以在新的线程/进程中运行URL获取,因为它大部分时间都在等待


httplib2理解http请求缓存,在某种程度上抽象了urllib/urllib2的混乱性,并具有其他优点,比如gzip支持

但是除了使用它来获取数据外,如果数据集不是很大,我还将实现某种函数缓存/记忆。 例子:

修改decorator以允许基于时间的过期并不难,例如,只将结果缓存15分钟


如果结果更大,您需要开始查看memcached/redis。

您可以使用memcached。它就是为此而设计的,通过这种方式,您可以轻松地与不同的程序/脚本共享缓存。从Python中使用非常简单,请检查:

然后,在没有密钥时更新memcached,也可以从一些cron脚本更新memcached,这样就可以开始了


另一个更简单的选择是制作自己的缓存,可能将数据存储在字典中和/或使用cPickle将其序列化到磁盘(如果希望在不同的运行之间共享数据)

如果您需要同时从多个站点抓取,您可以尝试whit asyncore


这样,您可以轻松地一次加载多个页面。

谢谢!我唯一的问题是,有时我会收到urlopen的超时错误。有没有办法确保不会发生这种情况?获取的数据只是一个XML文件,所以不会太大。由于某种原因,加载需要很长时间:(那么http缓存应该可以正常工作,只要数据在第三方服务器上不经常更改。