1. 程式人生 > >urllib 和 request 對比

urllib 和 request 對比

在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,那麼那兩個複雜的類是什麼的

那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時候可以試試。