一個月被下載6億多發(fā),github 5萬多star,什么項目的數(shù)據(jù)這么炸? 

說起python第三方庫,你最先想到的是哪家?數(shù)據(jù)分析的pandas?圖像處理的pillow?還是用Django來做Web開發(fā)?沒錯,它們都很牛叉,但這個庫的下載量竟然比它們都要大。 
關(guān)注編程教室,學(xué)習(xí)編程知識,今天我們就來講講這個號稱“最人性化”的HTTP庫--requests 
怎么個人性化法? 
假如你要通過一個天氣API接口獲取某個城市的氣溫變化,用requests來寫,僅僅需要這樣兩行代碼: import requestsr = requests.get('http://api./tq.php?dz=南京')print(r.text) 而其他一些常見的網(wǎng)絡(luò)請求操作,如: 提交帶參數(shù)的post請求 
修改網(wǎng)頁的編碼(encoding) 
解碼json數(shù)據(jù) 
自定義請求頭(headers) 
添加cookie 
設(shè)定請求等待時長(timeout) 
諸如此類的操作都可以通過requests提供的屬性或方法,在一兩行代碼內(nèi)輕松拿下。 而想要得到這些,你所要做的僅僅是通過 pip install 安裝一下,以及通過官方文檔了解模塊的使用方法。 你可能要說了,這些難道Python內(nèi)置的模塊不能實現(xiàn)?誒,那倒不至于,只是……沒那么方便。 比如,我現(xiàn)在要請求一個: 限制了瀏覽器類型、需要提交一組參數(shù)的POST接口,而返回結(jié)果是編碼為UTF8的JSON格式數(shù)據(jù),另外還做了gzip壓縮。 
如果用Python默認(rèn)的庫來做,每一步都需要手動來處理,代碼比較繁瑣。 from urllib.request import Request, urlopen from urllib.parse import urlencode import gzip import json
headers = {'User-Agent': 'Chrome'} data = {'username': 'test_user', 'password': '123456'} url = 'https://api./login'
# 編碼請求數(shù)據(jù) data_encoded = urlencode(data).encode('utf-8') # 創(chuàng)建請求對象,設(shè)定請求數(shù)據(jù)、請求頭、請求方法 req = Request(url, data=data_encoded, headers=headers, method='POST') # 發(fā)送請求 response = urlopen(req) # 讀取返回結(jié)果 recv_data = response.read() # 對返回結(jié)果進(jìn)行g(shù)zip解壓 if response.getheader("Content-Encoding") == "gzip": recv_data = gzip.decompress(recv_data) # 對返回結(jié)果進(jìn)行UTF-8解碼 json_string = recv_data.decode('utf-8') # 將返回結(jié)果按JSON格式進(jìn)行解析 result = json.loads(json_string) print(result) # 關(guān)閉請求 response.close()
換成requests,則只需要在post函數(shù)中提供字典類型的headers和data參數(shù),就完成了對請求頭和數(shù)據(jù)的設(shè)定。而至于返回結(jié)果的gzip解壓和utf8解碼,都會自動幫你搞定。假如編碼沒有被識別,也只要一個賦值就可以成功運行。 最后再用json函數(shù)把結(jié)果解析成直接可用的字典類型。開發(fā)者省去了很多瑣碎的工作,代碼量大大減輕。 import requests
headers = {'User-Agent': 'Chrome'} data = {'username': 'test_user', 'password': '123456'} url = 'https://api./login'
# 設(shè)定請求數(shù)據(jù)、請求頭,發(fā)送POST請求 response = requests.post(url, headers=headers, data=data) # 設(shè)定返回結(jié)果的編碼 response.encoding = 'utf-8' # 將返回結(jié)果按JSON格式進(jìn)行解析 result = response.json() print(result)
更不要說,如果想要實現(xiàn)登錄后的狀態(tài)保持,原本的內(nèi)置庫要用 http.cookiejar 和 urllib.request 配合實現(xiàn),寫出來的代碼是這樣的: from urllib.request import build_opener, HTTPCookieProcessor, Request from urllib.parse import urlencode import http.cookiejar
login_url = 'https:///login' login_data = {'username': 'test_user', 'password': '123456'} headers = {'User-Agent': 'Chrome'}
data_encoded = urlencode(login_data).encode('utf-8') # 創(chuàng)建 CookieJar 和 opener 來管理會話 cookie_jar = http.cookiejar.CookieJar() opener = build_opener(HTTPCookieProcessor(cookie_jar)) # 使用 opener 發(fā)送登錄請求 login_request = Request(login_url, data=data_encoded, headers=headers, method='POST') login_response = opener.open(login_request) # 使用同一 opener 訪問登錄后頁面 protected_url = 'https:///profile' profile_request = Request(protected_url, headers=headers, method='GET') profile_response = opener.open(profile_request) print(profile_response.read().decode('utf-8')) login_response.close() profile_response.close()
而requests就簡單多了,直接增加一個Session對象,就能在幾乎不改動之前代碼的情況下,實現(xiàn)登錄狀態(tài)的保持。 import requests
login_url = 'https:///login' login_data = {'username': 'test_user', 'password': '123456'} headers = {'User-Agent': 'Chrome'}
# 創(chuàng)建 Session 對象 session = requests.Session() # 使用 Session 發(fā)送登錄請求 login_response = session.post(login_url, data=login_data, headers=headers) # 使用同一 Session 訪問登錄后頁面 protected_url = 'https:///profile' profile_response = session.get(protected_url, headers=headers) print(profile_response.text)
兩種寫法的差別,對比非常明顯。一旦你有過requests的經(jīng)驗,就打開了網(wǎng)絡(luò)請求的新世界,再也不想用內(nèi)置的urllib來實現(xiàn)。 就連各家大廠的Python項目,網(wǎng)絡(luò)請求也常常用requests來解決。畢竟這么好用的模塊,相信誰都不會拒絕。 廣泛的使用率也讓requests始終霸榜在PyPI排行的前列。 
而如此強大的類庫,最初僅僅是一個程序員的個人項目。2011年某個下午,一個叫做 Kenneth 的小伙子因為無法忍受Python內(nèi)置的urllib庫,決定施展一下他的開發(fā)技術(shù),寫一個真正人性化的HTTP請求庫,沒想到竟寫成了Python生態(tài)的重要支柱。 說到這個Kenneth,也是技術(shù)圈里充滿話題的人物。在軟件開發(fā)之外,他還熱衷于音樂和攝影藝術(shù)。從他不同時期的照片就能看出,他本人的故事也一定很豐富。 (參見:這個男人讓你的爬蟲開發(fā)效率提升8倍) 
除了requests,另一個很受歡迎的Python虛擬環(huán)境管理工具 Pipenv,也是由他發(fā)布。憑借這些項目,他一度是Github上獲得star最多的Python用戶。 
不過如今,他已將大部分項目移交給了Python開源社區(qū)管理維護(hù)。每一個Python開發(fā)者都有機會向項目貢獻(xiàn)自己的技術(shù)。 如果你是Python初學(xué)者,還沒進(jìn)行過第三方模塊的學(xué)習(xí),那不妨從requests做起,它上手簡單文檔清晰,是開發(fā)爬蟲和API請求必學(xué)的神器。 如果你已經(jīng)入門了Python,想要進(jìn)一步提升自己的編程能力,也可以把requests項目當(dāng)做進(jìn)階學(xué)習(xí)的案例,閱讀源代碼、學(xué)習(xí)代碼風(fēng)格和程序結(jié)構(gòu)的設(shè)計,甚至提交代碼改進(jìn)項目中的問題,為開源項目貢獻(xiàn)一份力。
|