Python 實戰 30 秒抓取 0050 成分股!Playwright 錄製模式威力展示
各位好!
今天我們直接實戰演練。目標是抓取台灣最熱門的 ETF —— 元大台灣 50 (0050) 的即時成分股權重。
挑戰目標:元大投信官網
為什麼選這個網站?因為它有兩個對傳統爬蟲來說很煩人的設計:
彈出式視窗:一進去會先彈出警告,不點掉看不到內容。
內容摺疊:成分股列表預設只顯示前幾名,必須手動點擊「展開」才能看到完整的 50 檔股票。
如果用 Selenium 手寫,光是定位那個「確定」按鈕和處理等待時間,可能就要花上十分鐘。但用 Playwright 錄製,只要 30 秒。
實作步驟
- 安裝環境 首先,我們安裝 Python 套件:
pip install playwright
接著,安裝它需要的瀏覽器內核(這步很重要,別漏了):
playwright install
就這樣,環境搞定。
在終端機輸入:
playwright codegen https://www.yuantaetfs.com/product/detail/0050/ratio
-
操作瀏覽器 瀏覽器跳出來後,我們只需要做三件事: 點擊彈窗的 [確定]。 滑到下方,點擊 [展開] (讓所有股票露出來)。 點擊一下表格內容 (這時 Playwright 會幫我們生成表格的 Selector)。 複製產生的程式碼後再關閉瀏覽器
-
微調程式碼 錄製完成後,我們只需要補上一行 all_inner_texts() 來提取文字,完整的 Python 程式碼如下:
import re
from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:
# 啟動瀏覽器 (headless=False 可以看到過程,不想看到可以設為true)
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://www.yuantaetfs.com/product/detail/0050/ratio")
page.get_by_role("button", name="確定").click()
page.get_by_text("展開").click()
page.locator("div:nth-child(3) > .each_table").click()
# 由上面點擊結果可以看到標籤是div:nth-child(3) > .each_table
titles = page.locator("div:nth-child(3) > .each_table").all_inner_texts()
#那我們就把他換到這裡,如果要爬其他的請改變的標籤
print("=== 抓到的資料如下 ===")
for title in titles:
print(title)
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
執行結果 執行這段程式,瞬間就能把 0050 當下最新的持股權重全部抓下來:
=== 抓到的資料如下 ===
商品代碼 商品名稱 商品數量 商品權重
2330 台積電 409610933 61.31
2317 鴻海 204784820 4.59
2454 聯發科 24688844 3.41
2308 台達電 32424502 3.1
2891 中信金 296630032 1.49
2881 富邦金 140248250 1.38
3711 日月光投控 54895774 1.29
... (中間省略) ...
2615 萬海 23558417 0.19
6505 台塑化 19917322 0.1
收合
(資料截自2025年12月25日)
結論
這就是 Playwright 強大的地方。
如果是以前,我們需要花時間按 F12 檢查網頁原始碼,去找那個「確定」按鈕藏在哪個 div 裡,還要擔心按鈕還沒載入就點擊會報錯。
但在 Playwright 的世界裡:
page.get_by_role("button", name="確定"):這種語法非常直覺,就像在跟瀏覽器說話一樣。
page.get_by_text("展開"):直接找文字,完全不用管 CSS Selector。 對於想要快速抓取資料、又不想深究網頁結構的開發者來說,這絕對是目前最高效的解決方案!
下次我們再來試試看更進階的:如何把抓下來的這些資料,自動存成 Excel 報表。
0 留言
發表留言