在Python中检查HTTP POST头而不下载主体

1 投票
2 回答
562 浏览
提问于 2025-04-16 18:47

一个网页服务器在收到一个POST请求后,会返回一个可以下载的文件(这个文件有一个Content-Disposition头部)。使用urllib或mechanize这个工具,响应的内容在什么时刻会被下载呢?

opener = mechanize.build_opener(HTTPRefererProcessor, HTTPEquivProcessor, HTTPRefreshProcessor)
r = make_post_request() # makes Request object to send
res = opener.open(r)
info = response.info()
content_disp = info.getheader('content-disposition')
filename = content_disp.split('=')[1]
content = res.read() # or skip based on filename

我原以为,内容不会在read()之前下载,这样可以跳过一些下载(比如那些已经下载过的文件),但我并没有看到明显的性能提升。

2 个回答

3

HTTP是一种无连接的协议,这意味着在服务器和客户端之间没有建立一个可以分多次传输数据的通道。所以,当你向服务器发送一个POST或GET请求时,服务器必须给出一个完整的响应,因为它无法知道这是第一个请求还是第二个请求。虽然Cookies、AJAX和Comet等技术可以帮助模拟一个类似通道的东西,但实际上并没有真正的通道。这就是为什么会有HEAD请求:通过这个请求,浏览器可以判断某个资源是否需要加载。

1

其实,如果你只想要获取网页的头部信息,应该使用HTTP的HEAD请求。POST和GET请求本身就会返回内容。

关于停止下载,网络服务器不会等着你准备好再开始发送数据,实际上,从Python到你的网络卡,数据会立刻开始接收和缓存。

所以,最好的办法是找个更合适的方法来处理这个问题,比如使用HTTP HEAD请求。如果这个方法不可行,那就在获取到你需要的头部信息后,立刻对请求对象调用close(),希望你没有浪费太多的带宽。

(如果你想看看在Python中如何使用HTTP HEAD请求,可以参考这个以前的回答。)

撰写回答