python中urllib.request的核心用途是發送網絡請求并獲取響應,其作為標準庫適用于輕量級或受限環境。1. 它可通過urlopen()發起get請求,并支持設置超時;2. 使用request對象可自定義請求頭、發送post數據;3. 可結合http.Cookiejar處理cookie以保持登錄狀態;4. 支持默認重定向處理,也可通過httpredirecthandler禁用;5. 必須捕獲urlerror、httperror及socket.timeout等異常以確保穩定性。
在python中,urllib.request 是 urllib 模塊中最核心的組件之一,用于發送網絡請求并獲取響應。雖然它不像第三方庫如 requests 那樣簡潔易用,但它是標準庫的一部分,不需要額外安裝,在一些輕量級或受限環境中非常實用。
如果你只是想快速發起一個GET請求,或者需要對HTTP細節有更精細的控制,urllib.request 就派上用場了。下面我們就來詳細看看它的幾個關鍵功能和使用方法。
發起基本的GET請求
最簡單的使用方式是通過 urllib.request.urlopen() 方法來發起一個GET請求,獲取網頁內容:
import urllib.request response = urllib.request.urlopen('https://example.com') html = response.read()
這個過程相當于瀏覽器訪問了一個網址,并獲取到了返回的內容(通常是HTML)。你可以通過 .read() 獲取字節流,也可以用 .decode(‘utf-8’) 轉成字符串處理。
立即學習“Python免費學習筆記(深入)”;
需要注意:
- 返回的是 http.client.HTTPResponse 對象
- 默認超時時間較長,建議加上超時設置:
response = urllib.request.urlopen('https://example.com', timeout=10)
自定義請求頭與POST請求
有時候我們需要模擬瀏覽器行為,比如添加User-Agent、Referer等頭部信息,或者發送POST數據。這時就需要構造一個 Request 對象:
import urllib.request import urllib.parse data = urllib.parse.urlencode({'username': 'test', 'password': '123456'}).encode('utf-8') headers = { 'User-Agent': 'Mozilla/5.0', 'Content-Type': 'application/x-www-form-urlencoded' } req = urllib.request.Request('https://example.com/login', data=data, headers=headers, method='POST') response = urllib.request.urlopen(req)
幾點說明:
- data 必須是 bytes 類型,所以要用 encode()
- headers 可以是 dict 或者用 .add_header() 添加
- method 參數可選,默認根據是否有 data 決定是否為 POST
處理Cookie和重定向
默認情況下,urllib.request 會自動處理重定向(最多20次),但不會持久化保存 Cookie。如果需要保存 Cookie,可以結合 http.cookiejar 模塊:
import urllib.request import http.cookiejar cj = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) urllib.request.install_opener(opener) response = opener.open('https://example.com')
這樣你就可以在后續請求中復用登錄狀態了。
關于重定向:
- 如果你想禁用自動重定向,可以通過自定義 HTTPredirectHandler 來實現
- 默認允許最多20次重定向,超過會拋出異常
異常處理不可忽視
網絡請求難免遇到各種問題,比如連接失敗、超時、服務器錯誤等,所以必須做好異常捕獲:
from urllib.error import URLError, HTTPError import socket try: response = urllib.request.urlopen('https://example.com', timeout=5) except HTTPError as e: print(f'HTTP 錯誤: {e.code}') except URLError as e: print(f'URL 錯誤: {e.reason}') except socket.timeout: print('請求超時')
常見異常類型:
基本上就這些。urllib.request 功能雖不如 requests 強大,但在標準庫中已經足夠應對大多數基礎場景。只要注意好請求頭、數據格式、異常處理這幾個關鍵點,就能寫出穩定可用的網絡請求代碼。