Python 爬蟲實戰範例
集保戶股權分散表爬蟲
從數據抓取到 Excel 報告
Introduction
前言
在這篇文章中,我們將展示如何使用 Python 和 Plotly 工具來抓取和呈現集保戶股權分散表數據。集保戶股權分散表顯示了每檔股票的股東持股人數、持股比例以及在集保庫存中的佔比,這些信息對於理解公司股東結構和進行投資決策至關重要。
我們將通過以下步驟來完成整個過程:
- 爬蟲數據:從網絡上抓取集保戶股權分散表數據,並儲存為 CSV 文件。
- 數據呈現:選擇特定證券,使用
pandas
過濾數據,顯示其持股人數和比例。 - 資料視覺化:使用
plotly
產生圖表,展示持股分級的人數分佈及其在集保庫存中的比例。 - Excel 報告自動化:利用
xlwings
將圖表和數據自動儲存到 Excel 文件中,方便進一步分析和報告。
本文提供的 Python 實戰範例將幫助您掌握從數據抓取到報告生成的全過程,完整程式碼可以直接在這邊下載。
爬蟲數據
首先,我們將從台灣政府資料開放平臺抓取最新的「集保戶股權分散表」數據,並將其儲存CSV檔案。這些資料已經是整理好的,所以我們不需要做其他額外的處理。
以下是使用 Python 來抓取和儲存這些資料的程式碼:
import pandas as pd
# 設定下載連結
url = ' https://opendata.tdcc.com.tw/getOD.ashx?id=1-5'
# 讀取資料
df = pd.read_csv(url)
# 儲存資料
local_filename = 'data.csv'
df.to_csv(local_filename, index=False)
print(f"處理後的資料已儲存為 {local_filename}")
df
程式碼說明
- 讀取資料:使用
pandas
的read_csv
從指定的 URL 讀取 CSV 資料。 - 儲存資料:將資料儲存為
data.csv
。 - 顯示成功消息:輸出一條消息,指示資料已成功儲存。
資料展示: 以下是從下載的資料中提取的部分內容

呈現資料
接下來,過濾和顯示特定股票代號的股權分散表數據。以下是過濾資料的程式碼:
# 設置股票代號變數
stock_code = '0050'
# 讀取CSV檔案
df = pd.read_csv('data.csv', encoding='utf-8')
# 過濾出證券代碼為 0050 的數據
df_filtered = df[df['證券代號'] == stock_code]
# 排除持股分級為16和17的數據
df_filtered = df_filtered[~df_filtered['持股分級'].isin([16, 17])]
df_filtered
程式碼說明
- 設置股票代號:設置我們要查詢的股票代號,例如0050。
- 讀取CSV檔案:使用
pandas
的read_csv
函數讀取本地儲存的CSV檔案。 - 過濾數據:過濾出證券代碼為設定的股票代號的數據。
- 排除特定持股分級:排除持股分級為16和17的數據。(因為股權分級總共有15級)

