[C#] 取得公開資訊觀測站股票基本資料(上市、上櫃、興櫃、公開發行)

[C#] 取得公開資訊觀測站股票基本資料(上市、上櫃、興櫃、公開發行)

在公開資訊觀測站可以查到股票的基本資料、財報、股東會、重大訊息等資料。
官網連結: 公開資訊觀測站

我這次要講解的是如何利用 C# ASP.Net MVC 取得公開資訊觀測站的股票基本資料。

在公開資訊觀測站可以點選「彙總報表 > 基本資料 > 基本資料查詢彙總表」開啟頁面。

公開資訊觀測站

網址為: https://mops.twse.com.tw/mops/web/t51sb01
會看到所有上市、上櫃、興櫃、公開發行公司的「基本資料查詢彙總表」
在不選產業別下直接按「查詢」鈕就會取得所有上市公司的基本資料

公開資訊觀測站

查詢結果還提供了「另存CSV」的下載連結。
下載檔案是 CSV 格式,可以利用程式讀取檔案內容

公開資訊觀測站

此 CSV 格式的表頭欄位包含這些

目前查出來的公司就有 965 筆資料,利用程式讀取大量資料是比較合適的方式。

接下來為講解如何利用 C# 取得所有股票的基本資料 CSV 檔案,並讀取 CSV 檔案內容。

手動取得「查詢」呼叫網址

在「查詢」鈕按右鍵 > 檢查

手動取得「查詢」呼叫網址

在 Elements 頁籤裡面會看到指標停在「查詢」的 HTML 上面,然後往上找最近的 <form> 標籤,看到 <form> 標籤指向的網址為 /mops/web/ajax_t51sb01

在 DevTools 有開啟的情況下,再按一次剛剛的查詢鈕
這時候上面頁籤切換到 「Network」,然後往下找到「ajax_t51sb01」的名稱。
點擊名稱後,右邊頁籤選擇「Header」,可以看到 Request URL 以及下面的 Form Data

點擊 Form Data > view source 可以看到組合參數

網址 Request URL: https://mops.twse.com.tw/mops/web/ajax_t51sb01
參數 Form Data: encodeURIComponent=1&step=1&firstin=1&TYPEK=sii&code=
網址及參數將兩者用 “?” 合併起來為

https://mops.twse.com.tw/mops/web/ajax_t51sb01?encodeURIComponent=1&step=1&firstin=1&TYPEK=sii&code=

就是查詢鈕背後傳送的網址。
單獨執行此網址會回傳 HTML 型式的資料

雖然此頁面已經可以利用 HTML Parser 解析來取得資料,但為了更好解讀資料,還是再取得 CSV 檔案來解讀會比較簡單。

手動取得 CSV 呼叫網址

在「另存 CSV」鈕按右鍵 > 檢查

在頁籤「Elements」裡面會停在「另存CSV」鈕的 HTML 上,然後往上找到最近的 <form> 標籤。
會看到指向目標為 /mops/web/ajax_t51sb01

在 <form> 底下有 3 個參數
<input type="hidden" name="firstin" value="true">
<input type="hidden" name="step" value="10">
<input type="hidden" name="filename" value="t51sb01_20210523_111213410.csv">

這 3 個參數是呼叫 ajax_t51sb01 時傳送欄位

在 DevTools 開啟的情況下,按一次「另存 CSV」鈕,然後頁籤切換到「Network」
點擊名稱「t105sb02」,然後記錄右邊的「Request URL」及「Form Data」 參數

點擊 Form Data > view source 可以看到組合參數

網址 Request URL: https://mops.twse.com.tw/server-java/t105sb02
參數 Form Data: firstin=true&step=10&filename=t51sb01_20210523_111213410.csv
網址及參數將兩者用 “?” 合併起來為

https://mops.twse.com.tw/server-java/t105sb02?firstin=true&step=10&filename=t51sb01_20210523_111213410.csv

就是「另存 CSV」鈕背後傳送的網址。
單獨執行此網址會下載 CSV 檔案資料,此 CSV 檔案是程式要解析的資料。

要分 2 步驟取得 CSV 網址是因為 CSV 網址參數會一直改變,由第 1 步查詢時取得參數,才能再取得 CSV 網址參數。

以上的說明是手動取得網址的方式,重要的是知道背後呼叫的網址,有了網址之後,接下來就會轉換成 C# 語法呼叫網址取得 CSV 檔案後解讀資料。

範例建置環境
後端架構: C# ASP.Net MVC .Net Framework
前端架構: Vue.js, jQuery, Bootstrap

使用 Visual Studio 建立 ASP.Net MVC 專案,我用新專案取得公開資訊觀測站的股票基本資料為範例說明,最下方會提供此範例下載。

C# 取得查詢網址

這是我簡單設計的介面,只提供市場別選擇,查詢結果包含全部產業別。
查詢結果欄位我只顯示前面幾個欄位示範就好,下載 CSV 時會包含所有欄位,實務應用時可以依所需欄位讀取。

可以選擇上市、上櫃、興櫃、公開發行查詢

可以選擇上市、上櫃、興櫃、公開發行查詢,查詢後就會將 CSV 檔案內容呈現在網頁上。

HTML前端 View 語法

Javascript 前端 View 語法

C# 後端 Controller 語法

後端語法有用到一個新元件 HtmlAgilityPack 此套件主要是解析 HTML 標籤,取得 HtmlAgilityPack 方法在 NuGet 上搜尋名稱「HtmlAgilityPack」,我安裝時的版本為 1.11.33。

安裝之後,在引用時就可以加入
using HtmlAgilityPack;

GetData() 方法

C# 後端 Model 語法

例外處理

以上語法在 Controller 執行 webClient.DownloadData() 語法時會出現錯誤
System.Net.WebException: ‘伺服器認可通訊協定違規. Section=ResponseStatusLine’
此錯誤問題是 WebClient 是對 HttpWebrequest 進行了封裝,
The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF 微軟沒有容忍不符合 RFC 822 中的 httpHeader 必須以 CRLF 結束的規定服務器響應。

解決方法是 Web.config 增加一段設定

測試注意事項

此範例的資料來源是公開資訊觀測站,而公開資訊觀測站會避免使用者密集頻繁的讀取資料,若發現此情況,則會立即封鎖 IP,導致使用者無法再使用網站,這是為了安全著想,避免網站因 DoS (denial-of-service attack) 被攻擊。
若太密集頻繁查詢而被封鎖 IP,我測試時就發生了一次,實際封鎖時間不知道,但隔一天後就可以正常使用了,所以提醒大家不要太密集頻繁的向公開資訊觀測站查詢資料,包含證交所也是,太密集頻繁查詢也是會被封鎖 IP 的。

重點整理

  1. 利用程式模擬網頁下載 CSV 資料
  2. 使用 WebClient 取得網頁原始碼
  3. 使用 HtmlAgilityPack 解析原始碼
  4. 解析 CSV 取出有用資料

範例下載

連結 GitHub 下載範例

實際網頁專案開發範例

此連結是我實際應用在網頁上呈現的範例: Winvest 雲投資

相關學習文章

開發應用網站

如果你在學習上有不懂的地方,需要諮詢服務,可以參考站長服務,我想辨法解決你的問題
如果文章內容有過時、不適用或錯誤的地方,幫我在下方留言通知我一下,謝謝

加入社團一起討論

關注我的 IG

2 thoughts on “[C#] 取得公開資訊觀測站股票基本資料(上市、上櫃、興櫃、公開發行)

Comments are closed.