iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
AI & Data

從網路爬蟲到資料洞察的應用系列 第 13

一次抓取多個月份的資料(迴圈組 URL)

  • 分享至 

  • xImage
  •  

在前幾天的練習中,我們已經學會如何抓取單一月份的股票資料,也能用 twstock 或直接處理 JSON / CSV 來取得台積電 (2330) 的資訊。不過,股市分析往往需要觀察更長的時間區間,例如半年、一年甚至更久。今天來利用迴圈來自動組合 URL / 指定年月,一次抓取多個月份的資料,避免每次都要手動輸入年月。

基本想法

股票資料的 API 或套件大多支援「指定某年某月」的查詢方式。因此如果我們想要抓取連續好幾個月的資料,就需要:

  • 決定要往前追溯幾個月(例如 6 個月)。
  • 計算起始的年份和月份(因為月份不能小於 1,必須考慮跨年問題)。
  • 用迴圈逐月呼叫抓取函式,將資料整合起來。

這樣就能一次取回完整的區間資料。

範例程式碼

以下程式示範如何抓取最近 6 個月的台積電 (2330) 股價資料:

import datetime
import twstock

# 建立股票物件
stock = twstock.Stock('2330')

# 設定要抓取的月份數
MONTHS_TO_FETCH = 6

# 計算起始的年份和月份
today = datetime.date.today()
start_year = today.year
start_month = today.month - (MONTHS_TO_FETCH - 1)

# 如果月份 <= 0,代表跨年,要調整成正確的年份與月份
while start_month <= 0:
    start_month += 12
    start_year -= 1

print(f"正在從 {start_year}/{start_month} 抓取最近 {MONTHS_TO_FETCH} 個月的台積電(2330)股價資料...")

# 抓取資料(從起始年月到今天)
stock.fetch_from(start_year, start_month)

# 檢查資料長度
print(f"成功取得 {len(stock.date)} 筆資料")
print("前 5 筆資料:")
for i in range(5):
    print(stock.date[i], stock.open[i], stock.close[i], stock.capacity[i])

程式碼解析

  1. 設定月份數 (MONTHS_TO_FETCH) : 這裡我們設定成 6,代表要抓取最近 6 個月的資料。
  2. 計算起始年月
    。today.month - (MONTHS_TO_FETCH - 1):往前推 N-1 個月。
    。如果結果小於等於 0,表示已經跨年,因此用 while 迴圈進行調整,確保月份落在 1~12 之間,並且年份相應減 1。
  3. 呼叫 fetch_from(start_year, start_month) : 這個方法會自動從起始年月抓到最新的資料。以今天來說,如果今天是 2025/09,它會抓取從 2025/04 到 2025/09 的所有交易日資料。
  4. 輸出檢查結果
    。len(stock.date):回傳總筆數。
    。用 for 迴圈印出前 5 筆資料,確認內容正確。

執行結果範例

假設今天是 2025/09/##,設定 MONTHS_TO_FETCH = 6,程式會印出:

正在從 2025/4 抓取最近 6 個月的台積電(2330)股價資料...
成功取得 125 筆資料
前 5 筆資料:
2025-04-01  825  832  30215453
2025-04-02  830  828  26518493
2025-04-03  828  820  23128712
2025-04-07  822  826  27452187
2025-04-08  826  832  31875491

(數字僅為示意,實際結果依當日資料為準。)

總結

今天我們學會了如何用 迴圈+日期計算,一次抓取多個月份的資料。這個技巧讓我們不用手動輸入年月,程式會自動處理跨年問題並組合完整的時間區間。未來我們就能更方便地進行長期股價趨勢分析,像是計算半年平均價、觀察成交量變化,甚至搭配 matplotlib 畫圖。
那今天就先這樣。
/images/emoticon/emoticon29.gif


上一篇
畫成交量長條圖
下一篇
將多月資料合併成一個 DataFrame
系列文
從網路爬蟲到資料洞察的應用16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言