製作特定股票代號持股分級人數分布圖
使用 Plotly
套件來可視覺化特定股票的持股分級人數分布圖,幫助我們更直觀地了解股東持股狀況。程式碼包括數據讀取、過濾和圖表繪製的完整過程。
import pandas as pd
import plotly.express as px
import plotly.io as pio
# 設定 Plotly 的全域主題為 dark
pio.templates.default = "plotly_dark"
# 設置股票代號變數
stock_code = '0050'
# 讀取CSV檔案
df = pd.read_csv('data.csv', encoding='utf-8')
# 過濾出證券代碼為 0050 的數據
df_filtered = df[df['證券代號'] == stock_code]
# 排除持股分級為 17 的數據
df_filtered = df_filtered[~df_filtered['持股分級'].isin([16, 17])]
# 使用 Plotly 繪製持股分級人數分布圖
fig = px.bar(
df_filtered,
x='持股分級',
y='人數',
title=f'持股分級人數分布圖 (證券代碼: {stock_code})',
labels={'持股分級': '持股分級', '人數': '人數'},
color='人數',
color_continuous_scale='Viridis'
)
# 在 Jupyter Notebook 中顯示圖表
fig
程式碼說明
- 匯入套件:
pandas
用於數據處理。plotly.express
用於數據可視化。plotly.io
用於設定 Plotly 的全域主題。
- 設定 Plotly 的全域主題:
pio.templates.default = "plotly_dark"
:將 Plotly 的主題設置為深色模式,使圖表具有深色背景,更適合在暗環境中查看。
- 設置股票代號變數:
stock_code = '0050'
:指定要查詢的股票代號。
- 讀取CSV檔案:
- 使用
pandas
的read_csv
函數讀取本地的 CSV 檔案,檔案名為data.csv
,並使用 UTF-8 編碼解析數據。
- 使用
- 過濾數據:
- 過濾出證券代碼為指定股票代號(’0050’)的數據。
- 排除特定持股分級的數據:
- 排除持股分級為 16 和 17 的數據,因為持股分級總共只有 15 級。
- 繪製圖表:
- 使用
Plotly Express
的px.bar
函數繪製柱狀圖。 - X 軸顯示持股分級,Y 軸顯示人數。
- 設置圖表標題,包含股票代號。
- 根據人數為每個柱狀圖上色,顏色比例尺設定為 ‘Viridis’。
- 使用
- 顯示圖表:
- 在 Jupyter Notebook 中顯示圖表對象
fig
,以便進行進一步的數據分析和可視化。
- 在 Jupyter Notebook 中顯示圖表對象

自動化儲存股票資料與視覺化圖表到 Excel
這段程式碼旨在從 CSV 檔案讀取股票數據,生成持股分級人數分布圖,並將這些圖表及相關數據儲存到 Excel 文件中。圖表會儲存為圖片並插入到 Excel 的對應工作表中,方便進行進一步分析和報告。
import pandas as pd
import plotly.express as px
import plotly.io as pio
import xlwings as xw
import os
# 設定資料和圖表儲存的路徑
data_file_path = 'data.csv'
excel_file_path = 'data.xlsx'
image_folder = os.path.abspath('charts_images')
# 創建存放圖表圖片的資料夾
os.makedirs(image_folder, exist_ok=True)
# 讀取資料
data = pd.read_csv(data_file_path, encoding='utf-8')
# 創建 Excel 文件
wb = xw.Book() # 創建新的 Excel 工作簿
def plot_data(stock_code):
"""
根據指定的股票代號顯示持股分級人數分布圖,並將其儲存為圖片。
:param stock_code: 股票代號
:return: 圖片檔案名稱
"""
# 過濾出證券代碼為指定的股票代號的數據
df_filtered = data[data['證券代號'] == stock_code]
# 排除持股分級為 16 和 17 的數據
df_filtered = df_filtered[~df_filtered['持股分級'].isin([16, 17])]
# 使用 Plotly 繪製持股分級人數分布圖
fig = px.bar(
df_filtered,
x='持股分級',
y='人數',
title=f'持股分級人數分布圖 (證券代號: {stock_code})',
labels={'持股分級': '持股分級', '人數': '人數'},
color='人數',
color_continuous_scale='Viridis'
)
# 儲存圖表為圖片
image_filename = os.path.join(image_folder, f'{stock_code}_chart.png')
fig.write_image(image_filename)
return image_filename
# 透過迴圈處理各股票代號並儲存資料和圖表
for stock_code in ['0050', '2330']: # 股票代號應為字串類型
# 創建新工作表
sheet = wb.sheets.add(name=stock_code)
# 過濾出證券代碼為指定的股票代號的數據
df_filtered = data[data['證券代號'] == stock_code]
# 排除持股分級為 16 和 17 的數據
df_filtered = df_filtered[~df_filtered['持股分級'].isin([16, 17])]
# 將數據寫入工作表
sheet.range('A1').options(index=False, header=True).value = df_filtered
# 繪製和儲存圖表
image_filename = plot_data(stock_code)
# 確保圖片檔案存在
if os.path.exists(image_filename):
# 插入圖表到工作表
sheet.pictures.add(image_filename, left=sheet.range('G3').left, top=sheet.range('G3').top, width=600, height=400)
print(f"已將 {stock_code} 的資料和圖表儲存到工作表")
else:
print(f"圖片檔案 {image_filename} 不存在")
# 儲存 Excel 文件
wb.save(excel_file_path)
wb.close()
print(f"所有資料和圖表已儲存為 {excel_file_path}")
程式碼說明
- 匯入套件:
pandas
用於數據處理。plotly.graph_objects
和plotly.express
用於數據視覺化。plotly.io
用於設定 Plotly 的全域主題。xlwings
用於操作 Excel 文件。os
用於文件和資料夾操作。
- 設定路徑:
data_file_path
:CSV 資料檔案路徑。excel_file_path
:儲存 Excel 檔案的路徑。image_folder
:圖表圖片儲存的資料夾路徑,若資料夾不存在則創建。
- 讀取資料:
- 使用
pandas
的read_csv
函數從 CSV 檔案讀取數據,編碼設為'utf-8'
。
- 使用
- 創建 Excel 文件:
- 使用
xlwings
創建新的 Excel 工作簿。
- 使用
plot_data
函數:- 功能:根據股票代號生成持股分級人數分布圖並儲存為圖片。
- 步驟:
- 過濾指定股票代號的數據。
- 排除持股分級為 16 和 17 的數據。
- 使用 Plotly 繪製圖表並儲存為圖片。
- 處理每個股票代號:
- 迴圈跑所有股票代號列表。
- 建立對應的工作表並將數據寫入。
- 繪製圖表並插入到工作表中。
- 儲存 Excel 文件:
- 儲存 Excel 文件並關閉工作簿。
這樣,就可以自動製作 Excel 文件,其中包含了每個股票代號的持股分級人數分布圖及其數據。這種自動化處理可以節省大量時間,並確保數據和圖表的統一性。

