2010-08-27 51 views
9

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

+0

Web服务器也缓存一些东西。这是通常的罪魁祸首。检查结果上的标题,并**更新**你的问题以包含'info()'。 – 2010-08-27 16:45:57

+0

@ S.Lott:“Web服务器缓存内容”是否意味着如果我没有使用urllib2.urlopen()获取更新后的结果,那主要是Web服务器“知道”这是我令人耳目一新的,不要给我更新东东?每当我刷新网站时,是否有办法强制服务器重新传输数据? – Shane 2010-08-27 16:54:59

+0

除非您知道有关Web服务器的许多**,否则您并不知道它具有什么缓存。它可以有多个级别的缓存。它可能配置不正确的缓存。它可能有页面不提供刷新缓存的信息。服务器端可能会出错。 – 2010-08-27 17:07:01

回答

9

所以我不知道它缓存的东西在某个地方,对吧?

它没有。

如果您没有看到新的数据,这可能有很多原因。出于性能原因,大多数较大的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,这意味着响应是新鲜的。

+0

谢谢,现在我知道问题是什么。 – Shane 2010-08-27 17:46:55

-2

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

+2

urllib2不会执行缓存。也许你正在使用代理,或者Web应用程序本身正在存储临时数据。 – 2010-10-14 19:45:46

5

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

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

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

+0

谢谢!从Drupal Feed下载JSON时遇到同样的问题。这可能与您的实际python脚本没有任何关系,而是您要从中下载数据的服务器。在我们的例子中,服务器缓存基于用户代理的内容。 – 2016-06-03 21:26:24

0

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

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

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