Python requests(Python Requests)
這篇 Python requests 教學是接下來爬蟲與 AI API 串接的共同基礎:requests 是 Python 最受歡迎的 HTTP 套件,幾行就能對網站或 API 發出請求、拿回資料。安裝:uv add requests。
GET:跟伺服器要資料
import requests
r = requests.get("https://blog.che-ya.com/", timeout=10)
print(r.status_code) # HTTP 狀態碼
print(r.headers["Content-Type"])
print(len(r.text), "字元") # 回應內容(HTML 原始碼)
執行輸出(數值依當下而異):
200
text/html; charset=UTF-8
85432 字元
常見狀態碼速查:
| 狀態碼 | 意義 |
|---|---|
| 200 | 成功 |
| 301 / 302 | 轉址(requests 預設自動跟隨) |
| 403 | 拒絕存取(常見於擋爬蟲) |
| 404 | 找不到頁面 |
| 429 | 請求太頻繁 |
| 500 | 伺服器錯誤 |
querystring 參數:params
網址上的 ?key=value 參數不要自己拼字串,交給 params(自動處理編碼,中文也安全):
import requests
r = requests.get(
"https://blog.che-ya.com/",
params={"s": "python"}, # 等同 ...?s=python(WordPress 站內搜尋)
timeout=10,
)
print(r.url)
print(r.status_code)
執行輸出:
https://blog.che-ya.com/?s=python
200
解析 JSON API:response.json()
對 API 發請求,回應通常是 JSON,r.json() 直接轉成 dict(第 33 篇的知識在此接上):
import requests
# WordPress 內建的公開 REST API,列出本站最新文章
r = requests.get(
"https://blog.che-ya.com/wp-json/wp/v2/posts",
params={"per_page": 3},
timeout=10,
)
for post in r.json():
print(post["title"]["rendered"])
執行輸出(依當下文章而異):
SQL Stored Procedure
企業部署與團隊管理
排程任務與自動化工作流
POST:送資料給伺服器
import requests
payload = {"name": "小明", "score": 85}
r = requests.post(
"https://httpbin.org/post", # 測試用的回聲服務
json=payload, # json= 自動序列化並設 Content-Type
timeout=10,
)
print(r.status_code)
print(r.json()["json"]) # 伺服器收到的內容
執行輸出:
200
{'name': '小明', 'score': 85}
json= 用於 JSON API(最常見);傳統表單則用 data=。
標準防呆寫法
實務上每個請求都該有 timeout 與錯誤處理,這是可以直接背的樣板:
import requests
try:
r = requests.get("https://blog.che-ya.com/", timeout=10)
r.raise_for_status() # 4xx/5xx 時拋出例外
print("成功,長度", len(r.text))
except requests.exceptions.Timeout:
print("逾時:伺服器太久沒回應")
except requests.exceptions.HTTPError as e:
print("HTTP 錯誤:", e)
except requests.exceptions.RequestException as e:
print("請求失敗:", e)
執行輸出:
成功,長度 85432
常見錯誤
1. 沒設 timeout
requests 預設沒有逾時,對方不回應你的程式就永遠卡住。每個請求都加 timeout=10(秒)。
2. 假設一定回 200
網路上什麼都可能發生。用 raise_for_status() 搭配 try except,或至少檢查 r.status_code。
3. requests.exceptions.JSONDecodeError
對「不是 JSON 的回應」呼叫 .json()——可能拿到的是錯誤頁 HTML。先確認 status_code 與 Content-Type 再解析。
總結
get 要資料、post 送資料;參數用 params=、JSON 用 json=;回應看 status_code、解析用 .json();timeout 與 raise_for_status() 是標配。下一篇把 requests 加上 HTML 解析,完成你的第一支爬蟲。
延伸閱讀
- Python 教學(系列目錄)
- Python JSON 與 CSV
- Python 例外處理 (try except)
- Python 虛擬環境與 uv 套件管理
- 【實作】Python 爬蟲:BeautifulSoup 抓網頁資料(下一篇)