最新消息

[公告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 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2015年10月9日 星期五

網路爬蟲系列 (Crawler) (3) : 使用FireFox「檢測元素」、外掛Cookies Manager+、HackBar抓臺灣證交所買賣日報表資料

前兩篇文章 網路爬蟲系列(1)網路爬蟲系列(2) 都是比較簡單,慢慢會開始找一些操作上比較複雜的網站來進行爬蟲解說,這次要爬的網站為「臺灣證交所買賣日報表查詢系統」,該網站是筆者遇過改版最多次的網站,筆者第一爬的網站是它,在2014/12/1該網站加入識別碼輸入機制後,就未曾再看過有再進行改版,可能是改版時間未到,或是爬的人不多,所以還未見到要更版的動作。
現在就來慢慢介紹給各位了解如何透過 Mozilla Fire Fox 找出 證交所買賣日報表查詢系統 的日報表檔案下載位置,這裡不做程式如何撰寫的介紹,僅以操作技巧介紹流程。

事前準備工作:請各位先生、小姐、客官們先安裝以下軟體與確保附加元件安裝完成
1. Mozilla Fire Fox瀏覽器。
2. Fire Fox附加元件 - Cookies Manager+
3. Fire Fox附加元件 - HackBar
4. 在 Mozilla Fire Fox瀏覽器上方空白處按右鍵,點選「選單列」中的「工具」,確認附加元件安裝完成。

我們先以正常人行為模式介紹,證交所買賣日報表查詢系統 對瀏覽器做了什麼事,後面再以非正常人行為模式一步步拆解。
登入證交所買賣日報表查詢系統,開啟 FireFox「檢測元素」、Cookies Manager+ ,並輸入查詢 2330台積電,注意要連同識別碼一起輸入,來觀察瀏覽器的變化。

在未登入 證交所買賣日報表查詢系統 前,請先確定 Cookies Manager+ 的內容是空白乾淨,這樣才能清楚看到中間的變化。

登入 證交所買賣日報表查詢系統 後,會見到 Cookies Manager+ 多了一筆Cookie資料。
Cookie:「ASP.NET_SessionId-bl2vsifhfjtvo20varvuycaj」,請注意該Cookie (重要、重要、重要、重要、重要,我都講5次了,可見有多重要)。

輸入股票代碼、識別碼後查看 FireFox「檢測元素」內容的變化。

在證交所買賣日報表查詢系統網頁,左側深色畫面的原始程式碼,內容就只有兩個網頁連結。


請注意下兩張圖中紅色框框內容。
http://bsr.twse.com.tw/bshtm/bsMenu.aspx 的內容。

http://bsr.twse.com.tw/bshtm/bsContent.aspx?v=t 的內容。

冰雪聰明的各位,是否有發現到圈起來紅色框框內容都有帶入Cookie:「ASP.NET_SessionId-bl2vsifhfjtvo20varvuycaj」,簡單說,未來要抓取該網站資料,如果沒有帶入Cookie,網站是不會讓你查詢資料,這就是為什麼筆者講了5次重要的原因。

PS:這裡請注意一個重點,當你查詢到資料後,如果停留太久之後才去點選下載CSV時,網站將不會讓你下載,也就是說這樣的畫面是有時效性,如果錯過了就要重頭再來。

那至於上面的兩個連結,一個是查尋的頁面,一個是資料呈現與下載的頁面。
查尋的頁面。

資料呈現的頁面。

至於資料下載的頁面,就是將 http://bsr.twse.com.tw/bshtm/bsContent.aspx?v=t 後面接的 "?v=t" 參數移除就行了。

以上就是正常人行為模式,介紹到這裡大家進度應該都有跟上,如果跟不上就趕快發問,或加筆者Line了解,接下來開始介紹非正常人行為模式

這裡使用Chrome的「檢查元素」觀察在POST時,參數傳送的變化。

實際POST傳送參數的內容(View source)。

點選網頁左邊的深色的空白處,查看原始程式碼,會見到有兩段程式碼,與上述POST傳送的參數內容是相同。

第一段內容
 __VIEWSTATE=/wEPDwUJOTAxMjkxMjg3D2QWAgIDD2QWBAIBD2QWAmYPZBYEZg9kFgJmDxAPFgYeB0NoZWNrZWRnHglGb3JlQ29sb3IKAB4EXyFTQgIEZGRkZAIBD2QWAgIBDw8WBB8BCgAfAgIEZGQCAw9kFgQCAw8PFgIeBFRleHRlZGQCCQ8PFgIeB1Zpc2libGVoZGQYAgUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgMFElJhZGlvQnV0dG9uX05vcm1hbAUQUmFkaW9CdXR0b25fRXhjZAUQUmFkaW9CdXR0b25fRXhjZAUPQ2FwdGNoYUNvbnRyb2wxDwUkZDg5YzQyMmEtYjIxNC00YzU4LWIwYzYtNjk3NzdiNjYyNjQ1ZJQ0CEzjhZPnGlDi2S6vIu8=
第二段內容
 __EVENTVALIDATION:/wEdAAaUfTH73HQyey4UaNEABS4lfMmuxAJNAJcNkRRsVeJwwqKURZav/+YrVMqaWE2hvMxJwK4Ohf3nRgXHkFhQen1PRSciNdPYWmINCrip1wqw01PJCA0uL9aE2sjICZqv6GpBlB2Bcbi1NPbCNN4mfR8G
這兩段內容分別可以在bsMenu.aspx原始程式碼找到對應的位址,只不過實際傳送給後臺伺服器的內容並不是如此,而是經過編碼(View parsed)。

POST在傳送時會將參數經過URL編碼後再送給後台進行處理,基於此各位可以試著編碼過後的參數,拿到網路上有URL解碼的網站去解碼 URL Decoder/Encoder,再比對跟上述兩段的內容,即可了解筆者所要表達的意思。
第一段URL編碼的內容
 __VIEWSTATE=%2FwEPDwUJOTAxMjkxMjg3D2QWAgIDD2QWBAIBD2QWAmYPZBYEZg9kFgJmDxAPFgYeB0NoZWNrZWRnHglGb3JlQ29sb3IKAB4EXyFTQgIEZGRkZAIBD2QWAgIBDw8WBB8BCgAfAgIEZGQCAw9kFgQCAw8PFgIeBFRleHRlZGQCCQ8PFgIeB1Zpc2libGVoZGQYAgUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgMFElJhZGlvQnV0dG9uX05vcm1hbAUQUmFkaW9CdXR0b25fRXhjZAUQUmFkaW9CdXR0b25fRXhjZAUPQ2FwdGNoYUNvbnRyb2wxDwUkZDg5YzQyMmEtYjIxNC00YzU4LWIwYzYtNjk3NzdiNjYyNjQ1ZJQ0CEzjhZPnGlDi2S6vIu8%3D
第二段URL編碼的內容
 __EVENTVALIDATION=%2FwEdAAaUfTH73HQyey4UaNEABS4lfMmuxAJNAJcNkRRsVeJwwqKURZav%2F%2BYrVMqaWE2hvMxJwK4Ohf3nRgXHkFhQen1PRSciNdPYWmINCrip1wqw01PJCA0uL9aE2sjICZqv6GpBlB2Bcbi1NPbCNN4mfR8G

了解了要傳送給後台的參數後,回到FireFox瀏覽器上,開啟 HackBar,來進行手動參數設定,筆者幫各位整理出以下要使用變數內容。

請注意有4個變數內容需要修改,分別是 __VIEWSTATE (查看原始程式碼內容,並做URL編碼)、__EVENTVALIDATION (查看原始程式碼內容,並做URL編碼)、TextBox_Stkno (指定欲查詢的股票代碼)、CaptchaControl1 (當前網頁的識別碼圖形中的識別碼)。
 
__EVENTTARGET=
&__EVENTARGUMENT=
&__LASTFOCUS=
&__VIEWSTATE=%2FwEPDwUJOTAxMjkxMjg3D2QWAgIDD2QWBAIBD2QWAmYPZBYEZg9kFgJmDxAPFgYeB0NoZWNrZWRnHglGb3JlQ29sb3IKAB4EXyFTQgIEZGRkZAIBD2QWAgIBDw8WBB8BCgAfAgIEZGQCAw9kFgQCAw8PFgIeBFRleHRlZGQCCQ8PFgIeB1Zpc2libGVoZGQYAgUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgMFElJhZGlvQnV0dG9uX05vcm1hbAUQUmFkaW9CdXR0b25fRXhjZAUQUmFkaW9CdXR0b25fRXhjZAUPQ2FwdGNoYUNvbnRyb2wxDwUkZDg5YzQyMmEtYjIxNC00YzU4LWIwYzYtNjk3NzdiNjYyNjQ1ZJQ0CEzjhZPnGlDi2S6vIu8%3D
&__EVENTVALIDATION=%2FwEdAAaUfTH73HQyey4UaNEABS4lfMmuxAJNAJcNkRRsVeJwwqKURZav%2F%2BYrVMqaWE2hvMxJwK4Ohf3nRgXHkFhQen1PRSciNdPYWmINCrip1wqw01PJCA0uL9aE2sjICZqv6GpBlB2Bcbi1NPbCNN4mfR8G
&RadioButton_Normal=RadioButton_Normal
&TextBox_Stkno=2330
&CaptchaControl1=RQUE4
&btnOK=%E6%9F%A5%E8%A9%A2

現在就帶大家使用FireFox瀏覽器搭配 HackBar 一步步介紹給大家了解,如何手動設定,並傳送參數給後台。

Step 1. 使用FireFox開啟連結 http://bsr.twse.com.tw/bshtm/bsMenu.aspx 。

Step 2. 查看網頁下半身色區塊的原始程式碼,並找出__VIEWSTATE、__EVENTVALIDATION的對應值,到 URL Decoder/Encoder 網頁上去編碼。

URL Decoder/Encoder

__VIEWSTATE
 
%2FwEPDwUJOTAxMjkxMjg3D2QWAgIDD2QWBAIBD2QWAmYPZBYEZg9kFgJmDxAPFgYeB0NoZWNrZWRnHglGb3JlQ29sb3IKAB4EXyFTQgIEZGRkZAIBD2QWAgIBDw8WBB8BCgAfAgIEZGQCAw9kFgQCAw8PFgIeBFRleHRlZGQCCQ8PFgIeB1Zpc2libGVoZGQYAgUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgMFElJhZGlvQnV0dG9uX05vcm1hbAUQUmFkaW9CdXR0b25fRXhjZAUQUmFkaW9CdXR0b25fRXhjZAUPQ2FwdGNoYUNvbnRyb2wxDwUkOWMyYjYyOWQtMDgyNC00YTRjLWFmNzctNTZmMTg1YWYxZWNmZG299hEhBw0JMunN7KclbGY%3D
__EVENTVALIDATION
 
%2FwEdAAZBOxeKxB2MWCqIdygBFcCjfMmuxAJNAJcNkRRsVeJwwqKURZav%2F%2BYrVMqaWE2hvMxJwK4Ohf3nRgXHkFhQen1PRSciNdPYWmINCrip1wqw01PJCA0uL9aE2sjICZqv6GptBPefDWIwtv6p57V01fAc
最後填入上面的變數中,請記得指定欲查詢的股票代碼以及網頁上的識別碼。
 
__EVENTTARGET=
&__EVENTARGUMENT=
&__LASTFOCUS=
&__VIEWSTATE=%2FwEPDwUJOTAxMjkxMjg3D2QWAgIDD2QWBAIBD2QWAmYPZBYEZg9kFgJmDxAPFgYeB0NoZWNrZWRnHglGb3JlQ29sb3IKAB4EXyFTQgIEZGRkZAIBD2QWAgIBDw8WBB8BCgAfAgIEZGQCAw9kFgQCAw8PFgIeBFRleHRlZGQCCQ8PFgIeB1Zpc2libGVoZGQYAgUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgMFElJhZGlvQnV0dG9uX05vcm1hbAUQUmFkaW9CdXR0b25fRXhjZAUQUmFkaW9CdXR0b25fRXhjZAUPQ2FwdGNoYUNvbnRyb2wxDwUkOWMyYjYyOWQtMDgyNC00YTRjLWFmNzctNTZmMTg1YWYxZWNmZG299hEhBw0JMunN7KclbGY%3D
&__EVENTVALIDATION=%2FwEdAAZBOxeKxB2MWCqIdygBFcCjfMmuxAJNAJcNkRRsVeJwwqKURZav%2F%2BYrVMqaWE2hvMxJwK4Ohf3nRgXHkFhQen1PRSciNdPYWmINCrip1wqw01PJCA0uL9aE2sjICZqv6GptBPefDWIwtv6p57V01fAc
&RadioButton_Normal=RadioButton_Normal
&TextBox_Stkno=2330
&CaptchaControl1=48VLK
&btnOK=%E6%9F%A5%E8%A9%A2

當傳送參數設定正確後,]按下 HackBar 上的Execute(X)按鈕,進行POST傳送,正常執行結果會顯示股票代碼的CSV下載點。

