urllib2什么时候实际从网址下载文件?

时间:2008-10-21 20:23:03

标签: python

url = "http://example.com/file.xml"
data = urllib2.urlopen(url)
data.read()

问题是,何时从互联网上下载文件?当我做urlopen或.read()?在我的网络界面上,我看到两次都有高流量。

2 个答案:

答案 0 :(得分:5)

没有看到代码,我希望发生以下情况:

  1. urlopen()打开连接,然后发送查询。然后服务器开始提供回复。此时,数据会累积在缓冲区中,直到它们已满,操作系统会告诉服务器保持一段时间。
  2. 然后data.read()清空缓冲区,因此操作系统会告诉服务器继续运行,其余的回复都会被下载。
  3. 当然,如果回复足够短,或者.read()发生得足够快,那么缓冲区没有时间填满,下载一次完成。

答案 1 :(得分:5)

我同意ddaa。但是,如果您想了解此类事情,可以使用nc(在* nix中)之类的东西设置虚拟服务器,然后在交互式Python解释器中打开URL。

在一个终端中,运行nc -l 1234,它将打开一个套接字并侦听本地计算机端口1234上的连接。 nc将接受传入连接并显示从套接字读取的内容。您在nc中输入的任何内容都将通过套接字发送到远程连接,在本例中为Python的urlopen()

在另一个终端运行Python并输入您的代码,即

data = urllib2.urlopen('http://127.0.0.1:1234')
data.read()

urlopen()的调用将建立与服务器的连接,发送请求然后阻止等待响应。您将看到nc将HTTP请求打印到它的终端。

现在在运行nc的终端中输入内容。对urlopen()的调用仍会阻止,直到您在nc中按ENTER键,直到它收到新的换行符。因此,urlopen()在读取至少一个新行字符之前不会返回。 (对于那些关注nc可能缓冲的人来说,这不是问题。urlopen()会阻塞,直到看到第一个换行符。)

因此应该注意,urlopen()将阻塞,直到收到第一个新行字符,之后可以从连接中读取数据。实际上,HTTP响应是短多线响应,因此urlopen()应该很快返回。