假设我们需要在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
的主体内容. 分别使用urllib2
和Requests
进行实现.
>>> 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!'
一个简单的方法中实例化了HTTPPasswordMgrWithDefaultRealm
和HTTPBasicAuthHandler
,然后组建了第三个类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?