Próbowałem używać automatyzacji IE do wyszukiwania w Google ciągu tekstowego w Excelu. Chcę zwrócić hiperłącze do strony internetowej pierwszego wyniku w innej komórce w programie Excel. czy to możliwe? Mam listę 60 000 rekordów, które muszę przeszukiwać w Google i zwracać hiperłącze do strony w pierwszym wyniku. Czy istnieje inne podejście do tego, które polecasz? Doceniam pomoc z góry.Używanie języka VBA w programie Excel do wyszukiwania Google w IE i zwracanie hiperłącza pierwszego wyniku
Odpowiedz
Jako 60 000 rekordów polecam używać obiektu xmlHTTP zamiast używać IE.
HTTP żąda łatwiejszy i dużo szybciej
Pobierz przykładowy plik here
Sub XMLHTTP()
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
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")(0)
Set link = objH3.getelementsbytagname("a")(0)
str_text = Replace(link.innerHTML, "<EM>", "")
str_text = Replace(str_text, "</EM>", "")
Cells(i, 2) = str_text
Cells(i, 3) = link.href
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
HTH
santosh
Linki wydają się być konsekwentnie w obrębie znaczników H3. Normalnie można użyć coś jak poniżej, aby sprawdzić aż załadowaniu strony:
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
Jednak chciałbym, zamiast wielokrotnie próbować odwołać pierwiastek ciągu pierwszego H3 stosując getElementsByTagName("H3")
, dostać pierwszy z tych elementów , spójrz na to w odniesieniu do linku A i jego atrybutu href.
W JavaScript próby odwoływania się do nieistniejących elementów wróciłyby undefined
, ale z VBA będzie prawdopodobnie potrzebny kod obsługi błędów.
Raz uzyskały href chciałbym zatrzymać nawigacji (nie wiem polecenia dla tego, prawdopodobnie ie.Stop
) lub od razu przejść do następnej strony.
Pierwsze łącze (linki) będą jednak często linkami sponsorowanymi, a zwracany href jest nieco zniekształcony. Tekst tych linków sponsorowanych wydaje się zawierać tagi em
. Mogę użyć tych informacji, aby odrzucić te linki i zajrzeć dalej w dół strony.
Nie wiem, czy jest lepszy sposób na zrobienie tego.
Dzięki! To działa dobrze, z wyjątkiem sytuacji, gdy po około 100 rekordach otrzymam błąd Run 80070005. Odmowa dostępu. Jakieś wskazówki, dlaczego? –
@CollinHendo Nope, będą musiały zobaczyć twoje dane do tego. Alternatywnie możesz dodać "On error resume next" na górze kodu. Jeśli rozwiązanie było pomocne głosowanie pls. – Santosh
Mogę podać Ci próbkę moich danych. Jak mogłem to zrobić? –