Макрос Excel для извлечения ссылок на изображения Google - PullRequest
0 голосов
/ 25 сентября 2018

Цель состоит в том, чтобы получить изображения из Google Images, которые соответствуют номерам деталей в моей базе данных.Мой код запускается, и он загружает правильные страницы Google, но отказывается помещать ссылки в электронную таблицу.Я перепробовал все, что только мог придумать, но сейчас я получаю сообщение об ошибке 1004 (ошибка приложения или объекта) .`

Sub SearchBotGoogleImgLink()
Dim objIE As Object
Set IE = CreateObject("InternetExplorer.Application")
Dim HTMLdoc As HTMLDocument
Dim imgElements As IHTMLElementCollection
Dim imgElement As HTMLImg
Dim aElement As HTMLAnchorElement
Dim n As Integer
Dim i As Integer
Dim url As String
Dim url2 As String
Dim m As Long
Dim lastRow As Long
Dim url3 As String
Dim SearchRow As Long
Dim aEle As HTMLLinkElement


    Worksheets("Sheet1").Select
SearchRow = 1

Do Until IsEmpty(ActiveSheet.Cells(SearchRow, 1))
Sheets("Sheet1").Select
    Application.StatusBar = SearchRow - 1 & " of " & "4368" & " Items Done"
        Item = Trim(ActiveSheet.Cells(SearchRow, 1))
        url = "https://www.google.com/search?hl=en&biw=1600&bih=796&tbm=isch&sa=1&ei=CTOpW_2jO6nAjwT67rqACw&q=A2N0015C3KUU&oq=" & Cells(SearchRow, 1) & "&oq=A2N0015C3KUU&gs_l=img.12...0.0..1704...0.0..0.0.0.......1......gws-wiz-img.9wB6WwQJhwA"
        Set objIE = New InternetExplorer
        objIE.Visible = True
        objIE.navigate url
        Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
        For Each aEle In objIE.document.getElementsByTagName("IMG")
        result = aEle
            Sheets("Sheet1").Range(SearchRow & "C").Value = result
            Sheets("Sheet1").Range(SearchRow & "D") = aEle.innerHTML
            Sheets("Sheet1").Range(SearchRow & "F").Value = aEle.innerText
            Debug.Print aEle.innerText
    Next
Loop
'For i = 1 To lastRow
    'url = "https://www.google.com/search?hl=en&biw=1600&bih=796&tbm=isch&sa=1&ei=CTOpW_2jO6nAjwT67rqACw&q=A2N0015C3KUU&oq=" & Cells(SearchRow, 1) & "&oq=A2N0015C3KUU&gs_l=img.12...0.0..1704...0.0..0.0.0.......1......gws-wiz-img.9wB6WwQJhwA"

    Set HTMLdoc = objIE.document

    Set imgElements = HTMLdoc.getElementsByTagName("IMG")

    n = 1
    For Each imgElement In imgElements
        If InStr(ingElement.src, sImageSearchString) Then
            If imgElement.ParentNode.nodeName = "A" Then
                Set aElement = imgElement.ParentNode
                If n = 2 Then
                    url2 = aElement.href 'imgElement.src
                    url3 = imgElement.src 'aElement.href

                n = n + 1
                End If
            End If
        End If
    Next

    Cells(SearchRow, 5) = url2

 IE.Quit
 Set IE = Nothing
End Sub

1 Ответ

0 голосов
/ 25 сентября 2018

Примечания к вашему коду:

Вам нужно Option Explicit вверху кода, чтобы проверить объявления переменных и опечатки, а также другие преимущества.Существует несколько пропущенных объявлений, например, result, а позже использовались, например, Set IE = CreateObject("InternetExplorer.Application").У вас есть две разные переменные (одна с поздней границей и одна с ранней), которые создают экземпляры IE.На самом деле вы используете только один.

Ваша текущая ошибка может быть связана с тем, что вы пытаетесь работать с объектом здесь: result = aEle, который не будет работать без ключевого слова Set, чтобы предоставить необходимую ссылку.

Без примеров URL и ожидаемого вывода трудно посоветовать о последующих циклах в вашем коде.Похоже, у вас есть дублирующий цикл над элементами IMG, но на этот раз с некоторыми ограничениями.Вероятно, эти циклы можно объединить.


Пример:

В следующем примере используется произвольная конкатенация для извлечения ссылок img src из поискарезультаты основаны на A2N0015C3KUU.

. Используется селекторная комбинация CSS #ires img[src] для нацеливания элементов с тегами img и src в родительском элементе с идентификатором ires (результаты поиска).

Это демонстрация принципа сбора aNodeList соответствующих элементов и выписывания на лист.Метод querySelectorAll применил комбинацию селекторов CSS к HTMLDocument и возвращает нодлист.nodeList зацикливается вдоль .Length, с элементами, доступ к которым осуществляется по индексу, начиная с 0.

Option Explicit
Public Sub GetInfo()
    Dim IE As New InternetExplorer
    With IE
        .Visible = True
        .navigate "https://www.google.com/search?hl=en&biw=1600&bih=796&tbm=isch&sa=1&ei=CTOpW_2jO6nAjwT67rqACw&q=A2N0015C3KUU&oq=1&%20%22&oq=A2N0015C3KUU&gs_l=img.12...0.0..1704...0.0..0.0.0.......1......gws-wiz-img.9wB6WwQJhwA"

        While .Busy Or .readyState < 4: DoEvents: Wend

        Dim aNodeList As Object, i As Long
        Set aNodeList = IE.document.querySelectorAll("#ires img[src]")
        For i = 0 To aNodeList.Length - 1
            ActiveSheet.Cells(i + 2, 4) = aNodeList.item(i).src
        Next
        'Quit '<== Remember to quit application
    End With
End Sub
...