Получить URL страницы Википедии из списка Excel - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть проблема, когда я не делаю никакого прогресса.

Я сейчас работаю над магистерской диссертацией. Для этого у меня есть список актеров, и мне нужно проверить, у кого из них есть собственная (немецкая) страница в Википедии. (примерно 20 000 актеров) Поскольку я не очень опытен в программировании на VBA, я искал решение здесь, на форуме. Я нашел код, с помощью которого вы можете искать URL через Google и получить первый результат, скопированный в Excel.

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

Я пытался ограничить поиск немецкой википедией, используя поиск в Google только по немецким страницам. Например. "site: de.wikipedia.org intitle: Джонни Депп"

Это хорошо работает для известных актеров, но я получаю код ошибки при поиске актера, у которого нет собственной страницы. «Ошибка 91: переменная объекта или переменная блока не установлена»

Так, возможно, вы можете помочь мне встроить обходной путь в код, который пропускает актера, когда у него / нее нет собственной страницы, и инсад переходит к следующему в списке?

Извините за вопрос новичка, но это было бы здорово! :) Или, может быть, у вас есть даже более простое решение.

Большое спасибо!

Образец файла

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.de/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

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Иногда сложно получить информацию из Google, используя запрос xmlhttp, serverxmlhttp или winhttp. Даже если вы попробуете с proxy, Google может легко определить вас как бота, так что вы попадете на страницу captcha, и ваша попытка потерпит неудачу. Однако более безопасный подход в этом случае заключается в пилотировании IE. Попробуйте использовать способ ниже. если у вас IE9, то .querySelector(), определенный в скребке, будет качаться.

Sub ScrapeGoogle()
    Dim IE As New InternetExplorer, HTML As HTMLDocument
    Dim cel As Range, URL$, post As Object

    For Each cel In Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).row)
        URL = "https://www.google.de/search?q=" & Replace(cel.Value, " ", "%20")

        With IE
            .Visible = True
            .navigate URL
            While .Busy = True Or .readyState <> 4: DoEvents: Wend
            Set HTML = .document

            If Not HTML.querySelector(".rc h3.r a") Is Nothing Then
                Set post = HTML.querySelector(".rc h3.r a")
                cel(1, 2) = post.innerText
                cel(1, 3) = post.getAttribute("href")
            Else
                cel(1, 2) = "Nothing found"
                cel(1, 3) = "Sorry dear"
            End If
        End With
    Next cel
    IE.Quit
End Sub

Ссылка для добавления в библиотеку:

Microsoft Internet Controls
Microsoft HTML Object Library
0 голосов
/ 28 апреля 2018

Проверьте, найден ли objResultDiv элемент и, если он найден, продолжайте, если нет, напишите «Not Found» в ячейки.

Вы можете попробовать что-то вроде этого ...

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
Dim i As Long
Dim str_text As String

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.de/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

    If XMLHTTP.Status = 200 Then
        Set html = CreateObject("htmlfile")
        html.body.innerHTML = XMLHTTP.ResponseText
        Set objResultDiv = html.getelementbyid("rso")

        If Not objResultDiv Is Nothing Then
            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
        Else
            Cells(i, 2) = "Not Found"
            Cells(i, 3) = "Not Found"
        End If
    Else
        Cells(i, 2) = "Not Found"
        Cells(i, 3) = "Not Found"
    End If
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
...