Python requests 網路請求

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 解析,完成你的第一支爬蟲。

延伸閱讀