你曾想過自動抓取天氣預報、即時匯率、新聞標題嗎? 這一集,我們來學 Python 怎麼開口問網路:「嘿,給我點資料好嗎?」
1️⃣ 什麼是請求?(GET 是什麼)
每次你打開一個網站,背後其實是「發出一個請求,等網路回你東西」。 而 GET 就是最常見的一種「請求方式」,意思是:「給我資料!」
我們可以用 Python 幫你說這句話——靠的就是 requests 套件。
🔹GET 請求通常用於獲取資料,不應該用於提交敏感資訊或執行會修改伺服器狀態的操作(例如刪除資料)。這是因為 GET 請求的參數會直接顯示在 URL 中。
2️⃣ requests 套件入門(你的網路小嘴巴)
首先請先安裝它(只需一次):
pip install requests🔹 最基本的用法:
import requests
# 指定要請求的網址
url = "https://httpbin.org/get" # 測試 API,用來查看發送的請求資訊和接收到的回應
# 發送 GET 請求,取得網站回應
response = requests.get(url)
# 印出回應的 HTTP 狀態碼(200 表示成功)
print(response.status_code)
# 印出回應的文字內容(通常是 JSON 或 HTML)
print(response.text)
🔽 執行結果(簡化範例):
200
{
"args": {},
"headers": {...},
"origin": "xx.xx.xx.xx",
"url": "https://httpbin.org/get"
}
3️⃣ 資料格式介紹:文字、HTML、JSON 差在哪?
網站會把資料「包裝成不同格式」回傳給你,我們要先認得它是什麼樣子。
🔸 常見格式對比:
# JSON 範例(結構化資料)
{
"name": "Joe",
"score": 88
}
# HTML 範例(網頁結構)
<html>
<head><title>My Page</title></head>
<body><p>Hello!</p></body>
</html>
網站回應內容可能會是:
- 純文字(text):像文字檔
- HTML:網頁內容(
<h1>、<p>、<div>)組成 - JSON:結構化資料(長得像 dict)✅ JSON 數據很適合程式處理
.text屬性會回傳 HTTP 回應的原始文字內容,不論它是 JSON、HTML 還是純文字。response.json()則會嘗試將內容解析為 JSON,如果內容不是有效的 JSON,則會拋出錯誤。
🔹 抓 JSON 回應內容:
data = response.json()
print(data["url"])
🔹 抓純文字內容(text):
text = response.text
print(text)
🔹 抓 HTML 並解析特定標籤(用 BeautifulSoup):
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
print(soup.title.text)
4️⃣ 抓 API 資料:像聊天一樣問出你要的資料
🧠 什麼是 API?
API 是英文 Application Programming Interface(應用程式介面)的縮寫。
簡單來說,它就像「網站提供給程式用的點菜窗口」:
你(程式)不需要進到資料庫內部,只要發送一個 API 請求,網站就會把你要的資料送回來。
📦 例如:氣象 API、匯率 API、笑話 API……都可以讓你「用程式問網站要資料」。
🔎 API 端點(Endpoint)通常出現在哪裡?
API 端點是網站提供給程式請求資料的專用網址。這些網址不一定會顯示在頁面上,但你可以用以下方式找到它們:
✅ 方法一:透過開發者工具觀察網頁請求
這是最常見、也是最可靠的方法。
- 開啟瀏覽器的「開發者工具」
- Windows:按 F12 或 Ctrl + Shift + I
- Mac:按 Cmd + Option + I
- 點選「Network(網路)」分頁
- 在網頁中執行某個動作(例如:按下查詢按鈕或滾動載入資料)
- 觀察左側出現的請求紀錄
- 找找有沒有 XHR 或 fetch 類型的項目(代表 JavaScript 發出的 API 請求)
- 點進去看網址(Request URL),這通常就是 API 端點
👉 範例端點看起來會像這樣:
https://api.example.com/v1/data?page=1&limit=10
✅ 方法二:查網站文件或開發者平台
大型網站或服務(如 LINE、Google、Weather API)通常有公開的 API 文件,會列出所有端點。例如:
✅ 方法三:查看 JavaScript 原始碼
有時候,網站的 JavaScript 會包含 API 網址或代碼邏輯。你可以在開發者工具的「Sources」或「Elements」分頁中搜尋關鍵字:
- 搜尋
fetch(或axios.get(、$.get(等常見 AJAX 方法
補充❓什麼是 AJAX?
「Asynchronous JavaScript and XML」的縮寫,意思是:
用 JavaScript 寫的程式,可以在 不重新載入整個頁面 的情況下,向伺服器要資料,並把結果更新到畫面上。
這跟我們爬 API 有什麼關係?
很多網站「不會在一開始就把資料寫死在 HTML 裡」,而是靠 JavaScript 在背景用 AJAX 發送請求,例如:
fetch("https://example.com/api/articles?page=2")
這個請求就會送到某個 API 端點,而你在「開發者工具」裡的 Network → XHR 或 Fetch 項目中,常常就能找到這樣的請求。
🔍這些請求的網址,就是你可以用 requests.get() 發送的 API 端點!
✅ 方法四:直接使用網站提供的 SDK 或工具
有些網站會提供開發工具、介接套件(例如 LINE Messaging API 提供 Python SDK),可以用這些工具間接得知 API 的端點與格式。
<注意>
- 這個段落介紹的是如何從「API 端點」請求回傳JSON格式的資料
- 若你想抓的是網頁內容(不是 JSON):→ 用
BeautifulSoup做「網頁爬蟲」來抓特定資料,請跳到下面5️⃣
🔹 在 Python 裡如何呼叫 API:
以下範例為使用 requests 函式庫來對一個 API 端點(Endpoint)發送 GET 請求。這個 API 端點 https://catfact.ninja/fact 回傳的是 JSON(JavaScript Object Notation,一種輕量級的資料交換格式)格式的資料
# 匯入 requests 套件,用來發送網路請求
import requests
# 向貓咪事實 API 發送 GET 請求
r = requests.get("https://catfact.ninja/fact")
# 將回應的 JSON 轉換為 Python 字典
data = r.json()
# 印出其中的 'fact' 資料(即一個貓咪冷知識)
print(data["fact"])
🔽 輸出:
Cats can rotate their ears 180 degrees.
🔹使用 params 參數向 API 發送帶有查詢字串的請求
🔸 使用參數抓多筆資料(params)
🔹 加入參數範例(帶入 limit 數量):
使用 params 參數向 API 發送帶有查詢字串的請求:例如 limit、page、type 等,視 API 文件支援而定)
url = "https://catfact.ninja/facts"
params = {"limit": 3, "page": 1, "type": "cat"}
r = requests.get(url, params=params)
print(r.json())
🔽 輸出範例:
{
"current_page": 1,
"data": [
{"fact": "Cats sleep 70% of their lives.", "length": 38},
{"fact": "A group of cats is called a clowder.", "length": 42},
{"fact": "The technical term for a cat's hairball is a bezoar.", "length": 54}
]
// 其他欄位略
}
🔽 說明:你可以控制要幾筆資料(limit)、第幾頁(page)、資料類型(type)等。不同 API 支援的參數不同,請參考官方文件來設計查詢。這樣能幫助你更彈性地篩選或分頁取得資料,非常實用!
🔸 笑話 API 實作練習
很多網站提供「API」讓程式存取資料。常見範例:氣象、匯率、笑話、新聞。
🔹 以即時笑話 API 為例:
# 匯入 requests 套件,準備發送請求
import requests
# 指定笑話 API 的網址
url = "https://official-joke-api.appspot.com/random_joke"
# 發送 GET 請求取得笑話資料
r = requests.get(url)
# 將回傳的 JSON 轉換為 Python 字典
data = r.json()
# 印出笑話的前段(setup)
print("😂", data["setup"])
# 印出笑話的後段(punchline)
print("👉", data["punchline"])
🔽 輸出:
😂 What did the zero say to the eight?
👉 Nice belt!
5️⃣ 抓 HTML 網頁內容(基礎爬蟲)
若對方沒有提供 API,我們也可以「從網頁中提取資料」——這就叫做爬蟲!
我們會搭配 BeautifulSoup 套件:
🔧 BeautifulSoup 是什麼?
它是 Python 最常用的 HTML 解析工具,可以讓你很輕鬆地:
- 找出
<title>、<p>、<a>等標籤內容 - 篩選出你要的資料位置,不用自己寫複雜字串處理
🔽 安裝方式:
pip install beautifulsoup4這個套件全名是 beautifulsoup4,安裝一次即可終生使用 ✨
🔹 抓網頁標題:
你可以透過 BeautifulSoup 抓出網頁中的 <title> 標籤,通常就是瀏覽器頁籤顯示的名稱。
# 匯入必要套件
import requests
from bs4 import BeautifulSoup
# 指定目標網站網址
url = "https://vocus.cc/salon/682a4bb9fd897800011f8d24"
# 發送 GET 請求取得網頁原始碼
r = requests.get(url)
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(r.text, "html.parser")
# 抓出並印出 <title> 標籤的文字內容(網頁標題)
print(soup.title.text)
🔽 輸出:
Dolly的奇妙育兒之旅|方格子 vocus你也可以進一步「找出所有超連結」,這在整理網站資訊時非常實用:
🔹 抓出所有連結與文字:
# 匯入必要套件
import requests
from bs4 import BeautifulSoup
# 指定目標網站網址
url = "https://vocus.cc/salon/682a4bb9fd897800011f8d24"
# 發送 GET 請求取得網頁原始碼
r = requests.get(url)
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(r.text, "html.parser")
# 找出所有 <a> 標籤(超連結)
links = soup.find_all("a")
# 逐一印出連結的文字與網址
for link in links:
text = link.text.strip()
href = link.get("href")
if href: # 確保 href 存在
print(f"文字:{text} → 連結:{href}")
🔽 輸出範例:
文字:Python 新手學習筆記 第2集:資料結構入門 → 連結:/article/6861306cfd89780001b4b31b
文字:🧾 Python 新手學習筆記 第 4 集:字典進階應用{dict} → 連結:/article/686e2386fd897800013f0aad
文字:Python 自學筆記第 6 集:Lambda 函式與 sorted()排序應用 → 連結:/article/686f3628fd897800017ee661
...以下略
6️⃣ 進階技巧補充:headers 與 pandas 應用
🔸 有些網站需要「假裝是瀏覽器」才能讀資料
有些網站不給預設 requests 存取,這時我們可以加上一些 headers 模擬瀏覽器:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
url = "https://example.com"
r = requests.get(url, headers=headers)
print(r.text)
🔽 說明:這樣可以避免網站擋住你的程式。常見 header 是 User-Agent,有些網站可能還會檢查 Referer、Accept-Language
🔸 使用 Session 提高效率
當需要多次請求時,使用 Session 可以重複使用連線,提高效率:
import requests
# 建立 Session 物件
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
# 多次請求會重複使用相同的 headers 和 cookies
r1 = session.get("https://example.com/page1")
r2 = session.get("https://example.com/page2")
🔸 把爬到的資料變成表格(用 pandas)
如果你爬到的是一堆 JSON、或有固定格式的文字,可以用 pandas 快速整理:
import pandas as pd
import requests
url = "https://catfact.ninja/facts?limit=5"
r = requests.get(url)
data = r.json()
# 把 'data' 欄轉成 pandas DataFrame
facts = pd.DataFrame(data["data"])
print(facts)
🔽 輸出會是一個表格:
fact length
0 Cats can rotate their ears 180... 57
1 A group of cats is called a cl... 42
...
這樣你就可以開始過濾、分析、輸出成 CSV 或圖表囉!📊
🔍 如果想儲存為 CSV,只需:
facts.to_csv("cat_facts.csv", index=False)
下一集我們會深入處理 pandas 讀寫表格與整理資料的技巧!
7️⃣ 錯誤處理與防呆建議
🔸 基本狀態碼檢查
import requests
r = requests.get("https://some.site")
if r.status_code == 200:
print("成功取得資料!")
elif r.status_code == 404:
print("網頁不存在")
elif r.status_code == 403:
print("禁止存取")
else:
print(f"出錯了:{r.status_code}")
🔸 完整的錯誤處理
在發送 requests 或處理回應資料時,有可能遇到「網址錯誤」「伺服器失聯」「資料不是 JSON」等問題,這時候使用 try...except 可以讓你的程式不中斷,優雅地處理錯誤。
import requests
from requests.exceptions import RequestException, Timeout, ConnectionError
try:
r = requests.get(url, timeout=10) # 加入 10 秒超時設定
r.raise_for_status() # 自動檢查 HTTP 錯誤狀態碼
data = r.json()
print("成功取得資料:", data)
except ConnectionError:
print("網路連線失敗,請檢查網路狀態")
except Timeout:
print("請求超時,伺服器回應過慢")
except ValueError: # JSON 解析錯誤
print("回應不是有效的 JSON 格式")
except RequestException as e:
print(f"請求失敗:{e}")
🛡️ 爬蟲倫理與注意事項
在進行網路爬蟲時,請務必遵守以下原則:
🔸 基本守則
- 尊重 robots.txt:檢查網站的 robots.txt 文件(通常在
網址/robots.txt) - 控制請求頻率:避免對伺服器造成負擔
- 遵守使用條款:閱讀並遵守網站的服務條款
- 著作權意識:注意資料的使用權限和版權問題
🔸 控制爬蟲速度
import time
import requests
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]
for url in urls:
r = requests.get(url)
print(f"已爬取:{url}")
time.sleep(1) # 每次請求間暫停 1 秒,避免對伺服器造成過大負擔
🔸 檢查 robots.txt 範例
python
import requests
# 檢查網站的 robots.txt
robots_url = "https://example.com/robots.txt"
r = requests.get(robots_url)
print(r.text)
✅ 實戰練習題
👉 練習 1:基礎 API 爬取
試著用 requests.get() 抓下這個網址:https://catfact.ninja/fact並印出裡面的 fact 文字
👉 練習 2:網頁爬取
抓取 https://www.python.org 網頁,列出首頁所有連結(提示:抓取 <a> 標籤)
👉 練習 3:過濾特定連結
過濾出只包含 "python.org" 的內部連結
for link in soup.find_all("a"):
href = link.get("href")
if href and "python.org" in href:
print(href)
🔽 輸出會列出像是:
https://www.python.org/about/
https://www.python.org/jobs/
...
👉 練習 4:處理 API 參數
嘗試修改 https://catfact.ninja/facts 的 limit 參數,取得不同數量的貓咪事實
👉 練習 5:資料儲存
將爬取的資料儲存為 CSV 檔案,方便後續分析
import pandas as pd
import requests
# 爬取資料
url = "https://catfact.ninja/facts?limit=10"
r = requests.get(url)
data = r.json()
# 轉換為 DataFrame 並儲存
df = pd.DataFrame(data["data"])
df.to_csv("cat_facts.csv", index=False, encoding="utf-8")
print("資料已儲存至 cat_facts.csv")























