抓取證交所加權股價指數歷史資料而言,對於會使用Excel VBA Querytable、Python BeautifulSoup等這些方法取解析表格資料的朋友來說早已不是難事,但在這裡不是要介紹如何抓取表格資料,而是要介紹如何找到下載加權股價指數歷史資料。
一樣先確認網頁類型:做法可以參考 網路爬蟲系列 (Crawler)(1) : 使用Chrome「檢查元素」找出 PChome購物網站 資料位置 。
1. 關閉JavaScript。
2. 開啟Chrome的「檢查元素」。
3. 按下重新載入按鈕。
結果:在Doc標籤中察看Response的內容,找不到任何有關加權股價指數資料。
但如果開啟JavaScript後,卻可在相同位置見到加權股價指數資料,表示該資料使用JavaScript作動態載入。
眼尖的朋友仔細觀察又會發現,表格資料似乎是被當成變數,在未來被事件觸發後就會以變數型態進行將資料傳送至伺服器,這樣的做法在爬蟲時要特別注意。
接著清除Chrome的「檢查元素」中的內容,再點選另存CSV按鈕下載CSV,可見到傳送方式是以Post將變數傳送至以下位置 http://www.twse.com.tw/ch/trading/indices/MI_5MINS_HIST/MI_5MINS_HIST_print.php?language=ch&save=csv
那傳送的變數呢? 未來哪裡見到?
使用Post傳送可在Form Data中見到傳送內容。
使用Get傳送可在Query String Data中見到傳送內容。
將 Form Data 顯示畫面調整一下,這樣各位可發現POST傳送的內容,似乎跟網頁原始程式碼有些類似,不過好像有很大的差異,對吧!
這差異部分就是該網站把我們所見的表格資料網頁原始碼,以Base64編碼進行加密傳送至後台伺服器做解碼,並內容轉成CSV檔傳至前台,最後再讓使用者下載CSV檔。
我們把加密的內容,拿到網路上有提供Base64解密的網頁上做解密動作,會發現,解密出來的資料確實跟表格資料網頁原始碼是一樣。
Base64解碼 - 網上的Base64解碼器
何謂Base64? 請參考Base64維基百科。
我們將上述分析出來的網址與Base64編碼內容進行結合,請注意兩者的結連需使用 "&" 符號來連結,如下內容紅色的"&"。
http://www.twse.com.tw/ch/trading/indices/MI_5MINS_HIST/MI_5MINS_HIST_print.php?language=ch&save=csv&html=PHRhYmxlIHdpZHRoPTU5MCBib3JkZXI9MCBhbGlnbj1jZW50ZXIgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0xIGNsYXNzPWJvYXJkX3RyYWQ%2BPHRyIGhlaWdodD0yNSBiZ2NvbG9yPSNGN0YwRTg%2BPHRkIGNvbHNwYW49NT48ZGl2IGFsaWduPWNlbnRlciBjbGFzcz10aWxfMj4xMDQg5bm0MTDmnIgg55m86KGM6YeP5Yqg5qyK6IKh5YO55oyH5pW45q235Y%2By6LOH5paZPC9kaXY%2BPC90ZD48L3RyPjx0ciBiZ2NvbG9yPSNFQkRDQzkgY2xhc3M9YmFzaWMyIGhlaWdodD0yNT48dGQgYWxpZ249Y2VudGVyPuaXpeacnzwvdGQ%2BPHRkIGFsaWduPWNlbnRlcj7plovnm6TmjIfmlbg8L3RkPjx0ZCBhbGlnbj1jZW50ZXI%2B5pyA6auY5oyH5pW4PC90ZD48dGQgYWxpZ249Y2VudGVyPuacgOS9juaMh%2BaVuDwvdGQ%2BPHRkIGFsaWduPWNlbnRlcj7mlLbnm6TmjIfmlbg8L3RkPjwvdHI%2BPHRyIGhlaWdodD0yMCBiZ2NvbG9yPSNGRkZGRkYgY2xhc3M9Z3JheTEyPjx0ZCBhbGlnbj1jZW50ZXI%2BIDEwNC8xMC8wMTwvdGQ%2BPHRkIGFsaWduPWNlbnRlcj4gOCwxOTQuMzA8L3RkPjx0ZCBhbGlnbj1jZW50ZXI%2BIDgsMzE3Ljc5PC90ZD48dGQgYWxpZ249Y2VudGVyPiA4LDE3MC43ODwvdGQ%2BPHRkIGFsaWduPWNlbnRlcj4gOCwyOTUuOTQ8L3RkPjwvdHI%2BPHRyIGhlaWdodD0yMCBiZ2NvbG9yPSNGRkZGRkYgY2xhc3M9Z3JheTEyPjx0ZCBhbGlnbj1jZW50ZXI%2BIDEwNC8xMC8wMjwvdGQ%2BPHRkIGFsaWduPWNlbnRlcj4gOCwyOTAuNDM8L3RkPjx0ZCBhbGlnbj1jZW50ZXI%2BIDgsMzIwLjY2PC90ZD48dGQgYWxpZ249Y2VudGVyPiA4LDI1My43NTwvdGQ%2BPHRkIGFsaWduPWNlbnRlcj4gOCwzMDUuMDM8L3RkPjwvdHI%2BPHRyIGhlaWdodD0yMCBiZ2NvbG9yPSNGRkZGRkYgY2xhc3M9Z3JheTEyPjx0ZCBhbGlnbj1jZW50ZXI%2BIDEwNC8xMC8wNTwvdGQ%2BPHRkIGFsaWduPWNlbnRlcj4gOCwzNDIuOTk8L3RkPjx0ZCBhbGlnbj1jZW50ZXI%2BIDgsMzY0LjU5PC90ZD48dGQgYWxpZ249Y2VudGVyPiA4LDMxNi44MzwvdGQ%2BPHRkIGFsaWduPWNlbnRlcj4gOCwzNTIuMzY8L3RkPjwvdHI%2BPC90YWJsZT4%3D&dirname=MI_5MINS_HIST10410
最後把上面這一大段內容複製到瀏覽器的URL上,即可下載我們需要的CSV檔案,有一底要提醒各位,上面的內容是2015/10/1~2015/10/5的內容,如果需要其他月份資料,可依照上面方法下載所需的CSV。
補充說明各家瀏覽器的URL有長度限制,如果傳送變數長度超出此範圍可能無法使用。
瀏覽器
|
最大長度(字元數)
|
備註
|
Internet
Explorer
|
2,083
|
如果超過這個數位,提交按鈕沒有任何反應
|
Firefox
|
65,536
|
|
chrome
|
8,182
|
|
Safari
|
80,000
|
|
Opera
|
190,000
|
|
curl(linux下指令)
|
8,167
|
以上內容在後續會進行說明轉至Python程式碼中。
線上Base64解碼
參考資料
- HTTP中的URL长度限制 - lengyuhong - 博客园
- 使用 DATA URI 將圖片以 Base64 編碼並內崁至網頁中,加速載入速度
- 淺談 HTTP Method:表單中的 GET 與 POST 有什麼差別?