2017-02-14 59 views
1

我已經編寫了一個代碼,用於通過谷歌使用vba解析來自多個網站的數據。無論搜索是什麼,它都可以刮掉標籤元素[「h3」和「a」]。但是,如果我所期望的是可能的,我想解析任何搜索的名稱或電話號碼。先謝謝您的幫助。使用vba從多個網站刮取數據

Sub GoogleSearch() 
Dim http As New MSXML2.XMLHTTP60, html As New HTMLDocument, hmm As New HTMLDocument 
Dim topics As Object, post As Object, link As Object, posts As Object 
Dim url As String, z As String 
Dim i As Long, LRow As Long 

LRow = Range("A" & Rows.Count).End(xlUp).Row 

For i = 3 To LRow 
url = "https://www.google.co.in/search?q=" & Cells(i, 1) 

http.Open "GET", url, False 
http.setRequestHeader "Content-Type", "text/xml" 
http.send 

html.body.innerHTML = http.responseText 

Set topics = html.getElementById("rso") 
Set post = topics.getElementsByTagName("H3")(0) 
Set link = post.getElementsByTagName("a")(0) 

Cells(i, 2) = link.innerText 
Cells(i, 3) = link.href 
z = link.href 
    http.Open "GET", z, False 
    http.send 
    hmm.body.innerHTML = http.responseText 
    Set posts = hmm.getElementsByClassName("phone") 
    If Not posts(0) Is Nothing Then 
     Cells(i, 4) = posts(0).innerText 
    Else  
     Cells(i, 4).Value = "Phone Not Found" 
    End If 
Next i 
End Sub 

回答

1

我寫了一個代碼來解析從使用谷歌多個站點的數據。

不完全是。你寫的是非常具體和不靈活的代碼,它需要有一個「電話」類,否則會出現錯誤。一旦你做了這個http.Open "GET", z, False你正在導航到一個新的網站,沒有理由相信說Yellopages和麥當勞會分享甚至遠程相同的結構。在這一點上,你在做什麼是根本沒有足夠的靈活性來處理這(不同)的網站可能採取無限結構:

http.send 
hmm.body.innerHTML = http.responseText 
Set posts = hmm.getElementsByClassName("phone") 
Cells(i, 4) = posts(0).innerText 

當你Set posts = hmm...你假設有必須與類名的元素=「電話」網站你刮。如果不存在這樣的元素,則會引發錯誤(需要對象)。

爲了得到任何元素,你需要知道一些你刮網站的結構,但有幾個方法可以做到這一點:

  1. 你可以使用一個索引通話到getElementsByTagNamegetElementsByClassName(你目前在做什麼),但是這需要你知道的標記名稱或類別名稱
  2. 匹配一些條件,而你遍歷通過getElementsByTagNameExit For返回的集合,如果你的病情發現
  3. 如果您的瀏覽器支持它,您可以使用getElementByID(如果ID標籤可用,它是一個唯一的標識符)
  4. 如果已知,您可以提供該元素的xpath標識符。
  5. 您可以嘗試攝取整個結果,並使用正則表達式從純HTML源中提取電話號碼,這可能是最可靠的情況。

如果您提供了正在解析的網頁的示例源代碼,但是可能更容易給您特定的幫助,但是,由於您顯然試圖抓取各種網站,因此不可能獲得單個解決方案。

我可以做什麼,您的評論跟進是這樣的:

http.Open "GET", z, False 
    http.send 
    hmm.body.innerHTML = http.responseText 

    Set posts = hmm.getElementsByClassName("phone") 
    If posts Is Nothing Then'# This condition is True if no "phone" element exist 
     cells(1,4).Value = "phone not found at " & z 
    Else 
     Cells(i, 4) = posts(0).innerText 
    End If 

Next i 

這將至少運行沒有錯誤,它會識別不包含「手機」類的網址。然後,您可以檢查這些網頁的源HTML,並且可以修改您的代碼以處理其他案例。

您可以嘗試接收整個結果,並使用正則表達式從純HTML源中提取電話號碼,這可能是最可靠的情況。

+0

感謝大衛先生您的明確答案。在我看到您的答案之前,我一直在一次調用中獲取所需的任何信息,我感到非常困惑。在不同的網站,我注意到有人要求我在這裏做同樣的問題。在這一點上,我可以理解深入挖掘的基礎知識,但我很想知道,如果我通過for循環驅動一個錯誤處理程序,我可以在單個子例程中調用至多五到十個站點,或者調用那麼關於列表包含100個或更多搜索。再次感謝主席先生。 – SIM

+0

我用一個簡單的處理程序做了一個小修改,該處理程序將無誤地運行,並且應該標識沒有找到「手機」類的URL。希望這可以幫助你:) –

+0

謝謝先生,你的友善接觸我的雜亂的代碼。也許,你是這麼寫的,這就是爲什麼一些微不足道的錯誤出現在那裏的原因。不過,我已經改正了它。 – SIM