Python开发中时长遇到要下载文件的状况,最经常使用的方法就是经过Http利用urllib或者urllib2模块。html
固然你也能够利用ftplib从ftp站点下载文件。此外Python还提供了另一种方法requests。python
下面来看看三种方法是如何来下载zip文件的:
方法一:api
import urllib import urllib2 import requests print "downloading with urllib" url = 'http://***/test/demo.zip' print "downloading with urllib" urllib.urlretrieve(url, "demo.zip")
方法二:函数
import urllib2 print "downloading with urllib2" url = 'http://***/test/demo.zip' f = urllib2.urlopen(url) data = f.read() with open("demo2.zip", "wb") as code: code.write(data)
方法三:ui
import requests print "downloading with requests" url = 'http://***/test/demo.zip' r = requests.get(url) with open("demo3.zip", "wb") as code: code.write(r.content)
看起来使用urllib最为简单,一句语句便可。固然你能够把urllib2缩写成:url
f = urllib2.urlopen(url) with open("demo2.zip", "wb") as code: code.write(f.read())
==========================================python requests======spa
在HTTP相关处理中使用python是没必要要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合性的功能。相比于urllib2,Kenneth Reitz的Requests模块更能简约的支持完整的简单用例。
简单的例子:
想象下咱们试图使用get方法从http://example.test/获取资源而且查看返回代码,content-type头信息,还有response的主体内容。这件事不管使用urllib2 或者Requests都是很容易实现的。
urllib2:code
import urllib2 url = 'http://example.test/' response = urllib2.urlopen(url) response.getcode()
-- 200
response.headers.getheader('content-type')
-- 'text/html; charset=utf-8'
response.read()
-- 'Hello, world!'
Requests:htm
import requests url = 'http://example.test/' 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解码
2. Requests 自动保存了返回内容,因此你能够读取屡次,而不像urllib2.urlopen()那样返回的只是一个相似文件类型只能读取一次的对象。
第二点是在python交互式环境下操做代码很使人讨厌的事情
一个复杂一点的例子:如今让咱们尝试下复杂点得例子:使用GET方法获取http://foo.test/secret的资源,此次须要基本的http验证。使用上面的代码做为模板,好像咱们只要把urllib2.urlopen() 到requests.get()之间的代码换成能够发送username,password的请求就好了
这是urllib2的方法:对象
import urllib2 url = 'http://example.test/secret' 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!'
一个简单的方法中实例化了2个类,而后组建了第三个类,最后还要装载到全局的urllib2模块中,最后才调用了urlopen,那么那两个复杂的类是什么的
迷惑了吗, 这里全部urllib2的文档 http://docs.python.org/release/2.7/library/urllib2.html
那Requests是怎么样解决一样的问题的呢?
Requests:
import requests url = 'http://example.test/secret' 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对于HEAD, POST, PUT, PATCH, 和 DELETE方法的api一样简单
* 它能够处理多部分上传,一样支持自动转码
* 文档更好
* 还有更多
Requests 是很好的,下次须要使用HTTP时候能够试试。