Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python urllib2.urlopen()是否缓存内容?_Python_Urllib2_Urlopen - Fatal编程技术网

Python urllib2.urlopen()是否缓存内容?

Python urllib2.urlopen()是否缓存内容?,python,urllib2,urlopen,Python,Urllib2,Urlopen,他们在python文档中没有提到这一点。最近我在测试一个网站,只是简单地使用urllib2.urlopen()刷新该网站以提取某些内容,我注意到有时候更新该网站时,urllib2.urlopen()似乎无法获取新添加的内容。所以我想知道它会在某处缓存东西,对吗 所以我想知道它会在某处缓存东西,对吗 没有 如果看不到新数据,可能有很多原因。大多数大型web服务出于性能原因使用服务器端缓存,例如使用Varnish和Squid等缓存代理或应用程序级缓存 如果问题是由服务器端缓存引起的,通常无法强制服务

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

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

没有

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

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


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

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


如果您有类似于:
X-Cache:HIT from proxy.domain.tld
,这意味着您得到的响应将被缓存。相反,proxy.domain.tld的X-Cache未命中是
X-Cache未命中,这意味着响应是新的。

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

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

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中,您的应用程序可以将您始终重定向到同一登录页面,因此,如果您只看到页面大小或常见布局的顶部,您可能会认为您的更改没有任何影响。

Web服务器缓存内容。这是惯犯。检查结果的标题,并更新您的问题以包括
info()
@S.Lott:“Web服务器缓存内容”是否意味着如果我没有使用urllib2.urlopen()获得更新的结果,主要是Web服务器“知道”这是我在刷新,不给我更新的内容?有没有办法强迫服务器在每次我刷新站点时重新传输数据?除非你对web服务器了解很多,否则你不知道它有什么缓存。它可以有多个级别的缓存。它可能未正确配置缓存。它可能有不提供刷新缓存信息的页面。服务器端可能会出很多问题。@S.Lott:非常感谢。所以urllib2.urlopen()本身不会在我的计算机端缓存东西,对吗?谢谢,现在我知道问题出在哪里了。urllib2不会缓存东西。可能您正在使用代理,或者web应用程序本身正在存储临时数据。谢谢!从drupal提要下载JSON时也有同样的问题。这可能与实际的python脚本无关,而是与从中下载数据的服务器有关。在我们的例子中,服务器基于用户代理缓存内容。