返回列表 上一主題 發帖

[原創] 集保資料(改版後)

[原創] 集保資料(改版後)

最近集保網站改版,因此寫了此程式,但只是粗略地把資料抓下來,沒有多加整理

若有幫助到您,希望您在下方留個言讓我知道喔:loveliness:

個人不太喜歡IE法,所以用的是WinHttpRequest,速度快很多
  1. Sub test()

  2. Cells.Clear

  3. Dim myXML As Object
  4. Set myXML = CreateObject("WinHttp.WinHttpRequest.5.1")

  5. Dim myHTML As Object
  6. Set myHTML = CreateObject("HTMLFile")

  7. With myXML
  8.     .Open "POST", "https://www.tdcc.com.tw/smWeb/QryStockAjax.do", False    '先抓取日期
  9.     .setRequestHeader "Content-type", "application/x-www-form-urlencoded;charset=UTF-8"
  10.     .send "REQ_OPR=qrySelScaDates"
  11.    
  12.     myText = .responseText
  13.     myText1 = Split(myText, ",")
  14.     k = 1
  15.     For Each myText2 In myText1
  16.         Cells(1, k) = Replace(myText2, Chr(34), "")
  17.         Cells(1, k) = Replace(Cells(1, k), "[", "")
  18.         Cells(1, k) = Replace(Cells(1, k), "]", "")
  19.         k = k + 1
  20.     Next
  21.    
  22.     i = 6
  23.    
  24.     For Each myDate In Range("A1:BH1").Value
  25.         
  26.         .Open "POST", "https://www.tdcc.com.tw/smWeb/QryStockAjax.do", False    '代入日期撈資料
  27.         .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
  28.         .send "scaDates=" & myDate & "&scaDate=" & myDate & "&SqlMethod=StockNo&StockNo=2330&StockName=&REQ_OPR=SELECT&clkStockNo=2330&clkStockName="
  29.       
  30.         myHTML.body.innerHTML = .responseText
  31.    
  32.         Set myTable = myHTML.getElementsByTagName("table")(7)
  33.         
  34.         For Each myRow In myTable.Rows
  35.             j = 1
  36.             For Each myCell In myRow.Cells
  37.                 Cells(i, j) = myCell.innerText
  38.                 j = j + 1
  39.             Next
  40.             i = i + 1
  41.         Next
  42.         i = i + 5
  43.         L = L + 1
  44.         If L > 10 Then Exit For '要抓幾筆資料
  45.     Next
  46.    
  47. End With
  48. Set myXML = Nothing
  49. Set myHTML = Nothing

  50. End Sub
複製代碼
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

回復 2# joey0415

感謝你的分享,您提供的網站真的很棒,只是小弟真的很缺乏每周都去抓資料的毅力XD
QueryTable也不錯,因為這個網站資料較少,所以可以執行很快,但如果碰到很龐大的資料時可能就會跑很久,所以不知不覺就養成用XMLHTTP抓資料的習慣了
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 3# cji3cj6xu6


例如說可以在B3儲存格輸入股票代號,然後指定給變數,長這樣
stockno=[B3]
或是用inputbox
stockno=inputbox("請輸入股票代號")

