2014-02-12 2 views
1

이 페이지에서 테이블 데이터를 스크래핑하는 데 문제가 있습니다. [http://www.eex.com/en/market-data/power/derivatives-market/phelix-futures]. 이 코드를 사용하지만 데이터 긁어하지 않습니다XMLHTTP 개체를 기반으로 VBA를 사용하여 동적 웹 페이지를 긁음

Public Sub ScrapTableData() 
    Dim sURL As String 
    Dim XMLHttpRequest As XMLHTTP 
    Dim HTMLDoc As New HTMLDocument 
    Dim elc As HTMLHtmlElement 
    Dim i As Integer 

    sURL = "http://www.eex.com/en/market-data/power/derivatives-market/phelix-futures" 

    Set XMLHttpRequest = New MSXML2.XMLHTTP 
    XMLHttpRequest.Open "GET", sURL, False 
    XMLHttpRequest.responseXML.async = False 
    XMLHttpRequest.send 

    Do While XMLHttpRequest.Status <> 200 
     DoEvents 
    Loop 
    While XMLHttpRequest.ReadyState <> 4 
     DoEvents 
    Wend 

    HTMLDoc.body.innerHTML = XMLHttpRequest.responseText 

    ' Tables 
    Dim tbl As HTMLTable, row As HTMLTableRow, cell As HTMLTableCell 
    i = 1 
    For Each tbl In HTMLDoc.getElementsByTagName("table") 
     For Each row In tbl.Rows 
      For Each cell In row.Cells 
       ActiveSheet.Cells(i, 5) = cell.innerText 
       i = i + 1 
      Next 
     Next 
    Next 
End Sub 

내 코드는 HTML에게 table 태그를 찾을하지 않습니다. , 연도, 분기, 월 :

i = 0 
Dim elc As HTMLHtmlElement 
For Each elc In HTMLDoc.all 
    Worksheets("Tables").Range("A1").Offset(i, 0) = elc.tagName 
    i = i + 1 
Next 

6 버튼 : 나는 코드의이 부분을 사용하는 경우

또한, 6 개 버튼을 설명하고 HTML (예를 들어, HTML DIV 태그) 모든 HTML 태그를 나열하지 않습니다 ..., 일

서로 다른 테이블의 데이터를 표시 (긁어 내기)하려면 시뮬레이션을해야합니다.

+0

데이터가로드 한 후 페이지에 동적으로 추가됩니다 도움이되기를 바랍니다 - XMLHTTP은 초기 페이지 소스를 가져옵니다 때문에,이 같은 페이지를 긁어 그 방법을 사용할 수 없습니다 : 그것은 동적 업데이트를 수행하지 않습니다. 대신 IE를 자동화하십시오. –

답변

1

XMLHTTP 접근 방식이이 경우 작동하지 않는다고 생각하면 IE를 열어야합니다. 다음 코드는이를 수행합니다. 워크 시트에 데이터를 넣기 위해 루프를 수정해야 할 수도 있습니다. 나는 이것을 수정하지 않았습니다. 마지막으로 탭을 변경할 일부 코드도 배치했습니다. 이

Sub test() 
' open IE, navigate to the website of interest and loop until fully loaded 
    Set IE = CreateObject("InternetExplorer.Application") 
    my_url = "http://www.eex.com/en/market-data/power/derivatives-market/phelix-futures" 

    With IE 
     .Visible = True 
     .navigate my_url 
     .Top = 50 
     .Left = 530 
     .Height = 400 
     .Width = 400 

    Do Until Not IE.Busy And IE.readyState = 4 
     DoEvents 
    Loop 

    End With 

' Collect data from tables 
    Set tbl = IE.document.getElementsByTagName("table") 
    For Each itm In tbl 
     i = 1 
     For Each itm2 In itm.Rows 
      For Each cell In itm2.Cells 
       ActiveSheet.Cells(i, 5) = cell.innertext 
       i = i + 1 
      Next 
     Next 
    Next 

' Click on the 6 buttons, substitute "week", "year", etc. for the button you want to click 
    Set Results = IE.document.getElementsByTagName("a") 
    For Each itm In Results 
     If InStr(1, itm.innertext, "month", vbTextCompare) > 0 Then 
      itm.Click 

      Do Until Not IE.Busy And IE.readyState = 4 
       DoEvents 
      Loop 
      Exit For 
     End If 
    Next 

' Do whatever is next 

End Sub 
+0

감사합니다. 네, 저도 압니다. 나는 IE와 일을 함께했지만, XMLHTTP를 더 선호한다. 많은 사람들이 JSON 등도 선호하지만, 나는 JS에 익숙하지 않다. 또 다시 감사한다. – Figlio

관련 문제