urllib2.urlopen() 会缓存内容吗?

14 投票
5 回答
12921 浏览
提问于 2025-04-16 03:24

他们在Python的文档里没有提到这一点。最近我在测试一个网站,简单地用urllib2.urlopen()刷新页面来提取一些内容。我发现有时候当我更新网站时,urllib2.urlopen()似乎没有获取到新添加的内容。所以我在想,它是不是在某个地方缓存了东西?

5 个回答

1

你的网页服务器或者一个HTTP代理可能在缓存内容。你可以尝试通过添加一个 Pragma: no-cache 请求头来禁用缓存:

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

这个问题很久以前就有人问过了,但我遇到过类似的问题,这个解决办法对我没用。
在我的情况下,我需要像这样伪装用户代理:

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

希望这能帮助到其他人...

10

我在想,缓存的东西是不是存储在某个地方?

其实并没有。

如果你没有看到新的数据,这可能有很多原因。大多数大型网络服务为了提高性能,会使用服务器端缓存,比如使用像Varnish和Squid这样的缓存代理,或者在应用层进行缓存。

如果问题是由于服务器端缓存造成的,通常没有办法强制服务器给你最新的数据。


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

如果你看到一个叫做X-CacheX-Cache-Lookup的头字段,这意味着你并不是直接连接到远程服务器,而是通过一个透明的代理。

如果你看到类似于X-Cache: HIT from proxy.domain.tld的内容,这表示你收到的响应是缓存的。相反,如果是X-Cache MISS from proxy.domain.tld,那就说明这个响应是新的。

撰写回答