Python 的七個(gè)HTTP請(qǐng)求庫(kù)對(duì)比小結(jié)
Python HTTP請(qǐng)求庫(kù)對(duì)比
| 庫(kù)名稱 | 特點(diǎn) | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|
requests | 簡(jiǎn)單易用的HTTP庫(kù),基于urllib3。 | - 語(yǔ)法簡(jiǎn)潔 - 社區(qū)支持強(qiáng)大 - 易于上手和維護(hù) | - 阻塞式調(diào)用,不支持異步操作 - 相比 aiohttp體積較大 |
http.client | Python標(biāo)準(zhǔn)庫(kù)中的低級(jí)HTTP庫(kù)。 | - 無(wú)需安裝第三方庫(kù) - 提供底層訪問(wèn),可自定義程度高 | - API使用相對(duì)復(fù)雜 - 缺少高級(jí)HTTP功能 |
aiohttp | 異步的HTTP網(wǎng)絡(luò)通信庫(kù),支持HTTP/1.1和HTTP/2。 | - 支持異步操作,適合高并發(fā) - 支持WebSockets | - 異步編程模型學(xué)習(xí)曲線陡峭 - 較新,社區(qū)支持不如 requests |
urllib | Python標(biāo)準(zhǔn)庫(kù),提供URL處理。 | - 無(wú)需安裝第三方庫(kù) - 功能全面,包括請(qǐng)求和錯(cuò)誤處理 | - 易用性不如requests- 不支持異步操作 |
httpx | 支持HTTP/1.1和HTTP/2的異步HTTP庫(kù)。 | - 支持同步和異步請(qǐng)求 - 支持HTTP/2 - 可擴(kuò)展性好 | - 相對(duì)于requests,知名度和社區(qū)支持較小 |
treq | 基于Twisted的異步HTTP客戶端,使用requests的API風(fēng)格。 | - 異步操作 - 與 requests類似的API- 適用于 Twisted用戶 | - 依賴于Twisted框架- 社區(qū)支持有限 |
requests-toolbelt | requests的官方擴(kuò)展,提供額外功能。 | - 增加requests沒(méi)有的功能- 流式上傳下載支持 | - 作為擴(kuò)展,需要與requests結(jié)合使用- 功能較為特定 |
在選擇庫(kù)時(shí),應(yīng)該考慮以下因素:
- 項(xiàng)目需求:是否需要異步支持,是否處理大量并發(fā)請(qǐng)求。
- 易用性:API的簡(jiǎn)潔性和學(xué)習(xí)曲線。
- 社區(qū)和文檔:活躍的社區(qū)和詳盡的文檔可以加快開(kāi)發(fā)速度。
- 性能:不同庫(kù)在不同場(chǎng)景下的性能表現(xiàn)。
- 兼容性:是否支持需要的HTTP特性,如HTTP/2或WebSockets。
實(shí)戰(zhàn)請(qǐng)求豆瓣排行榜
curl ^"https://movie.douban.com/j/chart/top_list_count?type=11&interval_id=100^%^3A90&action=^" ^ -H "Accept: */*" ^ -H "Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7" ^ -H "Connection: keep-alive" ^ -H ^"Cookie: ll=^\^"118282^\^"; bid=p6VTwxlhQxU; _pk_id.100001.4cf6=1960560bd6f348cf.1717555113.; __utmc=30149280; __utmc=223695111; __yadk_uid=vu9yRywnfgofYdkNxlDGN1LGZumZZlP3; _vwo_uuid_v2=DB54A160968C09D586B65593E774AC10A^|93b3f99adf2e8bfe6ce4a84c068e3f82; _pk_ref.100001.4cf6=^%^5B^%^22^%^22^%^2C^%^22^%^22^%^2C1717727676^%^2C^%^22https^%^3A^%^2F^%^2Fwww.heywhale.com^%^2F^%^22^%^5D; push_noty_num=0; push_doumail_num=0; __utmv=30149280.19806; __utma=30149280.912128761.1717555113.1717725025.1717728345.3; __utmz=30149280.1717728345.3.2.utmcsr=google^|utmccn=(organic)^|utmcmd=organic^|utmctr=(not^%^20provided); __utma=223695111.1475293929.1717555113.1717727676.1717728345.4; __utmz=223695111.1717728345.4.2.utmcsr=google^|utmccn=(organic)^|utmcmd=organic^|utmctr=(not^%^20provided)^" ^ -H ^"Referer: https://movie.douban.com/typerank?type_name=^%^E5^%^89^%^A7^%^E6^%^83^%^85&type=11&interval_id=100:90&action=^" ^ -H "Sec-Fetch-Dest: empty" ^ -H "Sec-Fetch-Mode: cors" ^ -H "Sec-Fetch-Site: same-origin" ^ -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" ^ -H "X-Requested-With: XMLHttpRequest" ^ -H ^"sec-ch-ua: ^\^"Google Chrome^\^";v=^\^"125^\^", ^\^"Chromium^\^";v=^\^"125^\^", ^\^"Not.A/Brand^\^";v=^\^"24^\^"^" ^ -H "sec-ch-ua-mobile: ?0" ^ -H ^"sec-ch-ua-platform: ^\^"Windows^\^"^"
這個(gè)curl命令包含了一個(gè)HTTP GET請(qǐng)求,它發(fā)送到豆瓣電影的某個(gè)API端點(diǎn),請(qǐng)求某種類型的電影排行數(shù)據(jù)。請(qǐng)求中包含了多個(gè)HTTP頭,例如Accept、Accept-Language、Connection、Cookie、Referer、Sec-Fetch-*、User-Agent、X-Requested-With和sec-ch-ua等。這些頭信息通常用于控制請(qǐng)求的行為,或者提供客戶端環(huán)境的額外信息。
以下是使用幾種不同的Python HTTP請(qǐng)求庫(kù)來(lái)模擬這個(gè)curl請(qǐng)求的示例:
1. 使用 requests 庫(kù)
import requests
url = "https://movie.douban.com/j/chart/top_list_count?type=11&interval_id=100:90&action="
headers = {
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"Connection": "keep-alive",
# Cookie 頭過(guò)長(zhǎng),需要按實(shí)際值填充
# ...
"Referer": "https://movie.douban.com/typerank?type_name=劇情&type=11&interval_id=100:90&action=",
# 其他 headers 按需填充
# ...
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers)
print(response.text)
2. 使用 aiohttp 庫(kù)(異步)
import aiohttp
import asyncio
async def fetch(url, headers):
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers) as response:
return await response.text()
url = "https://movie.douban.com/j/chart/top_list_count?type=11&interval_id=100:90&action="
headers = {...} # 同上
loop = asyncio.get_event_loop()
html = loop.run_until_complete(fetch(url, headers))
print(html)
3. 使用 http.client(Python 標(biāo)準(zhǔn)庫(kù))
import http.client
import urllib.parse
conn = http.client.HTTPSConnection("movie.douban.com")
# 將參數(shù)編碼為URL
params = urllib.parse.urlencode({
'type': '11',
'interval_id': '100:90',
'action': ''
})
url = f"/j/chart/top_list_count?{params}"
headers = {
# 同上
}
conn.request("GET", url, headers=headers)
response = conn.getresponse()
data = response.read()
print(data.decode('utf-8'))
conn.close()
注意事項(xiàng)
- 由于
Cookie和其他一些headers可能非常長(zhǎng),這里沒(méi)有完全展示它們的值。在實(shí)際使用中,你需要將它們完整地填入headers字典中。 - 在
requests示例中,我們使用同步方式發(fā)送請(qǐng)求并打印響應(yīng)內(nèi)容。 - 在
aiohttp示例中,我們使用異步方式發(fā)送請(qǐng)求。aiohttp是處理并發(fā)請(qǐng)求的好選擇,特別是在需要處理大量網(wǎng)絡(luò)I/O操作時(shí)。 - 在
http.client示例中,我們使用了Python標(biāo)準(zhǔn)庫(kù)中的低級(jí)HTTP客戶端。這種方式比較繁瑣,但它不依賴于任何外部庫(kù)。
根據(jù)你的需求和偏好,選擇最適合你的庫(kù)來(lái)執(zhí)行HTTP請(qǐng)求。如果你需要處理大量并發(fā)請(qǐng)求,可能會(huì)傾向于使用aiohttp。如果你需要簡(jiǎn)單快速地發(fā)起請(qǐng)求,并且不想引入額外的依賴,可能會(huì)選擇requests。如果你正在編寫(xiě)一個(gè)需要精細(xì)控制網(wǎng)絡(luò)層面的底層應(yīng)用,可能會(huì)選擇http.client。
到此這篇關(guān)于Python 的七個(gè)HTTP請(qǐng)求庫(kù)對(duì)比小結(jié)的文章就介紹到這了,更多相關(guān)Python HTTP請(qǐng)求庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python實(shí)現(xiàn)在控制臺(tái)查看excel的內(nèi)容
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)在控制臺(tái)查看excel的內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
Python logging日志模塊的核心用法與實(shí)操技巧
logging 是 Python 標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,它提供了靈活的日志記錄功能,通過(guò) logging,開(kāi)發(fā)者可以方便地將日志信息輸出到控制臺(tái)、文件、網(wǎng)絡(luò)等多種目標(biāo),本文給大家介紹了Python logging日志模塊的核心用法與實(shí)操技巧,需要的朋友可以參考下2026-03-03
Python3 字典dictionary入門(mén)基礎(chǔ)附實(shí)例
Python字典是另一種可變?nèi)萜髂P?,且可存?chǔ)任意類型對(duì)象,如字符串、數(shù)字、元組等其他容器模型,字典由鍵和對(duì)應(yīng)值成對(duì)組成,字典也被稱作關(guān)聯(lián)數(shù)組或哈希表2020-02-02
Python 正則表達(dá)式進(jìn)階用法之字符集與字符范圍詳解
本文詳細(xì)介紹了Python正則表達(dá)式中的字符集和字符范圍,包括字符集的基本概念、特殊字符、示例和注意事項(xiàng),通過(guò)這些進(jìn)階用法,我們可以更高效地處理復(fù)雜的文本模式,感興趣的朋友跟隨小編一起看看吧2024-11-11
利用Python繪制MySQL數(shù)據(jù)圖實(shí)現(xiàn)數(shù)據(jù)可視化
這篇文章主要介紹了利用Python繪制MySQL數(shù)據(jù)圖實(shí)現(xiàn)數(shù)據(jù)可視化,其中包括Python與MySQL的連接搭建、用Python執(zhí)行MySQL語(yǔ)句查詢等內(nèi)容,需要的朋友可以參考下2015-03-03
細(xì)數(shù)nn.BCELoss與nn.CrossEntropyLoss的區(qū)別
今天小編就為大家整理了一篇細(xì)數(shù)nn.BCELoss與nn.CrossEntropyLoss的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python中tkinter的應(yīng)用:修改字體的實(shí)例講解
今天小編就為大家分享一篇python中tkinter的應(yīng)用:修改字體的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Pytorch加載數(shù)據(jù)集的方式總結(jié)及補(bǔ)充
Pytorch自定義數(shù)據(jù)集方法,應(yīng)該是用pytorch做算法的最基本的東西,下面這篇文章主要給大家介紹了關(guān)于Pytorch加載數(shù)據(jù)集的方式總結(jié)及補(bǔ)充,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11

