Использование VBA в Excel для поиска Google в IE и возврата гиперссылки на первый результат

Я пытался использовать автоматизацию IE для поиска в Google строки текста в Excel. Я хочу вернуть гиперссылку на сайт с первым результатом в другую ячейку в excel. Это возможно? У меня есть список из 60000 записей, которые мне нужны для поиска в Google и возврата гиперссылки на сайт в первом результате. Есть ли другой подход к этому, который вы бы порекомендовали? Я ценю помощь заранее.

2 ответа

Решение

В качестве 60000 записей я рекомендую использовать объект xmlHTTP вместо IE.
HTTP-запросы проще и намного быстрее

Загрузите образец файла

Sub XMLHTTP()

    Dim url As String, lastRow As Long, i 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

    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.co.in/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 objH3 = objResultDiv.getelementsbytagname("h3")


        For Each link In objH3

            If link.className = "r" Then

                Cells(i, 2) = link.innerText
                Cells(i, 3) = link.getelementsbytagname("a")(0).href
                DoEvents
            End If
        Next
    Next

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

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

Использование CSS3 Selector

 Sub XMLHTTP1()

        Dim url As String, i As Long, lastRow As Long
        Dim XMLHTTP As Object, html As New HTMLDocument, objResultDiv As HTMLAnchorElement


        lastRow = Range("A" & Rows.Count).End(xlUp).Row
        For i = 2 To lastRow

            url = "https://www.google.co.in/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 = New HTMLDocument
            html.body.innerHTML = XMLHTTP.ResponseText
            Set objResultDiv = html.querySelector("div#rso h3.r a")

            Cells(i, 2) = objResultDiv.innerText
            Cells(i, 3) = objResultDiv.href

            DoEvents
        Next

    End Sub

Выход

НТН
Сантош

Похоже, что ссылки находятся внутри тегов H3. Обычно вы можете использовать что-то вроде следующего, чтобы проверить, пока страница не загрузится:

Private Declare Sub Sleep Lib "kernel32" (ByVal nMilliseconds As Long)

Sub UseIE()
    Dim ie As Object
    Dim thePage As Object
    Dim strTextOfPage As String

    Set ie = CreateObject("InternetExplorer.Application")
    'ie.FullScreen = True
    With ie
        '.Visible = True
        .Navigate "http://www.bbc.co.uk"
        While Not .ReadyState = READYSTATE_COMPLETE '4
            Sleep 500      'wait 1/2 sec before trying again
        Wend
    End With

    Set thePage = ie.Document
    'more code here
End Sub

Однако вместо этого я бы неоднократно пытался ссылаться на элемент A в первом H3, используя getElementsByTagName("H3"), получите первый из этих элементов, затем поищите в нем A-ссылку и ее атрибут href.

В JavaScript попытки ссылаться на несуществующие элементы будут возвращаться undefined но из VBA, вероятно, потребуется код обработки ошибок.

Как только я получил href, я бы остановил навигацию (возможно, не уверен в команде ie.Stop) или сразу перейти к следующей странице.

Первая ссылка (ссылки), однако, часто будет спонсорской ссылкой, а возвращаемая ссылка немного искажена. Текст этих рекламных ссылок, кажется, включает em теги. Я мог бы использовать эту информацию, чтобы отбросить эти ссылки и посмотреть дальше вниз по странице.

Я не знаю, есть ли лучший способ сделать это.

Другие вопросы по тегам