結論
在這篇文章中,我們展示了如何使用 Python 和 Plotly 工具來呈現集保戶股權分散表數據。以下是我們 Python 教學的主要重點:
- 爬蟲數據: 我們從網絡上抓取了集保戶股權分散表數據,並將其儲存為 CSV 文件,以便進行進一步處理。
- 數據呈現: 利用 pandas 選擇特定證券並過濾數據,顯示其持股人數和持股比例,幫助我們理解不同證券的持股情況。
- 資料視覺化: 使用 Plotly 生成圖表,展示持股分級的人數分佈及其在集保庫存中的比例,使數據變得更加直觀和易於理解。
- Excel 報告自動化: 利用 xlwings 自動將圖表和數據儲存到 Excel 文件中,方便進一步分析和製作報告,提升工作效率。
本文中的 Python 實戰範例程式碼可以直接在此處下載。
參考資料
- 台灣政府資料開放平臺:提供各種公共數據,旨在促進資料開放與共享。 政府資料開放平臺
- Python 官方文檔:了解Python的基本功能和用法。 Python官方網站
- Plotly 官方文檔:提供關於Plotly的詳細資料和使用指南,用於資料視覺化。 Plotly官方網站
- xlwings 官方文檔:提供有關xlwings的使用說明,幫助將資料和圖表存入Excel。 xlwings官方網站
課程推薦
- Python 金融資訊爬蟲大師班:這是一門以「股票數據」、「金融資訊」與「財經新聞」為主軸的「網路爬蟲」課程。
- 用Python打造自己專屬的VIP看盤室:專注於使用Plotly進行資料視覺化,學習如何製作專業、美觀的互動圖表,幫助你有效地展示數據和趨勢。
- 用Python操作Excel|實現職場自動化與理財工具開發:掌握xlwings及其他工具來實現Excel的自動化處理,從數據整理到報告生成,全方位提升工作效率。
這些課程能夠幫助你進一步提升資料分析和視覺化的能力,並將所學應用到實際工作中,讓你在數據分析領域中更加游刃有餘。
全方位 Python 課程
無論你是初學者還是有經驗的開發者,這裡的課程都能滿足你的需求。精心設計的8堂課程,涵蓋不同類型的Python主題,幫助你在各個領域中脫穎而出。