返回列表 上一主題 發帖

證交所全部上市股票交易明細下載

證交所全部上市股票交易明細下載

花了一些時間以Excel VBA寫了一個下載交易明細Debug version,主要在做時間的優化處理,Release version可能需要再多點時間進行參數final duel
現在附上使用python與Excel VBA執行完成的圖案,python執行的時間2603秒,Excel VBA執行時間7598秒(未優化前),兩者相差約2.9倍
這兩個都是在有線網路20M/4M, 雙核心雙執行緒2G Hz CPU, 4G RAM, XP OS SP3規則所跑出來的結果
也試過在無線3.5G, i7四核心8執行緒 2.3G Hz CPU, 4G RAM, win7 OS SP1跑出約相差4倍的差距,所以如果執行環境越差,跑出來的結果相差越大
目前經過幾天的壓力測試,結果在可接受的範圍內,雖然已經努力進行優化了,但整體花費時間比起python的時間,仍需要做優化
至於下載明細所儲存的檔案格式在之後如使用者有需要再做調整

目前該Excel VBA 交易明細.xls 為V1.0.0.1 T01
其功能如下
1.開啟時會自動將當天的日期設定,並將欲取得的上市股票ID編號重頭開始(這裡是2)
2.下載儲存交易明細日期與上市股票ID編號,可自行設定
3.當資料取得過程發生在某一個網頁有問題時,會自動記錄,以供再次下載有問題股票之用
4.當網頁開啟有問題時,及遠端證交所伺服器過忙碌時,將會進行Retry直到取得資料
5.當Retry 5次無法下載市股票ID的總頁數網頁時,會記錄該日期與股票以供參考
6.自動記錄有交易日期各股票在證交所網頁上的總頁數
7.會自動將股票ID與交易明細儲存為CSV檔

由於是Debug version,若是使用上有任何問題歡迎提出或是需要添加何種功能也可以提出討論

python_20120801.JPG (217.33 KB)

Python_20120801

python_20120801.JPG

ExcelVBA_20120801.JPG (232.55 KB)

ExcelVBA_20120801

ExcelVBA_20120801.JPG

交易明細.rar (189.27 KB)

回復  HSIEN6001


    附註斷點:    報表頁數 = element.Item(0).innertext
HSIEN6001 發表於 2012-8-4 12:06



這個問題在我的程式碼裡有防範了,原因很簡單,有的時候使用set物件時,如果IE沒有開完整,將會導致無法取得對應的物件,此時便會發生無法取得頁數的問題,看來關於這一點,版主要再多try一下,這個發生點不是每次都會發生在相同的位置,應該多增加防範,如果無法順利取得頁數或是set物件發生問題時,要進行Retry

TOP

回復  white5168     謝謝你的提醒 指教  
回復  c_c_lai           回復  HSIEN6001  
white5168  的指教 ...
GBKEE 發表於 2012-8-4 15:19



  說指教是不敢當,相互討論學習

TOP

回復  white5168

扼脕!又斷了
我的3.5G這麼不穩!

其實W大的,我一直都不能正常使用
末學還有很多看 ...
HSIEN6001 發表於 2012-8-4 14:51


看code不要只看一半,請注意Sheet1(股票代碼) FilePath = "D:\Test\" 的路徑,看看你自己的電腦是否有D槽的存在,如果沒有請自行修改

TOP

回復  white5168

G大這裡指令很完整,應該不是頁數回覆問題 (我也測試過這個頁面回覆)
        Do Whil ...
HSIEN6001 發表於 2012-8-4 15:01



    又只看一半的code
        Do While .Busy Or .readyState <> IE_READYSTATE.READYSTATE_COMPLETE
            DoEvents
        Loop
        
        Do
            DoEvents
        Loop Until .document.readyState = "complete"
以上的程式碼要跑完,網頁才算是開完全

TOP

