返回列表 上一主題 發帖

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

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

TOP

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



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

TOP

回復 20# white5168

O_p 好啦!我自首----->(PS:自首無罪!!Please)

這VBA學習,常遇到很多生字,一直查資料 + 吸收消化不良
常心生退念--->(發懶)
因為大師的編碼方式對我這初學者來說太深奧了!
就看了前面露露長就眼花撩亂---->不知從何查生字
跳過浪過,就自己搞笑囉!派謝捏!

對了!上市代號取得時,少了兩支;比對結果是
3638  F-IML
3673  F-TPK
當然還看不懂大師作品,不會自行除錯

頁數取得時,若改成postdata擷取原始碼的方式比較快?
看著ie刷了好幾次畫面都取不到頁數
反而在此多卡了些時間

目前先測試代號及頁面取得
其他....還沒消化
Sorry!貽笑大方

TOP

回復 22# white5168
說的好理道出: 下載錯誤點的原因
多謝發表幫大眾解惑

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

回復  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

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

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


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

TOP

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



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

TOP

本帖最後由 GBKEE 於 2012-8-4 17:07 編輯

回復 13# white5168     謝謝你的提醒 指教  
回復 15# c_c_lai           回復 16# HSIEN6001  
white5168  的指教修改如下
  1. Private Function 報表頁數(Sstock_N0 As String)
  2.     Dim element As Object
  3.     On Error GoTo xlerr:
  4. xlAgain:
  5.     Set element = IE.Document.getElementsByName("txtTASKNO")
  6.     element.Item(0).Value = Sstock_N0
  7.     Set element = IE.Document.getElementsByName("btnOK")
  8.     element.Item(0).Click
  9.     With IE
  10.         Do While .Busy Or .ReadyState <> 4
  11.             DoEvents
  12.         Loop
  13.     End With
  14.     Set element = IE.Document.getElementsByName("sp_ListCount")
  15.     報表頁數 = element.Item(0).innertext
  16.     Exit Function
  17. xlerr:        '處裡網頁中斷
  18.     IE.Quit
  19.     網頁
  20.     Err.Clear
  21.     GoTo xlAgain
  22. End Function
複製代碼

TOP

比較像是W大後面敘述的
set物件發生問題時,要進行Retry

先前還笨笨的用
Sleep 4000   '1000豪秒=1秒
去應對

TOP

        靜思自在 : 口說好話、心想好意、身行好事。
返回列表 上一主題