Python 爬蟲實戰範例

集保戶股權分散表爬蟲

從數據抓取到 Excel 報告

 

Introduction

前言

在這篇文章中,我們將展示如何使用 Python 和 Plotly 工具來抓取和呈現集保戶股權分散表數據。集保戶股權分散表顯示了每檔股票的股東持股人數、持股比例以及在集保庫存中的佔比,這些信息對於理解公司股東結構和進行投資決策至關重要。

我們將通過以下步驟來完成整個過程:

  1. 爬蟲數據:從網絡上抓取集保戶股權分散表數據,並儲存為 CSV 文件。
  2. 數據呈現:選擇特定證券,使用 pandas 過濾數據,顯示其持股人數和比例。
  3. 資料視覺化:使用 plotly 產生圖表,展示持股分級的人數分佈及其在集保庫存中的比例。
  4. 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

程式碼說明

  1. 讀取資料:使用 pandasread_csv 從指定的 URL 讀取 CSV 資料。
  2. 儲存資料:將資料儲存為 data.csv
  3. 顯示成功消息:輸出一條消息,指示資料已成功儲存。

資料展示: 以下是從下載的資料中提取的部分內容

集保戶股權分散表

呈現資料

接下來,過濾和顯示特定股票代號的股權分散表數據。以下是過濾資料的程式碼:

# 設置股票代號變數
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

程式碼說明

  1. 設置股票代號:設置我們要查詢的股票代號,例如0050。
  2. 讀取CSV檔案:使用 pandasread_csv 函數讀取本地儲存的CSV檔案。
  3. 過濾數據:過濾出證券代碼為設定的股票代號的數據。
  4. 排除特定持股分級:排除持股分級為16和17的數據。(因為股權分級總共有15級)
0050 集保戶股權分散表

製作特定股票代號持股分級人數分布圖

使用 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

程式碼說明

  1. 匯入套件
    • pandas 用於數據處理。
    • plotly.express 用於數據可視化。
    • plotly.io 用於設定 Plotly 的全域主題。
  2. 設定 Plotly 的全域主題
    • pio.templates.default = "plotly_dark":將 Plotly 的主題設置為深色模式,使圖表具有深色背景,更適合在暗環境中查看。
  3. 設置股票代號變數
    • stock_code = '0050':指定要查詢的股票代號。
  4. 讀取CSV檔案
    • 使用 pandasread_csv 函數讀取本地的 CSV 檔案,檔案名為 data.csv,並使用 UTF-8 編碼解析數據。
  5. 過濾數據
    • 過濾出證券代碼為指定股票代號(’0050’)的數據。
  6. 排除特定持股分級的數據
    • 排除持股分級為 16 和 17 的數據,因為持股分級總共只有 15 級。
  7. 繪製圖表
    • 使用 Plotly Expresspx.bar 函數繪製柱狀圖。
    • X 軸顯示持股分級,Y 軸顯示人數。
    • 設置圖表標題,包含股票代號。
    • 根據人數為每個柱狀圖上色,顏色比例尺設定為 ‘Viridis’。
  8. 顯示圖表
    • 在 Jupyter Notebook 中顯示圖表對象 fig,以便進行進一步的數據分析和可視化。
製作特定股票代號持股分級人數分布圖

自動化儲存股票資料與視覺化圖表到 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}")

程式碼說明

  1. 匯入套件
    • pandas 用於數據處理。
    • plotly.graph_objectsplotly.express 用於數據視覺化。
    • plotly.io 用於設定 Plotly 的全域主題。
    • xlwings 用於操作 Excel 文件。
    • os 用於文件和資料夾操作。
  2. 設定路徑
    • data_file_path:CSV 資料檔案路徑。
    • excel_file_path:儲存 Excel 檔案的路徑。
    • image_folder:圖表圖片儲存的資料夾路徑,若資料夾不存在則創建。
  3. 讀取資料
    • 使用 pandasread_csv 函數從 CSV 檔案讀取數據,編碼設為 'utf-8'
  4. 創建 Excel 文件
    • 使用 xlwings 創建新的 Excel 工作簿。
  5. plot_data 函數
    • 功能:根據股票代號生成持股分級人數分布圖並儲存為圖片。
    • 步驟
      • 過濾指定股票代號的數據。
      • 排除持股分級為 16 和 17 的數據。
      • 使用 Plotly 繪製圖表並儲存為圖片。
  6. 處理每個股票代號
    • 迴圈跑所有股票代號列表。
    • 建立對應的工作表並將數據寫入。
    • 繪製圖表並插入到工作表中。
  7. 儲存 Excel 文件
    • 儲存 Excel 文件並關閉工作簿。

這樣,就可以自動製作 Excel 文件,其中包含了每個股票代號的持股分級人數分布圖及其數據。這種自動化處理可以節省大量時間,並確保數據和圖表的統一性。

自動化儲存股票資料與視覺化圖表到 Excel

結論

在這篇文章中,我們展示了如何使用 Python 和 Plotly 工具來呈現集保戶股權分散表數據。以下是我們 Python 教學的主要重點:

  1. 爬蟲數據: 我們從網絡上抓取了集保戶股權分散表數據,並將其儲存為 CSV 文件,以便進行進一步處理。
  2. 數據呈現: 利用 pandas 選擇特定證券並過濾數據,顯示其持股人數和持股比例,幫助我們理解不同證券的持股情況。
  3. 資料視覺化: 使用 Plotly 生成圖表,展示持股分級的人數分佈及其在集保庫存中的比例,使數據變得更加直觀和易於理解。
  4. Excel 報告自動化: 利用 xlwings 自動將圖表和數據儲存到 Excel 文件中,方便進一步分析和製作報告,提升工作效率。

本文中的 Python 實戰範例程式碼可以直接在此處下載

參考資料

  1. 台灣政府資料開放平臺:提供各種公共數據,旨在促進資料開放與共享。 政府資料開放平臺
  2. Python 官方文檔:了解Python的基本功能和用法。 Python官方網站
  3. Plotly 官方文檔:提供關於Plotly的詳細資料和使用指南,用於資料視覺化。 Plotly官方網站
  4. xlwings 官方文檔:提供有關xlwings的使用說明,幫助將資料和圖表存入Excel。 xlwings官方網站

課程推薦

  1. Python 金融資訊爬蟲大師班:這是一門以「股票數據」、「金融資訊」與「財經新聞」為主軸的「網路爬蟲」課程。
  2. 用Python打造自己專屬的VIP看盤室:專注於使用Plotly進行資料視覺化,學習如何製作專業、美觀的互動圖表,幫助你有效地展示數據和趨勢。
  3. 用Python操作Excel|實現職場自動化與理財工具開發:掌握xlwings及其他工具來實現Excel的自動化處理,從數據整理到報告生成,全方位提升工作效率。

這些課程能夠幫助你進一步提升資料分析和視覺化的能力,並將所學應用到實際工作中,讓你在數據分析領域中更加游刃有餘。

全方位 Python 課程

無論你是初學者還是有經驗的開發者,這裡的課程都能滿足你的需求。精心設計的8堂課程,涵蓋不同類型的Python主題,幫助你在各個領域中脫穎而出。