不正常執行結果,會出現 "驗證碼已逾期" 的字樣。

有執行成功後,欲下載指定股票代碼檔案CSV,可直接點選網頁上的連結,或是在網址列上輸入以下網址,即可查看或下載指定內容。
查看資料的URL:http://bsr.twse.com.tw/bshtm/bsContent.aspx?v=t
下載資料的URL:http://bsr.twse.com.tw/bshtm/bsContent.aspx

到此已經介紹完如何透過FireFox的附加元件 HackBar,做手動參數設定與POST傳送,如果還有不清楚的地方,請用Line與筆者聯繫瞭解。

注意事項:
1. 使用FireFox的附加元件 HackBar 傳送資料時,請先確認Cookie內容是否已存在,證交所送進來的Cookie。
2. 手動設定變數與POST傳送,同一Cookie可重複使用。
3. 手動設定變數,":"與"="、兩傳送變數需要"&"連結,以上記得要填正確,不然結果會出現不正常執行的回報畫面。
4. 驗證碼有時效限制,要特別注意。
5. 買賣日報表系統太頻繁抓取資料或是F5連續多按幾次,就會發生網頁錯誤無法正常顯示,我們稱為假死狀態,等個5~7秒後再執行即可。
6. 使用程式抓取檔案,要注意Cookie的使用。
7. 最後一個事項恕無法告知。

最後感謝由「iInfo程式與投資應用」群裡兩位工程朋友幫忙使用VC++、Python的執行結果。
使用VC++的清權大大,程式執行有使用Retry機制 + 每次抓取新的Cookie。

使用Python的ark大大,程式執行有使用Retry機制 + 使用同一個Cookie。