Board logo

標題: [發問] 使用 msXML2.xmlHTTP 取得股票交易資料 [打印本頁]

作者: Scott090    時間: 2017-6-26 18:05     標題: 使用 msXML2.xmlHTTP 取得股票交易資料

請問大師前輩如何以 xmlhttp 的方法取得網頁中如下圖的資料:
[attach]27382[/attach]
  1. Sub WebData()
  2.     Dim strURL$
  3.     Dim respAA
  4.     strURL = "https://tw.stock.yahoo.com/q/q?s=2330" '網頁地址
  5.     [A1].CurrentRegion = ""
  6.     Dim oXmlhttp As Object, oHtmldoc As Object
  7.     Set oXmlhttp = CreateObject("msxml2.xmlhttp")
  8.     Set oHtmldoc = CreateObject("htmlfile")
  9.     With oXmlhttp
  10.         .Open "Get", strURL, False
  11.         .send
  12.         
  13.         '-------------------------------------------------
  14.         '如何取得網頁中的表格資料?
  15.         '及 表格中 第3欄第2列資料?
  16.         '-------------------------------------------------
  17.         
  18.         
  19.     End With
  20. End Sub
複製代碼
非常感恩
作者: Scott090    時間: 2017-6-30 05:40

回復 1# Scott090


請問那一位高手願意協助

網頁地址如下:l   
https://tw.stock.yahoo.com/q/q?s=2330

謝謝
作者: prin.huang    時間: 2017-6-30 15:18

提供自己寫的讀取table程式碼,但套用到你提供的網頁,table讀出來只有1個欄位,如下圖
"股票
代號時間成交買進賣出漲跌張數昨收開盤最高最低個股資料
2330台積電
加到投資組合
14:30208.5208.0208.5▽1.5 30,867210.0206.5208.5206.5成交明細
技術 新聞
基本 籌碼
個股健診"

不知有高手有方法解決嗎?
  1. Sub main()
  2. Dim URL$, VV As Boolean, AB() As String

  3. URL = "https://tw.stock.yahoo.com/q/q?s=2330"
  4. AB = GetWebTb1(URL, 6, 1, 1, VV)
  5. If VV = True Then ActiveSheet.Range("A1") = AB

  6. End Sub

  7. Private Function GetWebTb1(sURL00$, nTT00%, nRR00%, nCC00%, bRd00 As Boolean)
  8. '===sURL00      為擷取網址
  9. '===nTT00       為讀取第幾個Table(從1開始)
  10. '===nRR00       該Table由第幾列開始讀取(從1開始)
  11. '===nCC00       該Table由第幾欄開始讀取(從1開始)
  12. '===bRd00       該資料是否輸出
  13. Dim nR00%, nC00%, sTemp() As String, oXml As Object, oDoc As Object, oE As Object, tt As Date
  14.     Set oXml = CreateObject("MSXML2.XMLHTTP.6.0")
  15.     Set oDoc = CreateObject("HTMLFile")
  16.     bRd00 = True
  17. rSend:
  18.     tt = Now() + TimeValue("0:00:20")
  19.     With oXml
  20.         .Open "Get", sURL00, True
  21.         .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
  22.         .send
  23.         On Error Resume Next
  24.         Do While .ReadyState <> 4 Or .Status <> 200
  25.             DoEvents
  26.             If Now > tt Then GoTo rSend
  27.         Loop
  28.         On Error GoTo 0
  29.         oDoc.write .responseText
  30.     End With
  31.     If oDoc.all.tags("Table")(nTT00 - 1) Is Nothing Then bRd00 = False: GoTo Err1
  32.     Set oE = oDoc.all.tags("Table")(nTT00 - 1)
  33.     With oE
  34.         ReDim sTemp(.Rows.Length - nRR00, .Rows(nRR00 - 1).Cells.Length - nCC00)
  35.         For nR00 = 0 To .Rows.Length - nRR00
  36.             For nC00 = 0 To .Rows(nR00 + nRR00 - 1).Cells.Length - nCC00
  37.                 sTemp(nR00, nC00) = .Rows(nR00 + nRR00 - 1).Cells(nC00 + nCC00 - 1).innerText
  38.             Next nC00
  39.         Next nR00
  40.     End With
  41. Err1:
  42.     GetWebTb1 = sTemp
  43.     oXml.abort
  44.     oDoc.Close
  45.     Set oXml = Nothing
  46.     Set oDoc = Nothing
  47.     Set oE = Nothing
  48. End Function
複製代碼

作者: Scott090    時間: 2017-6-30 17:59

回復 3# prin.huang


    非常感恩
提供的code 足當一個 sample, 將好好的研讀,不解之處再請益就教

