Python爬取公開資訊觀測站資料

Puffin後花園
Feb 19, 2022

--

[前情提要 — 可略過]

因為最近辦了永豐金的證券戶,打算要來串他們的Python的API,最終目標是可以比較方便的管理邏輯跟回測。

辦完後想說拿閒錢存一下股,所以買了幾張金融股,晚上男友問我為什麼買,才發現自己做出選擇的資訊,根本太單薄。於是男友叫要我找出「2016–2022除權息%,每年都大於7%的股票」。

是說我也不知道為什麼歷史股利分派的這種東西,沒有一個比較方便的下載方式,到公開資訊觀測站,都還要手動選擇,套一句我小老闆的話,「一次手動我都不想做」。

觀察了一下網站,是用ajax技術去做的,第一個想到的是用selenium去抓取。但其他相關抓取公開資訊站的技術文章,都是用request.post的方法去call,讓我驚覺,我到底脫節了多久了~~~工作上的爬蟲技術只是個附加技能,有的話很好,沒有的話學就好了。所以如果遇到需要爬蟲相關的技術,都是寫senelium來擋,遇到ajax的網站就只好scroll到最下面XD

以下就要來紀錄一下怎麼爬ajax網站

[正文]

首先我們到公開資訊觀測站的網站去找股利分派這一個頁面,我選擇的是歷史資料,然後以玉山金(2884)為例,點選之後會看到有表格跳出來

輸入想要看的公司代號與年份

好囉開始囉我們要來觀察頁面囉

滑鼠點選右鍵,選擇「檢查」,會跑出右邊這個視窗,選擇上面的「Network」,然後再重新整理網頁一次,就會跑出從網站loading後,所傳遞過的檔案。這邊我們要再重新點選一次剛剛選過的選項。

之後我們會看到有各種檔案被loading進來,其中我們點選ajax_t05st09_2這個檔案。

按一下上面的「Payload」,會顯示Form Data,這個就是要丟給request去post的格式。

程式碼如下:

import requests
import pandas as pd
def get_data_df(url, stockNo):
# url = "https://mops.twse.com.tw/mops/web/ajax_t05st09_2"
# stockNo = 2884
form_data = {
'encodeURIComponent': 1
, 'step': 1
, 'firstin': 1
, 'off': 1
, 'queryName': 'co_id'
, 'inpuType': 'co_id'
, 'TYPEK': all
, 'isnew': False
, 'co_id': stockNo
, 'date1': 100
, 'date2': 110
, 'qryType': 1
}
r = requests.post(url,form_data)
html_df = pd.read_html(r.text)[3].fillna("")
return html_df
df = get_data_df("https://mops.twse.com.tw/mops/web/ajax_t05st09_2", 2884)

可以觀察一下pd.read_html回傳了幾個table回來,適時調整一下要讀取哪一個table~

[下一步]

接下來就要來爬想爬的股票,然後看要怎麼做資料分析囉~

--

--