他们在 python 文档中没有提到这一点。最近我正在测试一个网站,只是使用 urllib2.urlopen() 来提取某些内容来刷新网站,我注意到有时当我更新网站时 urllib2.urlopen() 似乎没有得到新添加的内容。所以我想知道它会在某处缓存东西,对吗?
5 回答
所以我想知道它会在某处缓存东西,对吗?
它没有。
如果您没有看到新数据,这可能有很多原因。大多数大型 Web 服务出于性能原因使用服务器端缓存,例如使用缓存代理(如 Varnish 和 Squid)或应用程序级缓存。
如果问题是由服务器端缓存引起的,通常没有办法强制服务器为您提供最新数据。
对于像 squid 这样的缓存代理,情况就不同了。通常,squid 会在 HTTP 响应 ( response().info().headers
) 中添加一些额外的标头。
如果您看到名为X-Cache
or的标头字段X-Cache-Lookup
,这意味着您没有直接连接到远程服务器,而是通过透明代理连接到远程服务器。
如果你有类似: 的东西X-Cache: HIT from proxy.domain.tld
,这意味着你得到的响应被缓存了。相反的是X-Cache MISS from proxy.domain.tld
,这意味着响应是新鲜的。
非常老的问题,但我有一个类似的问题,这个解决方案没有解决。
就我而言,我不得不像这样欺骗用户代理:
request = urllib2.Request(url)
request.add_header('User-Agent', 'Mozilla/5.0')
content = urllib2.build_opener().open(request)
希望这可以帮助任何人......
您的 Web 服务器或 HTTP 代理可能正在缓存内容。您可以尝试通过添加Pragma: no-cache
请求标头来禁用缓存:
request = urllib2.Request(url)
request.add_header('Pragma', 'no-cache')
content = urllib2.build_opener().open(request)
如果您从浏览器和 urllib 进行更改并测试行为,很容易犯愚蠢的错误。在浏览器中您已登录,但在 urllib.urlopen 中,您的应用程序可以始终将您重定向到相同的登录页面,因此如果您只看到页面大小或常见布局的顶部,您可能会认为您的更改没有任何效果。
我很难相信 urllib2 不进行缓存,因为在我的情况下,在程序重新启动时数据会被刷新。如果程序没有重新启动,数据似乎会被永久缓存。此外,从 Firefox 检索相同的数据永远不会返回过时的数据。