回復  white5168     謝謝你的提醒 指教  
回復  c_c_lai           回復  HSIEN6001  
white5168  的指教 ...
GBKEE 發表於 2012-8-4 15:19
  1. Sub 取得交易明細總頁數()
  2.     Dim myTime
  3.     Dim Retry As Integer
  4.    
  5.     Set IE = CreateObject("InternetExplorer.Application")

  6.     strLink = "http://bsr.twse.com.tw/bshtm/bsMenu.aspx"
  7.    
  8.     Retry = 0
  9.    
  10.     Do
  11.         Do
  12.             Do
  13.                 Do
  14.                     Do
  15.                         網頁開啟完成與否
  16.                         On Error Resume Next
  17.                         Set doc = IE.document
  18.                         On Error GoTo 0
  19.                     Loop While doc Is Nothing
  20.                     Set element = doc.getElementsByName("txtTASKNO")
  21.                  Loop While element.Length = 0
  22.                  element.Item(0).Value = stockid
  23.                  Set element = doc.getElementsByName("btnOK")
  24.             Loop While element.Length = 0
  25.             element.Item(0).Click
  26.             
  27.             Application.Wait Now + TimeValue("00:00:02")
  28.             
  29.             Set element = doc.getElementsByName("sp_ListCount")
  30.             'Set element = doc.getElementsByTagName("span")
  31.         Loop While element.Length = 0
  32.     Pagecount = element.Item(0).innerText
  33.     Retry = Retry + 1
  34.    
  35.     If Retry = 5 Then Exit Do
  36.     Loop While Pagecount = ""  
  37.    
  38.     Set doc = Nothing
  39.     Set element = Nothing
  40.     IE.Quit
  41.     Set IE = Nothing
  42. End Sub
複製代碼
我在這一段code裡作的多重防範,因為未來各位抓資料的時候可能是在尖峰時段,就是大家一起抓資料,會導致遠端伺服器的服務資源大家搶,如果只單單一次性抓總頁數,一定會發生抓不道的時候,所以才要多做幾道手續
再者我也擔心,因為VBA 沒有try...cash的語法,所以除了多家擠到防護,再來就是記錄每一筆抓取的ID,當錯誤發生的時候才有機會可以再重斷點開始抓取,而不是重頭
在抓證交所資料時,時常會被證交所的防火牆強制斷出,需為這個部分多加幾道防護才行,因此這一點請各位務必多多注意

TOP

執行這個程式抓的資料量大,是否證交所會偵測而中斷下載呢?
funnydisk 發表於 2012-8-4 19:27



證交所其實有在偵測是否有人用程式在抓取資料,這一點可用python回到的結果更明顯清楚的看到,因為每當資料長時間讀取時,證交所的防火牆就會讓同一組IP強制斷開,好讓其他人可以使用,其實各位也可以清楚資料,怎嚜測試呢?就在每天各交易日的下午17:30開始就會有人開始抓取資料,尖峰時段8:30~13:30.再這段時間理,可以自行連結去查詢,就會發現網頁無法正常開啟,而且這樣的狀況會持續到23~23:30慢僈地恢復正常,不過有鑑佣常事抓資料大有人在,他們也在改變政策,目前有聽說將會在9月份多提供付費的CSV檔,大家可以期待

TOP

對VBA有興趣者但沒什呢基礎者可以參考http://forum.twbts.com/viewthread.php?tid=7356&extra=

TOP

回復  white5168


    猴。。。。。突然意會過來,先前這樣測試
W大這支,光在這裡http://bsr.twse.co ...
HSIEN6001 發表於 2012-8-4 21:37


請回第一頁我ㄧ開始PO文的內容,請仔細詳讀功能,文字說明的很清楚會Retry幾次?請再把code讀清楚

TOP

回復  white5168


    沒錯呀!測試結果如同你寫的
當網頁開啟有問題時,及遠端證交所伺服器過忙碌時,將 ...
HSIEN6001 發表於 2012-8-4 22:34


如果交易"0"頁的話,在長度上依然可以取得頁數,就是0頁,只有在不存在的股票代碼上才沒有物件的長度,如此才會不斷的Retry
基本上這是抓頁數,可以抓到的話一次就可以抓到,而會像你說的發生塞車的話,這比較像使用暴力法一頁一頁的抓交易明細才有機會發生
如果你覺得Retry次數太多,那就自行修改,我經過壓力測試也沒你說的issue我的作法是確保資料完完整整的抓下來,如果你堅持覺得有不妥
可自行選用版主的作法,我這樣樣Retry的作法暫時不會動,現在只會去做優化的動作,如果你真的有試到容易複製的issue,那也請完完整整的漿過程全部PO文上來
包含,做了什麼動作,流程,股票代碼,在什麼樣的環境,什麼樣的交易日的時間點等,以上這些都很重要

TOP

        靜思自在 : 原諒別人就是善待自己。
返回列表 上一主題