Board logo

標題: [發問] 鉅亨網 技術指標 VBA抓取問題 [打印本頁]

作者: espionage    時間: 2016-1-26 18:06     標題: 鉅亨網 技術指標 VBA抓取問題

本帖最後由 GBKEE 於 2016-2-18 13:17 編輯

請問各位先進

小弟在鉅亨網 技術指標 股價創新高 抓取資料
現在遇到一個問題:雖然可以抓下網頁資料,但是有時間差的問題
讀取網頁資料http://www.cnyes.com/twstock/a_technical2.aspx
網頁會開啟當天的資料,比方今天 (1/26),如果要往前抓幾天的資料,有一個選項可以改變日期,我也用VBA改變語法
但是因為網頁執行還需要時間,這會導致比方我輸入 (1/25)的選項,雖然網頁讀取完畢,也顯示1/25的data,但是VBA卻還是抓到一開始 (1/26)的網頁資料
語法如下,還請高手指點
感謝

For mysearchrange = 2 To 3  '設定要尋找的日期
mysearchdate = Sheets("總表").Cells(mysearchrange, 5).Value

With CreateObject("InternetExplorer.Application")
.Visible = True
.Navigate "http://www.cnyes.com/twstock/a_technical2.aspx"
Do While .Busy Or .readyState <> 4: DoEvents: Loop

With .document

'--------------------輸入要查詢的股票市場
   For Each A In .getelementsbytagname("SELECT")
     If A.Name = "ctl00$ContentPlaceHolder1$D1" Then
       For Each myopt In A.Options
           If myopt.innertext = "集中市場" Then
               myopt.Selected = True
               Exit For
           End If
          Next
          Exit For
       End If
    Next

'-------------------輸入要查詢的日期範圍
  
   For Each B In .getelementsbytagname("SELECT")
     If B.Name = "ctl00$ContentPlaceHolder1$D3" Then
       For Each myopt In B.Options
           If myopt.innertext = mysearchdate Then
               myopt.Selected = True
               B.fireEvent ("onchange")
               Exit For
           End If
          Next
          Exit For
       End If
    Next

End With

Do While .Busy Or .readyState <> 4: DoEvents: Loop
Application.Wait Now + #12:00:10 AM#   '在程式中'等候10秒

'-------------------將查詢結果複製到 Excel上
作者: kim223824    時間: 2016-2-13 15:23

如果要等待網頁資料下載完整後,再執行抓取資料程式碼,中間都要加以下程式碼
Do While .Busy Or .readyState <> 4: DoEvents: Loop               '這段是網頁下載完成後再執行下一行
這樣就不會抓到其他錯誤的資料。
作者: GBKEE    時間: 2016-2-14 09:34

回復 1# espionage
Application.Wait Now + #12:00:10 AM#   '在程式中'等候10秒
等候10秒 不一定等的到
  1. Option Explicit
  2. Sub Ex()
  3.     Dim mysearchrange As Integer, mysearchdate As String, xR As Integer, xC As Integer
  4.     Dim xTable As Object, A As Object, C As Object, myopt As Object
  5.     For mysearchrange = 2 To 3  '設定要尋找的日期
  6.         mysearchdate = Sheets("總表").Cells(mysearchrange, 5)  '日期格式 yyyy-mm-dd
  7.         With CreateObject("InternetExplorer.Application")
  8.             .Visible = True
  9.             .Navigate "http://www.cnyes.com/twstock/a_technical2.aspx"
  10.             Do While .Busy Or .readyState <> 4: DoEvents: Loop
  11.             With .Document
  12.                 '--------------------輸入要查詢的股票市場
  13.                 For Each A In .getElementsByTagName("SELECT")
  14.                     If A.Name = "ctl00$ContentPlaceHolder1$D1" Then
  15.                         For Each myopt In A.Options
  16.                             If myopt.innertext = "集中市場" Then
  17.                                 myopt.Selected = True
  18.                                 GoTo SeLe1
  19.                             End If
  20.                         Next
  21.                     End If
  22.                 Next
  23. SeLe1:         '-------------------輸入要查詢的日期範圍
  24.                 For Each A In .getElementsByTagName("SELECT")
  25.                     If A.Name = "ctl00$ContentPlaceHolder1$D3" Then
  26.                         For Each myopt In A.Options
  27.                             If myopt.innertext = mysearchdate Then
  28.                                 myopt.Selected = True
  29.                                 A.fireEvent ("onchange")
  30.                                 GoTo SeLe2
  31.                             End If
  32.                         Next
  33.                     End If
  34.                 Next
  35. SeLe2:
  36.             End With
  37.             Do While .Busy Or .readyState <> 4: DoEvents: Loop
  38.             Do Until InStr(.Document.getElementByid("ctl00_ContentPlaceHolder1_UpdatePanel1").innertext, mysearchdate)
  39.                 '等候下載:指訂日期資料
  40.                 DoEvents
  41.             Loop
  42.             Set xTable = .Document.getElementsByTagName("TABLE")(1)
  43.             ActiveSheet.UsedRange.Clear
  44.             For Each A In xTable.Rows   'Table的Rows物件集合
  45.                 xR = xR + 1                 '下一列號
  46.                 xC = 1
  47.                 For Each C In A.Cells       'Table的Row物件的Cells物件集合
  48.                     Cells(xR, xC) = C.innertext
  49.                     xC = xC + 1
  50.                 Next
  51.             Next
  52.         End With
  53.     Next
  54. End Sub
複製代碼

作者: espionage    時間: 2016-2-15 16:14

Hi GBKEE大大

請問您是不是把Application.Wait Now + #12:00:10 AM#   '在程式中'等候10秒 這一句語法修改成
==============================
Do Until InStr(.Document.getElementByid("ctl00_ContentPlaceHolder1_UpdatePanel1").innertext, mysearchdate)
'等候下載:指訂日期資料
DoEvents
Loop
============================================================


而以下這一段語法,是屬於抓網頁的table資料,對嗎? (不知我的理解是否正確,還請指教)
============================================================
42.            Set xTable = .Document.getElementsByTagName("TABLE")(1)

43.            ActiveSheet.UsedRange.Clear

44.            For Each A In xTable.Rows   'Table的Rows物件集合

45.                xR = xR + 1                 '下一列號

46.                xC = 1

47.                For Each C In A.Cells       'Table的Row物件的Cells物件集合

48.                    Cells(xR, xC) = C.innertext

49.                    xC = xC + 1

50.                Next

51.            Next




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