接著把原程式碼的第32行改成
.send "scaDates=" & myDate & "&scaDate=" & myDate & "&SqlMethod=StockNo&StockNo=" & stockno & "&StockName=&REQ_OPR=SELECT&clkStockNo=" & stockno & "&clkStockName="
把原本的2330用變數取代,記得字串跟變數要用&連接
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 9# bhsm
  1. Sub test()

  2. stockno = InputBox("請輸入股票代號")
  3. If stockno = "" Then Exit Sub
  4. Application.ScreenUpdating = False
  5. [A4].CurrentRegion.Clear

  6. t = Timer

  7. Dim myXML As Object
  8. Set myXML = CreateObject("WinHttp.WinHttpRequest.5.1")

  9. Dim myHTML As Object
  10. Set myHTML = CreateObject("HTMLFile")

  11. myLimit = 10 '近幾筆資料數

  12. ReDim myDateArr(1 To 60, 1 To 1)
  13. ReDim myValArr(1 To 25, 1 To myLimit * 5)

  14. With myXML
  15.     .Open "POST", "https://www.tdcc.com.tw/smWeb/QryStockAjax.do", False    '先抓取日期
  16.     .setRequestHeader "Content-type", "application/x-www-form-urlencoded;charset=UTF-8"
  17.     .send "REQ_OPR=qrySelScaDates"
  18.    
  19.     k = 1
  20.     For Each myText2 In Split(.responseText, ",")
  21.         myDateArr(k, 1) = Replace(Replace(Replace(myText2, Chr(34), ""), "[", ""), "]", "")
  22.         k = k + 1
  23.     Next
  24.    
  25.     mycount = 1
  26.     For Each myDate In myDateArr
  27. retry:
  28.         .Open "POST", "https://www.tdcc.com.tw/smWeb/QryStockAjax.do", False    '代入日期撈資料
  29.         .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
  30.         .send "scaDates=" & myDate & "&scaDate=" & myDate & "&SqlMethod=StockNo&StockNo=" & stockno & "&StockName=&REQ_OPR=SELECT&clkStockNo=" & stockno & "&clkStockName="
  31.         
  32.         If InStr(1, .responseText, "無此資料") <> 0 Then GoTo retry
  33.         
  34.         myHTML.body.innerHTML = .responseText
  35.         
  36.         Set mytable = myHTML.getElementsByTagName("table")(7)
  37.         
  38.         i = 1
  39.         
  40.         For Each myRow In mytable.Rows
  41.             
  42.              j = 5 * (myLimit - mycount) + 1
  43.             For Each myCell In myRow.Cells
  44.                 myValArr(i, j) = myCell.innerText
  45.                 j = j + 1
  46.             Next
  47.             i = i + 1
  48.         Next
  49.         Cells(4, j - 5) = myDate
  50.         Debug.Assert Cells(4, j - 4) = ""
  51.         mycount = mycount + 1
  52.         If mycount = myLimit + 1 Then Exit For '要抓幾筆資料
  53.     Next
  54. [A3] = "證券名稱:" & Split(Split(.responseText, "證券名稱:")(1), "<")(0)
  55. [A5].Resize(UBound(myValArr), 5 * myLimit).Value = myValArr

  56. End With

  57. Erase myDateArr
  58. Erase myValArr
  59. Set myXML = Nothing
  60. Set myHTML = Nothing

  61. Debug.Print Format(Timer - t, "0.00秒")
  62. Application.ScreenUpdating = True
  63. End Sub
複製代碼
試看看這個吧~
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

本帖最後由 iamaraymond 於 2018-3-28 22:02 編輯

回復 10# quickfixer

這個文之前我也有看過,Snare大的程式當然比我這種門外漢強很多XD
只是我比較習慣把每一周都列出來,所以若您有興趣的話可以看看我剛剛新放上去的貼文
至於速度在其他條件差不多的情況下,主要是取決於發了多少Request,在他的code中只抓了2個禮拜的資料,但我抓了10個禮拜的,所以速度會比較慢
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 7# cji3cj6xu6


問題1:我剛剛新上傳了Code,可以參考看看
問題2:因為我沒遇到這個狀況,所以不確定

至於要跳著抓其實方法很多,例如用if設定計數器0和1,當等於1時才抓
或是判斷L是不是偶數之類的
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

本帖最後由 iamaraymond 於 2018-3-28 22:21 編輯

回復 14# quickfixer

你們的錯誤是不是"安全通道支援發生錯誤 "?
如果是的話,我之前好像有看到有個解決方法是
打開註冊表(搜尋regedit)
   

然後依據電腦情況
(for Windows 7 64 bits)
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000a00

(for Windows 7 32 bits)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000a00

參考看看

增加速度還有個方法是用陣列,速度真的差很多,原本要跑3,4秒的東西都只要0.X秒就好了XD
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

        靜思自在 : 屋寬不如心寬。
返回列表 上一主題