從 Python 開始:用公開 API 抓取股市資料的實戰指南

如果你是一名開發者,或正打算寫支小程式幫自己「省點力」——例如每天自動抓股票報價、做技術分析,甚至做一個簡單的價格提醒機器人,那麼 Python 會是你最好的起點。Python 語法簡潔、生態系成熟,用十幾行程式碼就能完成從「抓資料」到「存檔」的完整流程。今天我們就從零開始,實戰用公開 API 抓取股市行情。

一、為什麼用 Python 抓股市資料?

你可能想過:打開券商 App 或網站下載 Excel 不就好了?手動下載的確可行,但有三個致命缺點:

  • 無法自動化:每天開盤都要自己動手,漏一次就斷一天
  • 難以分析:Excel 對「一檔股票 + 多個時間點」的批次處理很痛苦
  • 不易擴展:想看 50 檔股票、每 5 分鐘刷新一次?手動根本做不到

而 Python 的生態系剛好補齊這些缺口:requests 負責請求、json 負責解析、csv 負責存檔、pandas 負責分析,每一塊都是現成的積木。

二、環境準備:安裝 Python 與 requests

步驟 1:確認 Python 版本。建議 3.10 以上,終端機輸入 python -V 檢查。

步驟 2:安裝 requests 套件,這是最流行的 HTTP 請求函式庫:

pip install requests

步驟 3:驗證安裝成功:

python -c "import requests; print(requests.__version__)"

看到版本號就代表環境就緒。若你用的是 Anaconda 或 VS Code,觀念完全相同,只是啟動環境的方式略有不同。

三、實戰第一步:抓取單檔股票報價

我們使用公開的行情接口(無需申請金鑰、無需付費),以「貴州茅台(滬 600519)」為例。騰訊行情接口的網址格式如下:

import requests

url = "https://qt.gtimg.cn/q=sh600519"
resp = requests.get(url, timeout=5)
resp.encoding = "gbk"  # 該接口回傳的是 GBK 編碼
print(resp.text)

特別注意:這個接口回傳的不是 JSON,而是一串用 ~ 分隔的欄位資料,而且編碼是 GBK(不是 UTF-8)。這就是實戰與教科書的差別——真實世界的接口總有「意外」,需要你學會應對。

回傳內容大致長這樣:

v_sh600519="1~貴州茅台~600519~1800.00~1795.50~1796.00~..."

欄位以 ~ 分隔:第 1 個是股票名稱、第 3 個是最新價格、第 4 個是昨收。我們可以這樣解析:

parts = resp.text.split("~")
print(parts[1])   # 貴州茅台
print(parts[3])   # 1800.00

四、封裝成函數:一次抓多檔股票

寫程式最重要的習慣就是「別寫死、要封裝」。我們把抓取邏輯包成函數,傳入股票代碼就回傳結構化字典:

import requests

def get_quote(symbol: str) -> dict:
    url = f"https://qt.gtimg.cn/q={symbol}"
    resp = requests.get(url, timeout=5)
    resp.encoding = "gbk"
    parts = resp.text.split("~")
    return {
        "code": symbol,
        "name": parts[1],
        "price": float(parts[3]),
        "prev_close": float(parts[4]),
    }

if __name__ == "__main__":
    for s in ["sh600519", "sz000858", "hk00700"]:
        print(get_quote(s))

重點:接口還支援「一次查詢多檔」,用逗號分隔即可:https://qt.gtimg.cn/q=sh600519,sz000858,hk00700,回傳結果每檔一行,用 \n 切割就能批次處理。代碼中的 hk00700 代表香港交易所的騰訊控股,同一套程式即可涵蓋 A 股與港股。

五、進階:匯出 CSV 並定時更新

資料抓下來之後,最實用的存檔格式就是 CSV(可用 Excel 直接開啟)。加上 csv 模組與一個無窮迴圈,就變成「迷你行情記錄器」:

import csv
import time
import requests

def get_quote(symbol: str) -> dict:
    url = f"https://qt.gtimg.cn/q={symbol}"
    resp = requests.get(url, timeout=5)
    resp.encoding = "gbk"
    parts = resp.text.split("~")
    return {"code": symbol, "name": parts[1], "price": float(parts[3])}

with open("quotes.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerow(["time", "code", "name", "price"])
    while True:
        q = get_quote("sh600519")
        writer.writerow([time.strftime("%Y-%m-%d %H:%M:%S"),
                         q["code"], q["name"], q["price"]])
        f.flush()   # 立即寫入磁碟
        time.sleep(60)  # 每 60 秒抓一次

特別注意:實務上有兩件事必須遵守。第一,頻率不要太高,對免費接口保持禮貌,抓太頻繁可能被擋;第二,一定要設定 timeout,否則接口掛掉時你的程式會卡住不動。

六、總結

  • Python + requests 是抓取股市資料最簡單的入門組合,十幾行程式即可完成抓取與存檔
  • 真實接口常有「非標準格式」(如 GBK 編碼、~ 分隔),學會應對意外是工程師的必修課
  • 把邏輯封裝成函數,一檔與一百檔股票的差異只是迴圈而已
  • 定時任務可以再結合 schedule 套件或作業系統的排程器,讓程式真正「無人值守」
  • 下一步建議:用 pandas 分析歷史資料,或串接 matplotlib 畫 K 線圖

你寫過哪些用程式抓取金融資料的小工具?在抓資料時遇過哪些「接口意外」?歡迎在留言區分享你的踩坑經驗,我們一起討論!