HTTPX入門使用教程
1. 什么是HTTPX?
HTTPX是一款Python棧HTTP客戶端庫,它提供了比標準庫更高級別、更先進的功能,如連接重用、連接池、超時控制、自動繁衍請求等等。HTTPX同時也支持同步和異步兩種方式,因此可以在同步代碼和異步代碼中通用。
HTTPX功能如下:
1. 發(fā)送HTTP請求:HTTPX支持發(fā)送HTTP GET、POST等請求,并提供了豐富的選項進行定制化。
2. 請求頭和查詢參數(shù):HTTPX可以方便地添加請求頭和查詢參數(shù)到HTTP請求中。
3. 超時設置:HTTPX支持對HTTP請求的超時時間進行設置,以避免長時間等待響應。
4. SSL/TLS證書驗證:當使用HTTPS協(xié)議時,HTTPX可以驗證SSL/TLS證書。
5. 文件上傳和下載:HTTPX可以用于上傳和下載文件。
6. Cookie管理:HTTPX可以管理cookie。
7. 連接池:HTTPX提供連接池以提高性能。
8. 異步請求:HTTPX支持異步請求,在異步代碼中提供了更好的性能表現(xiàn)。
相比其他HTTP客戶端庫,HTTPX有以下優(yōu)勢:
- 性能更好:HTTPX采用異步IO模型實現(xiàn)高效的并發(fā)處理,使得其在處理大量數(shù)據(jù)和并發(fā)請求時比同類庫要快得多。
- 功能更全面:HTTPX提供了更多的功能,如連接池、自動繁衍請求等等,使得它可以勝任更多不同的HTTP場景。
- 更為靈活:HTTPX提供了更多可用的選項以滿足不同的HTTP場景和使用需求,從而使得它更為靈活。
- 更加安全:HTTPX在處理HTTPS請求時提供更完善的SSL/TLS證書驗證機制,從而更加安全。
2. HTTPX功能
1. 發(fā)送HTTP請求
import httpx # 發(fā)送GET請求 response = httpx.get('https://www.example.com') print(response.status_code) # 狀態(tài)碼 print(response.text) # 響應內容 # 發(fā)送POST請求 data = {'name': 'example', 'age': 18} response = httpx.post('https://www.example.com', data=data) print(response.status_code) # 狀態(tài)碼 print(response.text) # 響應內容
2. 請求頭和查詢參數(shù)
HTTPX發(fā)送HTTP請求時往往需要在請求中添加一些頭部信息或查詢參數(shù),下面介紹如何在HTTPX中添加和定制這些信息。
添加請求頭
可以通過headers參數(shù)向HTTP請求中添加頭部信息。以下是一個示例代碼:
import httpx headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } response = httpx.get('https://www.example.com', headers=headers) print(response.status_code) print(response.text)
可以看到,在發(fā)送GET請求時,使用了一個 headers 字典來指定請求頭。其中 User-Agent 是模擬瀏覽器發(fā)送請求的標準請求頭之一??梢愿鶕?jù)實際需求添加更多的請求頭信息。
添加查詢參數(shù)
除了請求頭外,還可以通過 params 參數(shù)向HTTP請求中添加查詢參數(shù)。以下是一個示例代碼:
import httpx params = {'key1': 'value1', 'key2': 'value2'} response = httpx.get('https://www.example.com', params=params) print(response.status_code) print(response.text)
在上述代碼中,params 參數(shù)被用于將查詢參數(shù)添加到 GET 請求中。具體而言,HTTPX 會根據(jù)鍵值對自動生成查詢字符串并將其附加到 URL 的末尾,就像在瀏覽器中一樣。
3. 超時設置
在發(fā)送HTTP請求時,往往需要設置超時時間以避免等待過長時間的響應。HTTPX 提供了設置超時時間的方法,下面介紹如何在 HTTPX 中設置超時時間:
發(fā)送單次請求時設置超時時間
可以通過 timeout 參數(shù)來設置單個請求的超時時間,單位為秒(s)。以下是一個示例代碼:
import httpx # 設置 5 秒超時時間 timeout = httpx.Timeout(5) response = httpx.get('https://www.example.com', timeout=timeout) print(response.status_code) print(response.text)
在上述代碼中,timeout 參數(shù)被用于將超時時間設置為 5 秒。如果在 5 秒內沒有收到服務器的響應,HTTPX 將自動取消該請求并拋出 httpx.ReadTimeout 異常。
全局設置超時時間
除了可以在單個請求中設置超時時間外,還可以全局設置所有請求的超時時間。可以通過創(chuàng)建一個 Client 實例并指定超時時間來實現(xiàn)。以下是一個示例代碼:
import httpx # 全局設置 5 秒超時時間 client = httpx.Client(timeout=5) response = client.get('https://www.example.com') print(response.status_code) print(response.text)
在上述代碼中,創(chuàng)建了一個 Client 實例,并將超時時間設置為 5 秒。在之后的所有請求中,都會默認使用這個超時時間。需要注意的是,全局設置會影響所有請求,因此需要根據(jù)實際情況合理地設置超時時間。
4. 異步請求
異步請求示例
首先,需要安裝異步標準庫 asyncio 和 HTTPX 庫。
安裝完成后,就可以在 Python 腳本中使用異步請求了。以下是一個簡單的異步 GET 請求示例:
import asyncio import httpx async def main(): async with httpx.AsyncClient() as client: response = await client.get('https://www.example.com') print(response.status_code) print(response.text) asyncio.run(main())
在上述代碼中,我們使用異步函數(shù) main() 來發(fā)送異步 GET 請求。其中,使用了 httpx.AsyncClient() 創(chuàng)建了一個異步客戶端實例,然后調用了 client.get() 函數(shù)來發(fā)送 GET 請求。
在異步請求中,需要使用關鍵字 await 等待異步操作執(zhí)行完成,這樣才能保證程序按照正確的順序執(zhí)行。
進一步使用示例
除了簡單的 GET 請求外,HTTPX 還支持復雜的異步操作和定制化需求。以下是一個使用異步 POST 請求并上傳文件的示例:
import asyncio import httpx async def main(): async with httpx.AsyncClient() as client: # 上傳文件 files = {'file': ('example.txt', 'Hello, world!')} response = await client.post('https://www.example.com/upload', files=files) # 顯示響應信息 print(response.status_code) print(response.text) asyncio.run(main())
在上述代碼中,使用了 client.post() 函數(shù)向服務器上傳文件。其中,files 參數(shù)被用于指定上傳的文件信息。
需要注意的是,在異步請求過程中,需使用 async with httpx.AsyncClient() as client: 的方式創(chuàng)建異步客戶端實例,并通過 async/await 關鍵字等待異步操作完成,這樣才能確保程序正確執(zhí)行。
5. SSL/TLS證書驗證
SSL/TLS證書驗證是保證HTTP通信安全的重要手段之一。HTTPX提供了對SSL/TLS證書的驗證機制,下面介紹如何在HTTPX中進行SSL/TLS證書驗證:
驗證服務器證書
HTTPX 默認會驗證服務器證書,如果證書無效或不可信,則會拋出 httpx.RemoteProtocolError 異常。以下是一個示例代碼:
import httpx response = httpx.get('https://www.example.com') print(response.status_code) print(response.text)
在上述代碼中,使用 httpx.get() 函數(shù)向服務器發(fā)送 GET 請求,并默認啟動 SSL/TLS 證書驗證。如果服務器證書無效,則 HTTPX 會拋出 httpx.RemoteProtocolError 異常。
禁用服務器證書驗證
雖然 SSL/TLS 證書驗證是確保通信安全的重要手段,但在一些特殊情況下需要禁用證書驗證,例如調試時使用自簽名證書等??梢酝ㄟ^將 verify 參數(shù)設置為 False 來禁用 SSL/TLS 證書驗證。以下是一個示例代碼:
import httpx response = httpx.get('https://www.example.com', verify=False) print(response.status_code) print(response.text)
在上述代碼中,verify=False 參數(shù)被用于禁用服務器證書驗證。需要注意的是,這種方法會降低通信安全性,應謹慎使用。
指定客戶端證書
除了驗證服務器證書外,HTTPX 還支持指定客戶端證書??梢酝ㄟ^ cert 參數(shù)來指定客戶端證書和私鑰文件的路徑。以下是一個示例代碼:
import httpx client_cert = ('path/to/cert.pem', 'path/to/key.pem') response = httpx.get('https://www.example.com', cert=client_cert) print(response.status_code) print(response.text)
在上述代碼中,client_cert 變量被用于指定客戶端證書和私鑰的路徑。需要注意的是,客戶端證書應該由受信任的第三方機構頒發(fā),并且應該進行保護。
6. 文件上傳和下載
HTTPX支持文件上傳和下載,可以通過httpx.post() 和 httpx.get() 函數(shù)向服務器上傳和下載文件。下面分別介紹如何在 HTTPX 中進行文件上傳和下載:
文件上傳示例
可以通過 files 參數(shù)來實現(xiàn)文件上傳功能。以下是一個文件上傳的示例代碼:
import httpx with open('example.txt', 'rb') as f: files = {'file': ('example.txt', f)} response = httpx.post('https://www.example.com/upload', files=files) print(response.status_code) print(response.text)
在上述代碼中,使用了 open() 函數(shù)打開本地文件,并將文件數(shù)據(jù)添加到 files 參數(shù)中。然后,使用 httpx.post() 函數(shù)向服務器發(fā)送 POST 請求并上傳文件。
需要注意的是,('example.txt', f) 中,第一個參數(shù)是文件名,第二個參數(shù)是文件內容。具體而言,文件內容應該以二進制格式表示。
文件下載示例
可以通過 stream=True 參數(shù)將文件下載至內存中,并逐步寫入本地文件。以下是一個文件下載的示例代碼:
import httpx response = httpx.get('https://www.example.com/image.jpg', stream=True) with open('image.jpg', 'wb') as f: for chunk in response.iter_bytes(): f.write(chunk) print(response.status_code)
在上述代碼中,使用了 httpx.get() 函數(shù)向服務器發(fā)送 GET 請求。其中,stream=True 參數(shù)被用于啟動響應流模式,這樣可以將文件下載到內存中,然后逐步寫入本地文件。需要注意的是,在下載大文件時,響應流模式可以減少內存占用并提高性能。
Cookie管理
HTTPX提供了用于管理Cookie的工具,可以通過httpx.CookieJar()對象來管理Cookie。下面介紹如何在HTTPX中進行Cookie管理:
使用CookieJar管理Cookie
可以使用 httpx.CookieJar() 對象來管理 Cookie。以下是一個示例代碼:
import httpx # 創(chuàng)建 CookieJar 實例 cookie_jar = httpx.CookieJar() # 將 Cookie 添加到 CookieJar 中 cookie = httpx.cookies.Cookie(name='name', value='value') cookie_jar.set_cookie(cookie) # 使用 CookieJar 發(fā)送請求 with httpx.Client(cookie_jar=cookie_jar) as client: response = client.get('https://www.example.com') print(response.status_code)
在上述代碼中,首先創(chuàng)建了一個 httpx.CookieJar() 實例,并將 httpx.cookies.Cookie() 對象添加到 CookieJar 中。然后,在使用 HTTPX 發(fā)送請求時,通過 cookie_jar=cookie_jar 參數(shù)來指定使用 CookieJar 管理 Cookie。
需要注意的是,通過 set_cookie() 方法向 httpx.CookieJar() 添加 Cookie 后,這些 Cookie 將被自動附加到后續(xù)的 HTTP 請求中。
使用Session管理Cookie
除了使用 httpx.CookieJar() 對象管理 Cookie 外,還可以使用 httpx.Client() 對象的 Session 來管理 Cookie。以下是一個示例代碼:
import httpx # 創(chuàng)建 Session 實例 session = httpx.Client() # 向 Session 中添加 Cookie cookie = httpx.cookies.Cookie(name='name', value='value') session.cookies.set_cookie(cookie) # 使用 Session 發(fā)送請求 response = session.get('https://www.example.com') print(response.status_code)
在上述代碼中,通過 httpx.Client() 創(chuàng)建了一個 HTTP 客戶端實例,并使用 session.cookies.set_cookie() 方法向 Session 中添加 Cookie。然后,在使用 HTTPX 發(fā)送請求時,不需要指定 cookie_jar 參數(shù),而是使用 Session 自動管理 Cookie。
需要注意的是,httpx.Client() 的 Session 會自動保存并發(fā)送所有 Cookie,因此在發(fā)送多個 HTTP 請求時,可以方便地管理 Cookie。
連接池
HTTPX 是一個 Python 的異步 HTTP 客戶端庫。它支持連接池來重用已建立的 HTTP 連接,從而提高性能并減少網(wǎng)絡延遲。
創(chuàng)建連接池
要創(chuàng)建連接池,請使用 httpx.AsyncClient() 構造函數(shù)并指定 limits 參數(shù)。
import httpx limits = httpx.Limits(max_connections=100, max_keepalive=10) client = httpx.AsyncClient(limits=limits)
此代碼將創(chuàng)建一個最大連接數(shù)為 100,最大保持活動連接數(shù)為 10 的連接池。
使用連接池
一旦你創(chuàng)建了連接池,你可以像正常地發(fā)送請求一樣使用 httpx.AsyncClient() 實例發(fā)送請求。在創(chuàng)建客戶端時,HTTPX 將自動管理連接池中的連接。
response = await client.get("https://www.example.com") print(response.text)
這將使用連接池中的空閑連接來發(fā)送 HTTP GET 請求,并返回響應。如果沒有可用的連接,HTTPX 將自動創(chuàng)建一個新連接。
3. 使用HTTPX編寫Web爬蟲
import asyncio import httpx from bs4 import BeautifulSoup async def fetch(url): async with httpx.AsyncClient() as client: response = await client.get(url) return response.text async def scrape(): url = "https://book.douban.com/top250" html = await fetch(url) soup = BeautifulSoup(html, "html.parser") books = [] for book in soup.select(".indent > table"): title = book.select_one(".pl2 > a")["title"] link = book.select_one(".pl2 > a")["href"] rating = book.select_one(".rating_num").text.strip() author = book.select_one(".pl").text.strip().split("/")[0] books.append({"title": title, "link": link, "rating": rating, "author": author}) return books if __name__ == "__main__": books = asyncio.run(scrape()) for book in books: print(book)
到此這篇關于HTTPX入門使用教程的文章就介紹到這了,更多相關HTTPX使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python 利用openpyxl讀取Excel表格中指定的行或列教程
這篇文章主要介紹了python 利用openpyxl讀取Excel表格中指定的行或列教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02pytorch 調整某一維度數(shù)據(jù)順序的方法
今天小編就為大家分享一篇pytorch 調整某一維度數(shù)據(jù)順序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12