当前位置:  开发笔记 > 编程语言 > 正文

在urllib2中缓存?

如何解决《在urllib2中缓存?》经验,为你挑选了4个好方法。

在使用urllib2时,是否有一种简单的方法可以缓存我的东西,或者我必须自己滚动?



1> Corey Goldbe..:

如果您不介意在较低级别工作,httplib2(https://github.com/httplib2/httplib2)是一个出色的HTTP库,其中包含缓存功能.


请记住,使用httplib2时,您将失去对其他方案(文件,ftp,...)的支持.

2> danivovich..:

这个ActiveState Python配方可能会有所帮助:http: //code.activestate.com/recipes/491261/



3> Will Boyce..:

您可以使用装饰器功能,例如:

class cache(object):
    def __init__(self, fun):
        self.fun = fun
        self.cache = {}

    def __call__(self, *args, **kwargs):
        key  = str(args) + str(kwargs)
        try:
            return self.cache[key]
        except KeyError:
            self.cache[key] = rval = self.fun(*args, **kwargs)
            return rval
        except TypeError: # incase key isn't a valid key - don't cache
            return self.fun(*args, **kwargs)

并定义一个函数:

@cache
def get_url_src(url):
    return urllib.urlopen(url).read()

这假设您没有关注HTTP缓存控件,只是想在应用程序的持续时间内缓存页面


除非按照RFC中的说明检查其标头,否则缓存此类资源无效.或者您可能建议使用此解决方案来组装一个网页的单个视图,而不是用于重复重新加载?

4> Jason R. Coo..:

我总是在使用httplib2之间徘徊,httplib2可以很好地处理HTTP缓存和身份验证,而urllib2在stdlib中具有可扩展的接口,并且支持HTTP代理服务器.

该ActiveState的配方开始缓存支持添加到urllib2的,但只有在一个非常原始的方式.它无法允许存储机制的可扩展性,硬编码文件系统支持的存储.它也不支持HTTP缓存标头.

为了集成httplib2缓存和urllib2可扩展性的最佳功能,我调整了ActiveState配方来实现与httplib2中相同的大多数缓存功能.该模块在jaraco.net中作为jaraco.net.http.caching.链接指向模块,因为它在撰写本文时存在.虽然该模块目前是较大的jaraco.net软件包的一部分,但它没有内部包依赖关系,因此请随意将模块拉出并在您自己的项目中使用它.

或者,如果你有Python 2.6或更高版本,你可以easy_install jaraco.net>=1.3使用CachingHandler和类似的代码caching.quick_test().

"""Quick test/example of CacheHandler"""
import logging
import urllib2
from httplib2 import FileCache
from jaraco.net.http.caching import CacheHandler

logging.basicConfig(level=logging.DEBUG)
store = FileCache(".cache")
opener = urllib2.build_opener(CacheHandler(store))
urllib2.install_opener(opener)
response = opener.open("http://www.google.com/")
print response.headers
print "Response:", response.read()[:100], '...\n'

response.reload(store)
print response.headers
print "After reload:", response.read()[:100], '...\n'

请注意,jaraco.util.http.caching不提供缓存的后备存储的规范,而是遵循httplib2使用的接口.因此,httplib2.FileCache可以直接与urllib2和CacheHandler一起使用.此外,为httplib2设计的其他后备缓存应该可由CacheHandler使用.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有