最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

2015年10月5日 星期一

網路爬蟲系列 (Crawler) (2) : 使用Chrome「檢查元素」找出「證交所」加權股價指數歷史資料下載的方法

前一篇介紹 網路爬蟲系列 (Crawler)(1) : 使用Chrome「檢查元素」找出 PChome購物網站 資料位置 屬於基礎技能,接著介紹如何用相同方法來下載 證交所加權股價指數歷史資料
抓取證交所加權股價指數歷史資料而言,對於會使用Excel VBA QuerytablePython 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
curllinux下指令)
8,167

以上內容在後續會進行說明轉至Python程式碼中。

線上Base64解碼
參考資料