urllib2.urlopen()实际上是否获取页面?

Jam*_*mes 2 python urllib2

我在使用urllib2.urlopen()时只是为了读取头文件,还是实际带回整个网页?

IE是否真的在urlopen调用或read()调用上获取HTML页面?

handle = urllib2.urlopen(url)
html = handle.read()
Run Code Online (Sandbox Code Playgroud)

我问的原因是这个工作流程......

  • 我有一个网址列表(其中一些有短网址服务)
  • 如果我之前没有看过该网址,我只想阅读该网页
  • 我需要调用urlopen()并使用geturl()来获取链接所在的最终页面(在302重定向之后),所以我知道我是否已经抓取它了.
  • 如果我已经解析了那个页面,我不想承担必须抓取html的开销.

谢谢!

ʇsә*_*ɹoɈ 6

我刚用wireshark进行测试.当我调用urllib2.urlopen('url-for-a-700mbyte-file')时,只会立即检索标题和一些正文包.直到我打电话给read(),大部分身体都来到了网络.这与我通过阅读httplib模块的源代码看到的相符.

因此,为了回答原始问题,urlopen()不会通过网络获取整个主体.它取出标题,通常是一些正文.当你调用read()时,将获取正文的其余部分.

部分正文提取是预期的,因为:

  1. 除非您一次读取一个字节的http响应,否则无法准确知道传入标头的长度,因此无法知道在正文开始之前要读取多少字节.

  2. http客户端无法控制服务器捆绑到响应的每个tcp帧中的字节数.

实际上,由于一些主体通常与标题一起被提取,您可能会发现在urlopen()调用中完全获取了小主体(例如小的html页面).

  • 亚历克斯,我感谢您的关注,但没有任何事情被堵塞.HTTP在TCP上运行,实现流量控制.http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Flow_control (4认同)