2013-07-05 15 views
8

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

18

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 

enter image description here

HTH
santosh

+1

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? –

+1

@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

+0

Mogę podać Ci próbkę moich danych. Jak mogłem to zrobić? –

0

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.

Powiązane problemy