3

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

urlopens 访问 Amazon API 以获取价格,因此该站点需要保持最新状态。我能想到的唯一选择是制作一个脚本来制作一个 mySQL 数据库并不时运行它,但这会很麻烦。

谢谢!

4

5 回答 5

3

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

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

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

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

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

于 2010-08-12T13:49:07.373 回答
1

您可以做几件事。

  • urllib缓存机制暂时被禁用,但您可以通过将您从亚马逊获得的数据存储在内存或某个文件中来轻松推出自己的缓存机制。

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

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

于 2010-08-12T13:46:42.200 回答
0

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

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

于 2010-08-12T13:55:47.203 回答
0

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

在 Python 中使用 python-memcache (memcached) 的好例子?

然后,当密钥不存在时以及从某个 cron 脚本中更新 memcached,您就可以开始了。

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

于 2010-08-12T13:50:16.793 回答
0

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

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

于 2010-08-12T13:46:25.070 回答