Python中的缓存选项或加速urlopen

时间:2010-08-12 13:40:28

标签: python sql caching urlopen

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

urlopens访问Amazon API以获取价格,因此该网站需要有点最新。我能想到的唯一选择是创建一个脚本来创建一个mySQL数据库,并且不时地运行它,但那会很麻烦。

谢谢!

5 个答案:

答案 0 :(得分:3)

httplib2理解http请求缓存,在某种程度上抽象urllib / urllib2的混乱,还有其他好东西,比如gzip支持。

http://code.google.com/p/httplib2/

但除了使用它来获取数据之外,如果数据集不是很大,我还会实现某种函数缓存/ memoizing。 例: http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

修改该装饰器以允许基于时间的到期时间并不太难,例如:只将结果缓存15分钟。

如果结果更大,则需要开始研究memcached / redis。

答案 1 :(得分:1)

你可以做几件事。

  • urllib缓存机制是temporarily disabled,但您可以通过将从Amazon获取的数据存储在内存或某个文件中来轻松推出自己的缓存机制。

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

  • 您可以在新的线程/进程中运行URL提取,因为它总是在等待。

答案 2 :(得分:0)

价格多久变化一次?如果它们非常稳定(比如说每天一次,或者每隔一小时左右),那就继续编写一个cron脚本(或等效的)来检索值并将其存储在数据库或文本文件中或者你需要的任何内容中

我不知道您是否可以检查来自Amazon API的时间戳数据 - 如果他们报告那种事情。

答案 3 :(得分:0)

您可以使用memcached。它专为此而设计,这样您就可以轻松地使用不同的程序/脚本共享缓存。它非常容易从Python中使用,请检查:

Good examples of python-memcache (memcached) being used in Python?

然后你在没有密钥的时候更新memcached,也可以从某个cron脚本更新memcached,然后你就可以了。

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

答案 4 :(得分:0)

如果您需要一次从多个网站抓取,可以尝试使用asyncore http://docs.python.org/library/asyncore.html

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