Использование VBA в Excel для поиска Google в IE и возврата гиперссылки первого результата
Я пытался использовать IE automation для поиска google строки текста в Excel. Я хочу вернуть гиперссылку на сайт Первого результата в другой ячейке в excel. Возможно ли это? У меня есть список из 60 000 записей, которые мне нужно найти в google и вернуть гиперссылку на сайт в первом результате. Есть ли другой подход к этому, который вы бы рекомендовали? Спасибо за помощь заранее.
2 ответов
в качестве его 60 000 записей я рекомендую использовать объект 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 с
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
выход
HTH
г
ссылки, похоже, последовательно находятся в пределах тегов 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-link и его href-атрибут.
в JavaScript попытки ссылаться на несуществующие элементы вернутся undefined
но от VBA это вероятно, потребуется код обработки ошибок.
как только я получил href Я бы остановил навигацию (не уверен в команде для этого, вероятно,ie.Stop
) или сразу перейти к следующей странице.
первая ссылка(ы) будет, однако, часто спонсироваться ссылки и href возвращается немного искажен. Текст этих рекламных ссылок включает em
теги. Я мог бы использовать эту информацию, чтобы отбросить эти ссылки и смотри дальше страница.
Я не знаю, есть ли лучший способ сделать это.