使用vba从多个站点抓取数据

使用vba从多个站点抓取数据,vba,web-scraping,Vba,Web Scraping,我已经编写了一段代码,通过谷歌使用vba解析来自多个站点的数据。无论搜索是什么,它都可以刮取标记元素[“h3”和“a”]。但是,如果可能的话,我想解析任何搜索的名称或电话号码。提前谢谢你的帮助 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 Obje

我已经编写了一段代码,通过谷歌使用vba解析来自多个站点的数据。无论搜索是什么,它都可以刮取标记元素[“h3”和“a”]。但是,如果可能的话,我想解析任何搜索的名称或电话号码。提前谢谢你的帮助

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
我已经编写了一段代码,用google解析来自多个站点的数据

不完全是。您编写的代码非常具体且不灵活,需要有一个“phone”类,否则将出现错误。一旦你这样做了,你就导航到了一个新的网站,没有理由相信Yellopages和McDonalds会共享甚至是远程相同的结构。在这一点上,您所做的只是不够灵活,无法处理(不同)网站可能采用的无限结构:

http.send
hmm.body.innerHTML = http.responseText
Set posts = hmm.getElementsByClassName("phone")
Cells(i, 4) = posts(0).innerText
当您
设置posts=hmm…
时,您假设在您搜索的每个网站上都必须有一个带有ClassName=“phone”的元素。如果没有这样的元素,则会出现错误(需要对象)

为了获得任何元素,您需要了解您正在删除的站点的结构,但有几种方法可以做到这一点:

  • 您可以使用对
    getElementsByTagName
    getElementsByClassName
    的索引调用(您当前正在执行的操作),但这需要您知道标记名或类名
  • 在迭代由
    getElementsByTagName
    返回的集合时匹配某些条件,如果找到条件,则退出
  • 如果您的浏览器支持,则可以使用
    getElementByID
    (如果ID标记可用,则它是唯一标识符)
  • 如果已知,可以为元素提供
    xpath
    标识符
  • 您可以尝试接受整个结果,并使用正则表达式从纯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
    
    这将至少运行时不会出错,并且它将标识不包含“phone”类的URL。然后可以检查这些网页的源HTML,并修改代码以处理其他情况


    您可以尝试接受整个结果,并使用正则表达式从纯HTML源代码中提取电话号码,在这种情况下,这可能是最可靠的方法。

    感谢David爵士的明确回答。在我看到你的回答之前,我对在一个电话里得到我想要的任何信息感到非常困惑。在不同的网站上,我注意到有人问和我一样的问题。在这一点上,我可以理解深入挖掘的基础知识,但我很好奇,如果我做了一个由for循环推动的错误处理程序,我最多可以在一个子程序或调用中抓取五到十个站点,那么列表中包含100个或更多的搜索结果呢。再次感谢先生。我用一个简单的处理程序做了一个小的修改,该处理程序运行时不会出错,并且应该能够识别出找不到“phone”类的URL。希望这对您有所帮助:)谢谢您对我混乱的代码的友好触摸。也许,你是在匆忙中写的,这就是为什么会有一些无关紧要的错误。不过我已经改正了。