Downloading in Python – Python中进行下载

假设我们需要在Python中下载一个文件, 其对应url地址为 URL= 'http://***/test/demo.zip'

使用urllib进行下载

import urllib
urllib.urlretrieve(URL, "demo.zip")

使用urllib2进行下载

import urllib2
f = urllib2.urlopen(URL)
data = f.read()
with open("demo2.zip", "wb") as code:
    code.write(data)

使用requests进行下载

import requests
r = requests.get(URL)
with open("demo3.zip", "wb") as code:
    code.write(r.content)

在HTTP相关处理中使用Python是不必要的麻烦, 这包括urllib2模块以巨大的复杂性代价获取综合性的功能。相比于urllib2, Requests模块更能简约的支持完整的简单用例。

举一个简单的例子来说明两者之间的差别. 假设现在需要从URL 获取资源并且查看返回代码,content-type头信息,还有response的主体内容. 分别使用urllib2Requests进行实现.

>>> import urllib2
>>> response = urllib2.urlopen(URL)
>>> response.getcode()
200
>>> response.headers.getheader('content-type')
'text/html; charset=utf-8'
>>> response.read()
'Hello, world!'

>>> import requests
>>> response = requests.get(URL)
>>> response.status_code
200
>>> response.headers['content-type']
'text/html; charset=utf-8'
>>> response.content
u'Hello, world!

这两种方法很相似, 相对于urllib2调用方法读取response中的属性信息, Requests则是使用属性名来获取对应的属性值.
两者还有两个细微但是很重要的差别:
1. Requests 自动的把返回信息用Unicode解码, 上面例子中可以看出, response.content返回的是unicode对象.
2. Requests 自动保存了返回内容, 所以你可以读取多次, 而不像urllib2.urlopen()那样返回的只是一个类似文件类型只能读取一次的对象。

第二点是在python交互式环境下操作代码很令人讨厌的事情

一个复杂一点的例子:现在让我们尝试下复杂点得例子:使用GET方法获取 http://foo.test/secret 的资源,这次需要基本的http验证。使用上面的代码作为模板,好像我们只要把urllib2.urlopen() 到requests.get()之间的代码换成可以发送username,password的请求就行了

这是urllib2的方法:

>>> import urllib2
>>> password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
>>> password_manager.add_password(None, url, 'dan', 'h0tdish')
>>> auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
>>> opener = urllib2.build_opener(auth_handler)
>>> urllib2.install_opener(opener)
>>> response = urllib2.urlopen(url)
>>> response.getcode()
200
>>> response.read()
'Welcome to the secret page!'

一个简单的方法中实例化了HTTPPasswordMgrWithDefaultRealmHTTPBasicAuthHandler,然后组建了第三个类opener,最后还要装载到全局的urllib2模块中,最后才调用了urlopen.

那Requests是怎么样解决同样的问题的呢?

>>> import requests
>>> response = requests.get(URL, auth=('dan', 'h0tdish'))
>>> response.status_code
200
>>> response.content
u'Welcome to the secret page!'

只是在调用方法的时候增加了一个auth关键字函数.

错误处理 Error HandlingRequests 对错误的处理也是很非常方面。如果你使用了不正确的用户名和密码,urllib2会引发一个urllib2.URLError错误,然而Requests会像你期望的那样返回一个正常的response对象。只需查看response.ok的布尔值便可以知道是否登陆成功。

>>> response = requests.get(URL, auth=('dan', 'wrongPass'))
>>> response.ok
False

推荐使用Requests来进行Http请求, 包括文件下载.

python下载文件的三种方法
urllib2 in Py2
urllib in Py3
python的扩展包requests的高级用法
Python urllib的urlretrieve()函数解析 这里提到了retrieval中的回调, 可以显示下载进度, 很有意思, 没事可以看一下.
How do I download a file over HTTP using Python?

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据