Python 網路爬蟲基礎:Requests 與 API 串接 (第 24 章)

站主自己的課程,請大家支持
揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站? 揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站?
  • Post by
  • Jan 07, 2024
post-thumb

Python 之所以被稱為「膠水語言」,很大一部分原因是它能輕易地透過網路與其他系統溝通。無論是抓取網頁資料 (爬蟲),還是呼叫 Google 已經訓練好的 AI 模型 (API),都離不開 HTTP 請求

雖然 Python 內建有 urllib 模組,但它非常難用。今天我們要學的是 Python 社群的標準配備——requests 庫。

“Requests: HTTP for Humans” —— 它的官方口號說明了一切。

1. 準備工作

安裝 requestspip install requests

2. GET 請求:獲取資料

最常見的操作是從伺服器取得資料。

import requests

# 這裡使用 GitHub 的公開 API 作為範例
url = "https://api.github.com/events"
response = requests.get(url)

# 檢查狀態碼 (200 代表成功)
print(f"Status Code: {response.status_code}")

if response.status_code == 200:
    # 讀取文字內容
    # print(response.text)
    
    # 直接解析 JSON (Python 會轉成 List 或 Dict)
    data = response.json()
    print(f"取得了 {len(data)} 筆事件資料")
    print(f"第一筆事件類型: {data[0]['type']}")
else:
    print("請求失敗")

3. 處理 Query Parameters

如果 URL 帶有參數 (例如 search?q=python&page=1),不需要手動拼字串,requests 會幫你處理編碼問題。

search_url = "https://httpbin.org/get"
params = {
    "q": "python tutorial",
    "page": 2,
    "lang": "zh-tw"
}

resp = requests.get(search_url, params=params)

# 自動拼好的 URL
print(resp.url) 
# https://httpbin.org/get?q=python+tutorial&page=2&lang=zh-tw

4. POST 請求:傳送資料

當我們要提交表單或上傳資料時,會使用 POST 方法。

post_url = "https://httpbin.org/post"
payload = {
    "username": "weichih",
    "message": "Hello Server!"
}

# 1. 傳送 Form Data (像網頁表單)
# resp = requests.post(post_url, data=payload)

# 2. 傳送 JSON Data (現代 API 常用)
resp = requests.post(post_url, json=payload)

print(resp.json()['json']) # 伺服器回傳我們剛剛送過去的資料

5. Headers:偽裝與授權

很多網站會檢查 User-Agent 來檔爬蟲,或者 API 需要 Authorization Token。這時我們需要自訂 Headers。

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...",
    "Authorization": "Bearer YOUR_API_TOKEN"
}

resp = requests.get("https://api.github.com/user", headers=headers)

6. 錯誤處理

網路請求充滿變數 (斷網、伺服器掛掉),記得要處理異常。

try:
    r = requests.get("https://non-existent-website.com", timeout=3)
    r.raise_for_status() # 如果狀態碼不是 200,主動拋出異常
except requests.exceptions.Timeout:
    print("連線逾時!")
except requests.exceptions.ConnectionError:
    print("無法連上伺服器 (DNS 錯誤或斷網)")
except requests.exceptions.HTTPError as err:
    print(f"HTTP 錯誤: {err}")

7. 總結

掌握 requests 讓你擁有獲取全世界資料的能力。

  • GET: 拿資料 (requests.get)
  • POST: 傳資料 (requests.post)
  • JSON: 現代 API 的通用語言 (resp.json())
  • Headers: 身分證與通關密語

下一章,我們將進入 Batch 5 的最後一塊拼圖——Python 模組打包與虛擬環境管理,學會如何用 Poetry 打造專業的專案結構!


延伸閱讀

LATEST POST
TAG