urllib2.urlopen()缓存内容吗?

时间:2010-08-27 16:34:28

标签: python urllib2 urlopen

他们没有在python文档中提到这一点。最近我正在测试一个网站只是使用urllib2.urlopen()来刷新网站以提取某些内容,我注意到有时当我更新网站时,urllib2.urlopen()似乎没有得到新添加的内容。所以我想它确实在某处缓存了东西,对吧?

5 个答案:

答案 0 :(得分:10)

  

所以我想它确实在某处缓存了东西,对吧?

没有。

如果您没有看到新数据,可能有很多原因。出于性能原因,大多数较大的Web服务都使用服务器端缓存,例如使用Varnish和Squid等缓存代理或应用程序级缓存。

如果问题是由服务器端缓存引起的,通常无法强制服务器为您提供最新数据。


对于像鱿鱼这样的缓存代理,情况有所不同。通常,squid会在HTTP响应中添加一些额外的标头(response().info().headers)。

如果您看到名为X-CacheX-Cache-Lookup的标头字段,则表示您未直接连接到远程服务器,而是通过透明代理连接。

如果您有类似X-Cache: HIT from proxy.domain.tld的内容,则表示您获得的响应已缓存。相反的是X-Cache MISS from proxy.domain.tld,这意味着响应是新的。

答案 1 :(得分:5)

很老的问题,但我遇到了类似的问题,这个解决方案没有解决 在我的情况下,我不得不像这样欺骗用户代理:

request = urllib2.Request(url)
request.add_header('User-Agent', 'Mozilla/5.0')
content = urllib2.build_opener().open(request)

希望这有助于任何人...

答案 2 :(得分:0)

您的网络服务器或HTTP代理可能正在缓存内容。您可以尝试通过添加Pragma: no-cache请求标头来禁用缓存:

request = urllib2.Request(url)
request.add_header('Pragma', 'no-cache')
content = urllib2.build_opener().open(request)

答案 3 :(得分:0)

如果你进行更改并测试浏览器和urllib的行为,很容易犯一个愚蠢的错误。 在浏览器中,您已登录,但在urllib.urlopen中,您的应用程序可以将您重定向到同一个登录页面,因此,如果您只是看到页面大小或公共布局的顶部,您可能会认为您的更改无效。

答案 4 :(得分:-2)

我发现很难相信urllib2不会进行缓存,因为在我的情况下,重启程序后数据会刷新。如果程序未重新启动,则数据似乎将永久缓存。同样从Firefox检索相同的数据永远不会返回过时的数据。