1. 前言
Python 的標準函式庫 urllib
是一個功能強大的工具,可用於透過 HTTP 通訊與外部資料進行互動。例如,可以用來取得網頁資料,或向 API 發送請求以獲取資料。透過這個函式庫,可以拓展 Web 應用程式開發的範疇,實現更高效的資料操作。
urllib
的必要性與與其他函式庫的比較
urllib
是 Python 預設內建的函式庫,因此無需額外安裝,對初學者來說非常方便上手。雖然 requests
函式庫也很受歡迎並提供類似功能,但它屬於外部函式庫,需要另外安裝。由於 urllib
是標準函式庫,非常適合用來學習 Python 中 HTTP 通訊的基本概念,推薦作為了解 Web 請求機制的第一步。
本文內容概覽
本篇文章將會介紹如何使用 urllib
發送基本的 GET/POST 請求、解析 URL、進行網頁爬蟲以及與 API 串接等實作技巧。我們會以循序漸進的方式說明每個步驟,讓初學者也能輕鬆理解。如果你想用 Python 操作網路資料,歡迎參考本文。

2. urllib 的基本使用方法
urllib
提供多種功能,包含基本的 Web 請求發送、回應處理以及 URL 解析等。在本節中,我們將介紹如何使用 urllib.request
模組發送 GET 和 POST 請求的基本方法。
如何發送 GET 請求
GET 請求主要用來從網頁中取得資訊。以下範例程式碼示範如何使用 urllib.request.urlopen
函數從指定 URL 取得 HTML 資料。
import urllib.request
url = 'https://example.com'
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)
上述程式會從指定的 URL 取得 HTML 內容並以純文字格式輸出。GET 請求不需附帶資料,適合用於單純讀取資訊的情境。
如何發送 POST 請求
POST 請求則是在需要向伺服器傳送資料時使用,例如提交 API 資料或表單內容,適用於需要對伺服器進行變更操作的情況。
import urllib.request
import urllib.parse
url = 'https://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url, data=data)
response = urllib.request.urlopen(request)
result = response.read().decode('utf-8')
print(result)
這個範例中,我們將字典格式的資料進行 URL 編碼,轉換為位元組格式後傳送 POST 請求,並讀取伺服器回傳的內容來顯示結果。
錯誤處理(Error Handling)
在進行 Web 請求時,可能會遇到伺服器無回應或回傳錯誤的情況。urllib
提供了 HTTPError
和 URLError
等例外類別來進行錯誤處理。
import urllib.request
import urllib.error
url = 'https://example.com/api'
try:
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)
except urllib.error.HTTPError as e:
print('發生 HTTP 錯誤:', e.code)
except urllib.error.URLError as e:
print('發生 URL 錯誤:', e.reason)
這段程式碼可以針對 HTTP 狀態碼錯誤或連線錯誤進行例外處理,讓程式在出錯時能顯示適當的錯誤訊息。
3. URL 的解析與操作
透過 urllib.parse
模組,可以輕鬆地解析 URL 與操作查詢參數。本節將說明如何解析 URL、提取各個元素,以及進行 URL 編碼與解碼的相關技巧。
URL 的解析方法
使用 urlparse()
函數可以將 URL 分解為各個組成部分(例如協議、主機、路徑等)。
from urllib.parse import urlparse
url = 'https://example.com/path/to/page?name=python&lang=ja'
parsed_url = urlparse(url)
print('協議:', parsed_url.scheme)
print('主機:', parsed_url.netloc)
print('路徑:', parsed_url.path)
print('查詢參數:', parsed_url.query)
這段程式會解析 URL 並顯示其各個部分,方便後續操作或條件判斷。
4. 實用應用範例
本節將透過實際範例來說明如何使用 urllib
進行網頁爬蟲與 API 串接。這些應用能幫助你更靈活地運用 urllib
於各種實務開發中。
網頁爬蟲的基礎
網頁爬蟲是一種自動從網站擷取資訊並收集資料的技術。本範例將介紹如何使用 urllib
取得網頁內容,並結合 BeautifulSoup
來解析 HTML。
import urllib.request
from bs4 import BeautifulSoup
# 指定 URL 並發送 GET 請求
url = 'https://example.com'
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(html, 'html.parser')
# 擷取特定元素
title = soup.title.string
print('頁面標題:', title)
# 擷取其他元素(例如:所有的連結)
for link in soup.find_all('a'):
print(link.get('href'))
此範例中,我們先透過 urllib
取得指定 URL 的 HTML,再利用 BeautifulSoup
進行分析。你可以提取頁面標題、連結等資訊,達成高效的資料收集。
注意: 在進行網頁爬蟲時,請務必確認網站的使用條款,並依照允許的方式操作。
與 API 的整合方法
API(應用程式介面)是一種讓應用程式之間可以互相交換資料的機制。許多網站提供 RESTful API,我們可以使用 urllib
來存取 API 並獲取資料。
以下示範如何用 urllib
發送 API 請求並解析回傳的 JSON 格式資料。
import urllib.request
import json
# 指定 API 的 URL
url = 'https://api.example.com/data'
# 發送 API 請求
response = urllib.request.urlopen(url)
# 以 JSON 格式讀取回應資料
data = json.loads(response.read().decode('utf-8'))
print('取得的資料:', data)
這個例子展示了如何從 API 獲取 JSON 格式的資料。JSON 使用鍵值對結構,讀取後可直接當作字典使用,讓資料操作更方便。

