Python里urllib.request 網絡請求模塊urllib的核心功能詳解

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('請求超時')

常見異常類型:

  • URLError:通用錯誤,比如無法解析域名
  • HTTPError:繼承自 URLError,包含狀態碼和原因
  • socket.timeout:超時異常需要單獨捕獲

基本上就這些。urllib.request 功能雖不如 requests 強大,但在標準庫中已經足夠應對大多數基礎場景。只要注意好請求頭、數據格式、異常處理這幾個關鍵點,就能寫出穩定可用的網絡請求代碼。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享