日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Python第三方庫的王者:requests

 編程教室 2025-04-16 發(fā)布于江蘇

一個月被下載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 安裝一下,以及通過官方文檔了解模塊的使用方法。

pip install requests

你可能要說了,這些難道Python內(nèi)置的模塊不能實現(xiàn)?誒,那倒不至于,只是……沒那么方便。

比如,我現(xiàn)在要請求一個:

限制了瀏覽器類型、需要提交一組參數(shù)的POST接口,而返回結(jié)果是編碼為UTF8的JSON格式數(shù)據(jù),另外還做了gzip壓縮。

如果用Python默認(rèn)的庫來做,每一步都需要手動來處理,代碼比較繁瑣。

from urllib.request import Request, urlopenfrom urllib.parse import urlencodeimport gzipimport 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, Requestfrom urllib.parse import urlencodeimport 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)一份力。



    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多