再次的謝謝
作者: GBKEE    時間: 2017-7-1 08:01

  1. Option Explicit
  2. Sub Ex()
  3.     Dim oXmlhttp As Object, oHtmldoc As Object, surl As String, E As Object, R As Integer, C As Integer
  4.     Set oXmlhttp = CreateObject("msxml2.xmlhttp")
  5.     Set oHtmldoc = CreateObject("htmlfile")
  6.     surl = "https://tw.stock.yahoo.com/q/q?s=2330"
  7.         With oXmlhttp
  8.         .Open "Get", surl, False
  9.         .Send
  10.         oHtmldoc.write .responseText
  11.     End With
  12.     ActiveSheet.Cells.Clear
  13.      With oHtmldoc
  14.         Set E = .all.tags("table")(6)
  15.         For R = 0 To E.Rows.Length - 1
  16.             For C = 0 To E.Rows(R).Cells.Length - 1
  17.                 ActiveSheet.Cells(R + 1, C + 1) = E.Rows(R).Cells(C).INNERTEXT
  18.             Next
  19.         Next
  20.         ActiveSheet.Cells(R + 1, 1) = Trim(.all.tags("table")(4).INNERTEXT)
  21.     End With
  22. End Sub
複製代碼
回復 4# Scott090
作者: Scott090    時間: 2017-7-1 09:42

回復 5# GBKEE


    太好了,又得到超級版主的大作
自當好好的研習

感謝
作者: Scott090    時間: 2017-7-1 21:28

回復 3# prin.huang

Sub main() 作修飾如下,請參考
  1. Sub main()
  2. Dim URL$, VV As Boolean, AB() As String

  3. URL = "https://tw.stock.yahoo.com/q/q?s=2330"

  4. 'AB = GetWebTb1(URL, 6, 1, 1, VV)
  5. 'If VV = True Then ActiveSheet.Range("A1") = AB

  6. AB = GetWebTb1(URL, 7, 1, 1, VV)    '目標表格由1開始計算是第7個
  7. If VV = True Then ActiveSheet.Range("A1").Resize(UBound(AB, 1) + 1, UBound(AB, 2) + 1) = AB     'AB陣列放入工作表儲存格

  8. End Sub
複製代碼

作者: prin.huang    時間: 2017-7-4 14:20

回復 7# Scott090

謝啦!從你的code多約會了resize這個用法,好用!
原來我table數錯了,是第七個,不是第六個,
其實我不會數到底是第幾個table,
我是土法煉鋼一個一個輸出,看到底是要那一個table,
結果還是敗在這,不知有沒有較有效率的方法呢?
作者: Scott090    時間: 2017-7-5 08:56

回復 8# prin.huang


    用 QueryTables的方式攫取網頁資料,錄製程式碼,
程式碼內 .WebTables = "7" 就是由1算起排行第7個表格
  1. Sub 巨集1()
  2. '
  3. ' 巨集1 巨集
  4. '

  5. '
  6.     With ActiveSheet.QueryTables.Add(Connection:= _
  7.         "URL;https://tw.stock.yahoo.com/q/q?s=2330", Destination:=Range("$A$1"))
  8.         .Name = "q?s=2330_1"
  9.         .FieldNames = True
  10.         .RowNumbers = False
  11.         .FillAdjacentFormulas = False
  12.         .PreserveFormatting = True
  13.         .RefreshOnFileOpen = False
  14.         .BackgroundQuery = True
  15.         .RefreshStyle = xlInsertDeleteCells
  16.         .SavePassword = False
  17.         .SaveData = True
  18.         .AdjustColumnWidth = True
  19.         .RefreshPeriod = 0
  20.         .WebSelectionType = xlSpecifiedTables
  21.         .WebFormatting = xlWebFormattingNone
  22.         .WebTables = "7"            '顯示所要的資料表格是第7個
  23.         .WebPreFormattedTextToColumns = True
  24.         .WebConsecutiveDelimitersAsOne = True
  25.         .WebSingleBlockTextImport = False
  26.         .WebDisableDateRecognition = False
  27.         .WebDisableRedirections = False
  28.         .Refresh BackgroundQuery:=False
  29.     End With
  30.     ActiveWorkbook.Connections("連線").Delete
  31. End Sub
複製代碼
以上,請參考
謝謝
作者: Scott090    時間: 2017-7-14 08:35

發現這個網站很精彩,主題是:
"ImportXML, GoogleLookup alternatives for Excel"
http://www.ideativi.it/blog/532/importxml_googlelookup_alternatives_for_excel.aspx

內含一個EXCEL檔可供參考:
" •16/09/2013 importxml.1.10.xlsx (first public release)"

以上分享




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)