13

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

4

5 回答 5

10

所以我想知道它会在某处缓存东西,对吗?

它没有。

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

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


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

如果您看到名为X-Cacheor的标头字段X-Cache-Lookup,这意味着您没有直接连接到远程服务器,而是通过透明代理连接到远程服务器。

如果你有类似: 的东西X-Cache: HIT from proxy.domain.tld,这意味着你得到的响应被缓存了。相反的是X-Cache MISS from proxy.domain.tld,这意味着响应是新鲜的。

于 2010-08-27T17:41:02.433 回答
5

非常老的问题,但我有一个类似的问题,这个解决方案没有解决。
就我而言,我不得不像这样欺骗用户代理:

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

希望这可以帮助任何人......

于 2012-04-04T09:18:13.003 回答
1

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

request = urllib2.Request(url)
request.add_header('Pragma', 'no-cache')
content = urllib2.build_opener().open(request)
于 2013-08-22T14:33:06.757 回答
0

如果您从浏览器和 urllib 进行更改并测试行为,很容易犯愚蠢的错误。在浏览器中您已登录,但在 urllib.urlopen 中,您的应用程序可以始终将您重定向到相同的登录页面,因此如果您只看到页面大小或常见布局的顶部,您可能会认为您的更改没有任何效果。

于 2016-07-07T07:39:29.057 回答
-2

我很难相信 urllib2 不进行缓存,因为在我的情况下,在程序重新启动时数据会被刷新。如果程序没有重新启动,数据似乎会被永久缓存。此外,从 Firefox 检索相同的数据永远不会返回过时的数据。

于 2010-10-14T19:42:54.840 回答