Есть ли фрагмент кода, который вытащит адрес из поиска Google - PullRequest
0 голосов
/ 30 сентября 2019

Поэтому я пытаюсь получить адрес компании, когда вы ищете [Название компании] + "Адрес" в Google. Я не могу получить «Около 20 500 результатов (0,49 секунд)», потому что div id всегда равен resultStats, а для адреса это HTML-класс, который называется: Z0LcW. Не уверен, что он изменится.

Я пытаюсь подтвердить, что торговые адреса, предоставленные потенциальным поставщиком, действительны. Это для адресов 4k, и я не хочу проверять это вручную.

Идея пришла от: Использование VBA в Excel для поиска по ключевым словам в Google и возврата проиндексированных страниц в google

Я смотрел на этих ребят, которые были очень полезны концептуально: Использование getElementsByClassName в Excel VBA

Dim XMLHTTP As Object, html, ObjResultdiv 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 = 1 To lastRow

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

    Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
    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

    'Debug.Print XMLHTTP.ResponseText


If html.getElementsBytagname("Z0LcW") Is Nothing Then
    str_text = "0 Results"
Else
    str_text = html.getElementsBytagname("Z0LcW")
End If
    Cells(i, 2) = str_text
    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)

Ответ должен быть таким: 31B, Avenue One, Station Ln, Witney OX284XZ

https://www.google.co.uk/search?sxsrf=ACYBGNQ6p6lh1ZFfS6dGwsDcg45wKgmICw%3A1569864526381&ei=TjuSXaPnFvHC8gL81a2gCg&q=beadlight+ltd+address&oq=beadlight+ltd+address&gs_l=psy-ab.3...1272.2467..2622...0.0..0.85.635.8......0....1..gws-wiz.......0j0i22i30j33i160j33i21.NErA1FvTnr8&ved=0ahUKEwijxsKLifnkAhVxoVwKHfxqC6QQ4dUDCAs&uact=5

1 Ответ

1 голос
/ 01 октября 2019

Добавлена ​​ссылка на библиотеку объектов Microsoft HTML, чтобы мы могли Dim a HTMLDocument и использовать доступные там методы.

"Z0LcW" - это класс, поэтому я использовал getElementsByClassName ("Z0LcW") для возврата результатов вместо getElementsByTagName.

Как только мы действительно получим результат, мы можем использовать свойство .innerTextэлемент для получения текстового значения. Я не одарён классами и тегами, так что имейте в виду, что в какой-то момент могут быть дубликаты, поэтому вам может понадобиться просмотреть цикл элементов позже.

Dim XMLHTTP As Object, ObjResultdiv As Object
Dim start_time As Date
Dim end_time As Date
Dim html As New HTMLDocument

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 = 1 To lastRow

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

    Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
    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") 'Don't need this as we early bind an HTMLDocument with the methods we need
    html.body.innerHTML = XMLHTTP.responseText

    'Debug.Print XMLHTTP.ResponseText


If html.getElementsByClassName("Z0LcW") Is Nothing Then
    str_text = "0 Results"
Else
    str_text = html.getElementsByClassName("Z0LcW")
End If

Debug.Print str_text.innerText 'innerText is the property that will give the text inside the elements found

    Cells(i, 2) = str_text.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...