如何使用VBA获取Google搜索的第一个搜索结果链接?

时间:2018-11-01 11:23:31

标签: excel vba web-scraping automation

在日常任务中,我目前必须搜索大量产品并收集有关这些产品的信息。因此,我的想法是在Google上搜索产品,并从产品标题部分提取数据,然后从第一个搜索结果中获取信息,然后对许多产品进行此循环。

这是到目前为止我的代码:

Sub SkuAutomation()

Dim ie As Object


'Navigates to google
 Set ie = CreateObject("InternetExplorer.application")
 ie.Visible = True
 ie.Navigate "https://google.co.uk/search?q=" & Worksheets("sheet1").Cell(9, 4).Value & " " & Worksheets("sheet1").Cells(9, 2)


'Waits for page to load before next action

Do While ie.ReadyState <> READYSTATE_COMPLETE

Loop

End Sub

我只想添加一段代码,要么单击google返回的第一个链接,要么为我返回链接。然后,我的想法是从该页面的产品标题部分抓取数据!虽然还很早期。

我只是一个初学者,因此非常感谢任何帮助!提前谢谢了。

2 个答案:

答案 0 :(得分:2)

您的里程可能会有所不同,但是对于您提供的内容,您可以使用CSS选择器组合来按页面样式定位第一个链接。

我使用#search div.r [href*=http],但您可以简化为#search .r a。我很想知道http中有一个href

#是一个id选择器,空格" "是一个后代选择器(选择前一个元素的子代,而[]是一个属性选择器。{{1} }是一个类选择器,即按类名称选择一个元素。

我正在寻找具有"."属性且其值包含href且其父元素http元素的类名称为div的第一个元素,其父元素具有ID r

search

答案 1 :(得分:0)

这就是我要做的。在“单元格A2”中放置一些搜索条件,在“ ColumnA”中一直向下移动。然后运行下面的代码。结果将进入ColumnB中的相邻单元格

enter image description here

girafe
rhino
starbucks


Sub Gethits()
    Dim url As String, lastRow As Long
    Dim XMLHTTP As Object, html As Object, objResultDiv As Object, objH3 As Object, link As Object
    Dim start_time As Date
    Dim end_time As Date
    Dim var As String
    Dim var1 As Object

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

    Dim cookie As String
    Dim result_cookie As String

    start_time = Time
    Debug.Print "start_time:" & start_time

    For i = 2 To lastRow

        url = "https://www.google.com/search?q=" & Cells(i, 1) & "&rnd=" & WorksheetFunction.RandBetween(1, 10000)

        Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP")
        XMLHTTP.Open "GET", url, False
        XMLHTTP.setRequestHeader "Content-Type", "text/xml"
        XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"
        XMLHTTP.send

        Set html = CreateObject("htmlfile")
        html.body.innerHTML = XMLHTTP.ResponseText
        Set objResultDiv = html.getelementbyid("rso")
        Set var1 = html.getelementbyid("resultStats")
        Cells(i, 2).Value = var1.innerText

        DoEvents
    Next

    end_time = Time
    Debug.Print "end_time:" & end_time

    Debug.Print "done" & "Time taken : " & DateDiff("n", start_time, end_time)
    MsgBox "done" & "Time taken : " & DateDiff("n", start_time, end_time)
End Sub