2017-06-01 128 views
0

我知道有類似的問題已經回答,但我不知道如果我不明白如何處理解決方案從其他人的答案或我的網站我需要獲取信息從複雜。所以,請幫助我。從網站檢索數據與VBA Excel

我想從Delphi for PN#13511996得到描述字段,值應該是「3 Way Grey GT 150密封式母連接器組件,最大電流15安培」。有人可以幫助我檢查網站,並讓我知道如何獲得描述?

Sub GetData() 
'Added Microsoft HTML Object library to reff 
'Added Microsoft XML, v6.0 to reff 
    Dim xhr As MSXML2.XMLHTTP60 
    Dim doc As MSHTML.HTMLDocument 
    Dim desc As String 
    Set xhr = New MSXML2.XMLHTTP60 
    With xhr 
     .Open "GET", "http://ecat.delphi.com/feature?search=13511996", False 
     .send 
     If .ReadyState = 4 And .Status = 200 Then 
      Set doc = New MSHTML.HTMLDocument 
      doc.body.innerHTML = .responseText 
     End If 
    End With 
    With doc 
     desc = .getElementsByClassName("ProductDetail.Description").Item(0).innerText 
    End With 

    Debug.Print desc 

End Sub 

回答

0

這是因爲你使用GETXMLHTTP請求原始的HTML。如果您嘗試使用Debug.Print doc.body.innerHTML,則會看到該表格尚未生成,並且您正在查找的文本根本不存在。

爲了能夠運行項目「13511996」的查詢,您需要一個真正的瀏覽器。只有這樣你才能生成你的表並獲取DOM文檔對象。試試下面的代碼:

Sub GetData() 
    Dim aIE As InternetExplorer 
    Dim desc As IHTMLElement 
    Set aIE = New InternetExplorer 
    With aIE 
     .navigate "http://ecat.delphi.com/feature?search=13511996" 
     .Visible = True '----> set it to false if you dont want to see the browser 
    End With 

    Do While (aIE.Busy Or aIE.ReadyState <> READYSTATE_COMPLETE) 
     DoEvents 
    Loop 

    Set desc = aIE.document.getElementsByClassName("DetailAttributes")(0) 

    'Debug.Print desc.innerText '---> prints the whole table data 

    Debug.Print Split(desc.innerText, vbLf)(3) '----> prints the forth data in table 

    Set aIE = Nothing 
    Set desc = Nothing 
End Sub 

而且如果你還計劃自動運行該代碼在多個查詢運行一個循環,你可能想使用:的

Set desc = Nothing 

For i = 1 To 100 
    On Error Resume Next 
    Set desc = aIE.document.getElementsByClassName("DetailAttributes")(0) 
    If Err.Number = 91 Then 
     GoTo Skip 
    End If 
    Exit For 
Skip: 
Application.Wait (Now() + TimeValue("00:00:001")) 
Next i 

代替:

Set desc = aIE.document.getElementsByClassName("DetailAttributes")(0) 

這是因爲有時網頁在完全生成其內容之前似乎已準備就緒。這會導致代碼退出do loop並繼續執行下一個設置desc對象的語句。設置它時不會出現錯誤,因爲代碼將使用以前的DOM文檔對象,並將輸出先前查詢的結果,這是一個錯誤。沒有任何錯誤,你的代碼將運行循環直到結束,並且你的手中會有完全扭曲的輸出,這是浪費時間。

要解決此問題,應事先將對象設置爲nothing,並捕獲錯誤並等待頁面加載到for loop

最後但並非最不重要的一點,如果構建您正在解析的網頁的人知道他們在做什麼,他們可能會保護它免受來自同一來源的多個查詢(很可能來自多個來源)如果他們不這樣做,可能會導致他們的服務器崩潰。這種保護將在有限的時間內作爲有限數量的查詢反映給您。換句話說,例如在5分鐘內100次請求之後,網頁在某個時間(例如2分鐘)不會響應。

要解決此問題,您應該限制請求的數量並等待所需的時間。假設你用i變量增加你的循環。然後,你需要在你的循環末尾插入這樣的:

If i Mod 100 = 0 Then 
    Application.Wait (Now() + TimeValue("00:02:00")) 
End If 

我希望上述方案解決每個人的過去和未來的問題,這花費了我大量的時間來弄清楚。

+0

非常感謝您的解決方案,我非常感謝有見解的解釋是什麼導致了這個問題。 – user7226

+0

你能否幫我獲得相關產品?我試圖找到它的ID或ClassID,但他們都沒有給我的名單 – user7226

+0

@ user7226我會檢查它,當我有時間 – Tehscript