5. 注意事項與最佳實踐
在使用 urllib
執行 Web 請求或 API 存取時,有幾個重要的注意事項與最佳實踐建議。為了建立穩定可靠的應用程式,建議參考以下說明並加以實作。
設定請求逾時(timeout)
當伺服器回應延遲時,程式可能會長時間等待而無法繼續執行。為了避免這種情況,通常會為請求設定逾時時間(timeout)。這樣一來,若在指定時間內未收到回應,就會產生錯誤,並讓程式繼續執行下一步。
import urllib.request
from urllib.error import URLError, HTTPError
url = 'https://example.com'
try:
# 設定逾時時間為 10 秒
response = urllib.request.urlopen(url, timeout=10)
html = response.read().decode('utf-8')
print(html)
except HTTPError as e:
print('發生 HTTP 錯誤:', e.code)
except URLError as e:
print('發生 URL 錯誤:', e.reason)
except Exception as e:
print('發生未預期的錯誤:', e)
以上程式碼中,若 10 秒內未獲得回應,請求就會自動終止。設定逾時有助於提升應用程式的穩定性與使用體驗。
實作重試機制(Retry)
網路通訊並非總是穩定,因此當請求失敗時,實作「重試機制」是很好的做法。這對於處理短暫性的網路問題或伺服器過載等情況特別有幫助。
import urllib.request
from urllib.error import URLError
import time
url = 'https://example.com'
max_retries = 3 # 最多重試次數
retry_delay = 5 # 每次重試間隔(秒)
for attempt in range(max_retries):
try:
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)
break # 成功取得回應後跳出迴圈
except URLError as e:
print(f'請求失敗(第 {attempt + 1} 次,共 {max_retries} 次): {e.reason}')
if attempt < max_retries - 1:
time.sleep(retry_delay) # 重試前等待
else:
print('已達到最大重試次數')
這段程式最多會重試三次,每次失敗後間隔 5 秒。透過實作重試機制,可以更有效地應對瞬間中斷或不穩定的網路狀況。
6. 總結
urllib
是 Python 標準函式庫的一部分,可用來發送 HTTP 請求與處理 URL,是非常實用的工具。本文介紹了 GET/POST 請求、URL 解析、網頁爬蟲與 API 串接等各種應用方式。
由於 urllib
無需額外安裝,任何人都可以立即開始使用,因此特別推薦給想要進行 Web 應用程式開發的使用者。
如果你親自嘗試操作這些範例,將能更深入理解 urllib
的強大功能與應用方式。