求庫怎么選:Requests、HTTPX、aiohttp、curl_cffi、Scrapy 與 Playwright 對(duì)比)
摘要Python 里的“請(qǐng)求工具”并不在同一個(gè)層級(jí)。urllib.request、Requests、HTTPX、aiohttp 是 HTTP 客戶端urllib3 更接近連接池與重試基礎(chǔ)設(shè)施curl_cffi、pycurl 是 libcurl 綁定Scrapy 是采集框架Playwright 則驅(qū)動(dòng)真實(shí)瀏覽器。本文從同步/異步、HTTP/2、連接池、JavaScript、工程化和站點(diǎn)風(fēng)控邊界出發(fā)給出可執(zhí)行的選型方法。適合誰、前置條件與版本范圍本文適合正在編寫公開數(shù)據(jù)采集、內(nèi)部 API 客戶端、自動(dòng)化測(cè)試、數(shù)據(jù)同步任務(wù)的 Python 開發(fā)者。更新時(shí)間為 2026-08-25。文中示例只訪問本機(jī)服務(wù)或你擁有明確授權(quán)的接口不以真實(shí)第三方網(wǎng)站作為繞過目標(biāo)。本地驗(yàn)證環(huán)境為 Python 3.9、Requests 2.32.5、urllib3 2.6.3、curl_cffi 0.13.0同時(shí)依據(jù)當(dāng)前官方文檔核對(duì)了 HTTPX、aiohttp、Scrapy 與 Playwright 的接口邊界。不同版本的默認(rèn)超時(shí)和協(xié)議能力可能變化生產(chǎn)項(xiàng)目應(yīng)固定依賴并閱讀對(duì)應(yīng)版本發(fā)行說明。先澄清一個(gè)名稱CFFI 本身不是請(qǐng)求庫。它是 Python 調(diào)用 C 函數(shù)接口的工具大家常說的“cffi 請(qǐng)求包”通常指curl_cffi——通過 CFFI 綁定 libcurl并額外提供 Requests 風(fēng)格 API。一、先看結(jié)論不要按“能不能繞過”選擇請(qǐng)求庫請(qǐng)求庫解決的是客戶端工程問題怎樣建立連接、復(fù)用連接、發(fā)送 HTTP/1.1 或 HTTP/2、管理 Cookie、處理超時(shí)、并發(fā)和重試。站點(diǎn)的訪問控制則可能綜合身份、授權(quán)、速率、會(huì)話、設(shè)備、JavaScript 執(zhí)行、行為序列和業(yè)務(wù)風(fēng)險(xiǎn)。所以“普通封控用 Requests高級(jí)封控?fù)Q curl_cffi再高級(jí)換瀏覽器”是一個(gè)危險(xiǎn)的簡化。它既不準(zhǔn)確也容易把合法采集變成對(duì)安全控制的規(guī)避。更可靠的判斷順序是是否有官方 API、開放數(shù)據(jù)集或?qū)С龉δ苁欠駬碛性L問與自動(dòng)化授權(quán)robots.txt 和服務(wù)條款是否允許頁面數(shù)據(jù)來自靜態(tài) HTML、JSON API還是必須執(zhí)行 JavaScript任務(wù)是少量同步調(diào)用、高并發(fā) I/O還是帶調(diào)度與持久化的長期采集收到 401、403、429、驗(yàn)證碼或風(fēng)險(xiǎn)提示后應(yīng)該補(bǔ)授權(quán)、降頻、申請(qǐng)白名單還是停止工具選型應(yīng)回答第 3、4 個(gè)問題權(quán)限與風(fēng)控處置應(yīng)回答第 1、2、5 個(gè)問題。二、九類常見工具的本質(zhì)區(qū)別工具抽象層級(jí)并發(fā)模型主要優(yōu)勢(shì)典型場(chǎng)景urllib.requestPython 標(biāo)準(zhǔn)庫 HTTP 客戶端同步阻塞無第三方依賴安裝腳本、極小工具、受控環(huán)境健康檢查urllib3連接池/重試/HTTP 客戶端基礎(chǔ)層線程安全、同步池化、細(xì)粒度 Retry、TLS 控制SDK 底層、需要精細(xì)連接策略的服務(wù)Requests高層同步 HTTP 客戶端同步阻塞API 簡潔、生態(tài)成熟、Session 易用中小規(guī)模 API、后臺(tái)任務(wù)、快速原型HTTPX現(xiàn)代同步異步客戶端sync/async同一套 API、細(xì)分超時(shí)、可選 HTTP/2FastAPI 周邊、模型服務(wù)、異步 API 聚合aiohttp異步 HTTP 客戶端/服務(wù)端框架asyncio高并發(fā)流式 I/O、連接器控制大量合法 API、流式下載、異步微服務(wù)curl_cffilibcurl 的 CFFI 綁定sync/asynclibcurl 性能、HTTP/2/3、Requests 風(fēng)格接口客戶端兼容性測(cè)試、協(xié)議研究、授權(quán)環(huán)境診斷pycurllibcurl 的低層 Python 綁定Multi API細(xì)粒度 libcurl 能力、性能高網(wǎng)絡(luò)工具、遺留工程、底層參數(shù)控制Scrapy完整采集框架事件驅(qū)動(dòng)調(diào)度、去重、中間件、管道、統(tǒng)計(jì)、限速多頁面長期采集和可恢復(fù)任務(wù)Playwright真實(shí)瀏覽器自動(dòng)化sync/asyncJavaScript、DOM、瀏覽器上下文、網(wǎng)絡(luò)事件自有站點(diǎn) E2E、授權(quán)的動(dòng)態(tài)頁面自動(dòng)化1.urllib.request零依賴但不等于最省事它隨 Python 安裝支持重定向、代理、基礎(chǔ)認(rèn)證與 Cookie 處理器適合部署環(huán)境不允許增加依賴的腳本。官方文檔也明確推薦需要更高層接口時(shí)優(yōu)先考慮 Requests。其默認(rèn)使用 HTTP/1.1并帶Connection: close大量重復(fù)請(qǐng)求時(shí)通常不是首選。fromurllib.requestimportRequest,urlopen reqRequest(http://127.0.0.1:8000/health)withurlopen(req,timeout3)asresp:print(resp.status,resp.read().decode())2. urllib3Requests 背后的“連接基礎(chǔ)設(shè)施”urllib3 提供線程安全連接池、TLS 校驗(yàn)、重試、代理和壓縮解碼。Requests 的連接池正是建立在 urllib3 之上。普通業(yè)務(wù)代碼用 Requests 更舒服SDK 作者或需要精細(xì)控制池大小、重試條件的人才更常直接使用 urllib3。重試必須區(qū)分冪等性。連接尚未建立時(shí)重試 GET 通常風(fēng)險(xiǎn)較低響應(yīng)讀取超時(shí)后服務(wù)端可能已經(jīng)執(zhí)行 POST。沒有業(yè)務(wù)冪等鍵時(shí)不要因?yàn)閹熘С?Retry 就自動(dòng)重放寫操作。3. Requests同步腳本的默認(rèn)答案Requests 的優(yōu)勢(shì)是認(rèn)知成本低。Session會(huì)持久化 Cookie、復(fù)用連接并保存默認(rèn)配置連續(xù)訪問同一授權(quán) API 時(shí)不要每次調(diào)用頂層requests.get()。importrequestswithrequests.Session()assession:session.headers[User-Agent]internal-data-client/1.0responsesession.get(http://127.0.0.1:8000/items,timeout(3.05,10),# connect, read)response.raise_for_status()print(response.json())Requests 默認(rèn)沒有超時(shí)生產(chǎn)代碼必須顯式配置。它適合數(shù)十到數(shù)百個(gè)順序請(qǐng)求若在 asyncio 服務(wù)中直接調(diào)用會(huì)阻塞事件循環(huán)應(yīng)改用 HTTPX AsyncClient、aiohttp或把同步調(diào)用隔離到線程池。4. HTTPX同步與異步統(tǒng)一超時(shí)分類更清楚HTTPX 同時(shí)提供Client與AsyncClient可以區(qū)分 connect、read、write 和 pool timeout并可選擇啟用 HTTP/2。這對(duì)異步 Web 服務(wù)調(diào)用、RAG 檢索器、模型網(wǎng)關(guān)和 API 聚合尤其有價(jià)值。importasyncioimporthttpxasyncdefmain():timeouthttpx.Timeout(connect2,read10,write5,pool0.5)limitshttpx.Limits(max_connections20,max_keepalive_connections10)asyncwithhttpx.AsyncClient(timeouttimeout,limitslimits)asclient:responseawaitclient.get(http://127.0.0.1:8000/items)response.raise_for_status()print(response.json())asyncio.run(main())異步不等于無限并發(fā)。連接池外還應(yīng)使用 semaphore 或有界隊(duì)列做背壓否則大量協(xié)程會(huì)在池前排隊(duì)最終出現(xiàn)PoolTimeout。5. aiohttp高并發(fā)流式任務(wù)更靈活aiohttp 是成熟的 asyncio 生態(tài)組件既能寫客戶端也能寫服務(wù)端。ClientSession內(nèi)含連接池官方明確不建議“每個(gè)請(qǐng)求創(chuàng)建一個(gè) Session”。它適合長連接、分塊讀取、大量小 API 調(diào)用以及需要定制 DNS、Connector、TraceConfig 的工程。與 HTTPX 相比aiohttp 更偏原生異步和細(xì)粒度控制HTTPX 的同步/異步 API 更一致遷移 Requests 代碼也更自然。二者沒有絕對(duì)勝負(fù)取決于項(xiàng)目是否全異步、是否需要 HTTP/2以及團(tuán)隊(duì)對(duì)連接器和生命周期的掌握程度。6.curl_cffi與 pycurl重點(diǎn)是 libcurl不是“萬能通行證”curl_cffi通過 CFFI 調(diào)用 libcurl提供同步、異步、WebSocket 和 HTTP/2/3 能力。它還能在授權(quán)的兼容性測(cè)試中復(fù)現(xiàn)部分瀏覽器 TLS/HTTP2 特征。pycurl 更接近 libcurl 原生接口學(xué)習(xí)成本更高但已有成熟網(wǎng)絡(luò)工具可能依賴它。這里必須強(qiáng)調(diào)邊界傳輸指紋只是風(fēng)控信號(hào)之一。即使客戶端特征接近瀏覽器也不能解決賬號(hào)權(quán)限、Cookie 來源、JavaScript 狀態(tài)、行為評(píng)分、驗(yàn)證碼和業(yè)務(wù)規(guī)則。不得用impersonate等能力規(guī)避第三方真實(shí)網(wǎng)站的驗(yàn)證合理用途是自有 WAF 回歸、客戶端兼容性排障和經(jīng)授權(quán)的安全測(cè)試。7. Scrapy當(dāng)任務(wù)變成“系統(tǒng)”不要繼續(xù)堆 for 循環(huán)Scrapy 不只是另一個(gè)get()。它提供請(qǐng)求調(diào)度、URL 去重、下載中間件、Item Pipeline、失敗重試、統(tǒng)計(jì)和斷點(diǎn)相關(guān)能力。適合站點(diǎn)地圖、分頁、詳情頁、數(shù)據(jù)清洗和存儲(chǔ)組成的長期任務(wù)。合規(guī)配置比所謂“反封技巧”更重要啟用ROBOTSTXT_OBEY設(shè)置DOWNLOAD_DELAY、每域并發(fā)和 AutoThrottle監(jiān)控 429、503、延遲上升與重試數(shù)量。官方優(yōu)化文檔明確指出超過站點(diǎn)可承受的并發(fā)會(huì)讓采集更慢而不是更快。8. Playwright需要 JavaScript 時(shí)使用瀏覽器但不替代授權(quán)如果內(nèi)容必須經(jīng)過 JavaScript 渲染或者任務(wù)本來就是自有網(wǎng)站的端到端測(cè)試Playwright 能啟動(dòng) Chromium、Firefox 或 WebKit等待 DOM 條件并觀察 XHR/fetch。代價(jià)是啟動(dòng)慢、內(nèi)存大、并發(fā)昂貴選擇器也需要維護(hù)。能執(zhí)行 JavaScript不代表可以自動(dòng)通過驗(yàn)證碼。出現(xiàn)人機(jī)驗(yàn)證、賬號(hào)異常或服務(wù)條款限制時(shí)應(yīng)停止并轉(zhuǎn)人工、官方 API 或站點(diǎn)授權(quán)流程。不要把瀏覽器自動(dòng)化寫成驗(yàn)證規(guī)避器。三、不同訪問控制等級(jí)應(yīng)該怎樣應(yīng)對(duì)下表不是“破解等級(jí)”而是合規(guī)處置等級(jí)現(xiàn)象常見原因可選工具正確處理靜態(tài) HTML / 公開 JSON無特殊控制Requests、HTTPX、aiohttp、Scrapy設(shè)置超時(shí)、限速、緩存遵守 robots.txt401 / 403未認(rèn)證、無權(quán)限、簽名錯(cuò)誤任意 HTTP 客戶端使用官方憑據(jù)、OAuth 或申請(qǐng)權(quán)限不要偽造身份429 /Retry-After速率或配額超限urllib3 Retry、HTTPX、Scrapy AutoThrottle降低并發(fā)、指數(shù)退避、遵守配額必要時(shí)申請(qǐng)?zhí)嵘撁婵諝ぁ?shù)據(jù)由 JS 加載前端渲染或內(nèi)部 API優(yōu)先官方 API授權(quán)時(shí) Playwright查公開接口/文檔瀏覽器僅用于允許的自動(dòng)化TLS/HTTP2 客戶端不兼容企業(yè)網(wǎng)關(guān)、舊客戶端、協(xié)議差異HTTPX、curl_cffi、pycurl在自有/授權(quán)環(huán)境復(fù)現(xiàn)修復(fù)兼容或配置白名單JavaScript Challenge / CAPTCHA人機(jī)驗(yàn)證或高風(fēng)險(xiǎn)會(huì)話無通用請(qǐng)求包停止自動(dòng)化人工完成或聯(lián)系站點(diǎn)提供正式通道行為評(píng)分、賬號(hào)限制、實(shí)名風(fēng)險(xiǎn)業(yè)務(wù)風(fēng)控?zé)o不重試轟炸、不換身份人工申訴或終止任務(wù)一個(gè)實(shí)用原則是**403 不是庫選錯(cuò)了429 也不是代理不夠多。**先記錄狀態(tài)碼、響應(yīng)頭、請(qǐng)求速率、身份與業(yè)務(wù)許可再?zèng)Q定修復(fù)客戶端還是調(diào)整流程。四、同一任務(wù)的選型決策樹只有幾個(gè)公開 API、腳本以同步方式運(yùn)行選 Requests。庫必須零依賴選urllib.request。需要自定義池、TLS 和 Retry且在構(gòu)建 SDK 底層選 urllib3。項(xiàng)目既有同步腳本又有 asyncio 服務(wù)或需要細(xì)分超時(shí)/HTTP2選 HTTPX。全異步、高并發(fā)流式 I/O并需要 Connector/TraceConfig選 aiohttp。需要調(diào)度、去重、分頁、管道和運(yùn)行統(tǒng)計(jì)選 Scrapy。自有站點(diǎn)依賴 JavaScript目標(biāo)是 E2E 或授權(quán)數(shù)據(jù)提取選 Playwright。需要驗(yàn)證自有網(wǎng)關(guān)對(duì) libcurl、HTTP2/3 或客戶端握手的兼容性考慮curl_cffi/pycurl。不要一上來就使用瀏覽器。一個(gè)瀏覽器進(jìn)程的資源開銷遠(yuǎn)高于 HTTP 連接很多動(dòng)態(tài)頁面的數(shù)據(jù)實(shí)際來自有文檔、可授權(quán)的 JSON API。也不要為了速度盲目異步任務(wù)只有幾十個(gè)請(qǐng)求時(shí)Requests 的可維護(hù)性往往更有價(jià)值。五、生產(chǎn)環(huán)境共同檢查表無論選擇哪個(gè)庫都應(yīng)該完成這些工程配置明確 connect/read/write/pool 或 total timeout禁止無限等待。復(fù)用 Session/Client不為每個(gè)請(qǐng)求重新建連接池。給并發(fā)設(shè)置上限解析和落庫也要有背壓。只對(duì)安全、冪等、可判定的失敗重試并設(shè)置總時(shí)間預(yù)算。記錄異常類型、狀態(tài)碼、目標(biāo)主機(jī)、耗時(shí)和重試次數(shù)但不記錄 Cookie、Authorization、個(gè)人信息和完整請(qǐng)求體。尊重 robots.txt、服務(wù)條款、API 配額與Retry-After。發(fā)現(xiàn) CAPTCHA、賬號(hào)異常或身份驗(yàn)證時(shí)停止不循環(huán)重放請(qǐng)求。用本地服務(wù)器、Mock API 或明確授權(quán)環(huán)境做回歸測(cè)試。如果此前只把超時(shí)寫成一個(gè)數(shù)字可以繼續(xù)閱讀Python HTTPX 超時(shí)不是一個(gè)數(shù)字連接池、重試與可觀測(cè)性排障實(shí)戰(zhàn)。如果需要理解 TLS 客戶端特征與風(fēng)控邊界可參考JA3 已經(jīng)不夠用了JA4/JA4H 風(fēng)控指紋原理與本地實(shí)驗(yàn)。行為評(píng)分并不等于請(qǐng)求頭校驗(yàn)相關(guān)原理見不彈驗(yàn)證碼也能識(shí)別機(jī)器人行為風(fēng)控與會(huì)話評(píng)分原理。總結(jié)Requests 的強(qiáng)項(xiàng)是簡單HTTPX 是現(xiàn)代同步/異步統(tǒng)一客戶端aiohttp 擅長 asyncio 與流式高并發(fā)urllib3 提供底層連接基礎(chǔ)設(shè)施curl_cffi/pycurl 接近 libcurlScrapy負(fù)責(zé)完整采集工作流Playwright負(fù)責(zé)真實(shí)瀏覽器環(huán)境。它們是不同層級(jí)的工具不是一條“繞過能力排行榜”。面對(duì)訪問限制先確認(rèn)權(quán)限、API、配額和速率面對(duì) JavaScript 才考慮瀏覽器面對(duì)驗(yàn)證碼和賬號(hào)風(fēng)險(xiǎn)就停止自動(dòng)化。這樣選擇出來的方案才會(huì)穩(wěn)定、可維護(hù)也不會(huì)把工程問題變成安全與合規(guī)問題。一手參考資料Requests 官方文檔https://docs.python-requests.org/en/stable/Requests Advanced Usagehttps://requests.readthedocs.io/en/stable/user/advanced/urllib3 官方文檔https://urllib3.readthedocs.io/en/stable/Pythonurllib.requesthttps://docs.python.org/3/library/urllib.request.htmlHTTPX Async Supporthttps://www.python-httpx.org/async/HTTPX Timeoutshttps://www.python-httpx.org/advanced/timeouts/aiohttp Client Quickstarthttps://docs.aiohttp.org/en/stable/client_quickstart.htmlcurl_cffi 官方文檔https://curl-cffi.readthedocs.io/en/stable/Scrapy Downloader Middlewarehttps://docs.scrapy.org/en/master/topics/downloader-middleware.htmlScrapy AutoThrottlehttps://docs.scrapy.org/en/master/topics/autothrottle.htmlPlaywright Pythonhttps://playwright.dev/python/docs/libraryPlaywright Networkhttps://playwright.dev/python/docs/network