標籤:
Python開發中時間長度遇到要下載檔案的情況,最常用的方法就是通過Http利用urllib或者urllib2模組。
當然你也可以利用ftplib從ftp網站下載檔案。此外Python還提供了另外一種方法requests。
下面來看看三種方法是如何來下載zip檔案的:
方法一:
import urllib import urllib2 import requestsprint "downloading with urllib" url = ‘http://***/test/demo.zip‘ print "downloading with urllib"urllib.urlretrieve(url, "demo.zip")
方法二:
import urllib2print "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)
方法三:
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縮寫成:
f = urllib2.urlopen(url) with open("demo2.zip", "wb") as code:code.write(f.read())
================================================
python requests 最近在研究這個有研究的可以加我QQ29295842
在HTTP相關處理中使用python是不必要的麻煩,這包括urllib2模組以巨大的複雜性代價擷取綜合性的功能。相比於urllib2,Kenneth Reitz的Requests模組更能簡約的支援完整的簡單用例。
簡單的例子:
想象下我們試圖使用get方法從http://example.test/擷取資源並且查看傳回碼,content-type頭資訊,還有response的主體內容。這件事無論使用urllib2 或者Requests都是很容易實現的。
urllib2
[python] view plaincopy
>>> 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
[plain] view plaincopy
>>> 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的方法:
[python] view plaincopy
>>> 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
[plain] view plaincopy
>>> 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的布爾值便可以知道是否登陸成功。
[python] view plaincopy
>>> response = requests.get(url, auth=(‘dan‘, ‘wrongPass‘))
>>> response.ok
False
其他的一些特性:
* Requests對於HEAD, POST, PUT, PATCH, 和 DELETE方法的api同樣簡單
* 它可以處理多部分上傳,同樣支援自動轉碼
* 文檔更好
* 還有更多
Requests 是很好的,下次需要使用HTTP時候可以試試。
python下載檔案的三種方法