Скрипт VBA WebScraping возвращает нижний индекс OutOf Range - PullRequest
4 голосов
/ 06 марта 2019

Проблема:

Я пытался удалить данные с веб-сайта, но он всегда выдает мне ошибку Нижний диапазон выходных данных Я не знаю почему, я использую точно такой же код для другого веб-сайта, и он работает прекрасно.

Да, я изменил divs с нового веб-сайта, с которого я хочу отказаться.

Может кто-нибудь помочь мне, пожалуйста? Заранее спасибо.

Код:

Option Explicit
Public Sub Loiça()
    Dim data As Object, i As Long, html As HTMLDocument, r As Long, c As Long, item As Object, div As Object
    Set html = New HTMLDocument                  '<== VBE > Tools > References > Microsoft HTML Object Library

    Const START_URL As String = "https://mediamarkt.pt/pages/search-results-page?q=maquina+roupa&page=1"

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", START_URL, False
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .send
        html.body.innerHTML = .responseText
        Dim numPages As Long, numResults As Long, arr() As String
        arr = Split(html.querySelector(".snize-search-results-header").innerText, Chr$(32))
        numResults = arr(UBound(arr))
        numPages = 1


        For i = 1 To numPages
             If i > 1 Then
                .Open "GET", Replace$("https://mediamarkt.pt/pages/search-results-page?q=maquina+roupa&page=1", "page=1", "page=" & i), False
                .setRequestHeader "User-Agent", "Mozilla/5.0"
                .send
                 html.body.innerHTML = .responseText
            End If
            Set data = html.getElementsByClassName("snize-four-columns")
            For Each item In data
                r = r + 1: c = 1
                For Each div In item.getElementsByTagName("div")
                    With ThisWorkbook.Worksheets("Loiça")
                        .Cells(r, c) = div.innerText
                    End With
                    c = c + 1
                Next
            Next
        Next
    End With
    '----------------------------------------------------------------------------------------------------------------------------------------------------------------------'
End Sub

1 Ответ

3 голосов
/ 06 марта 2019

Это

html.querySelector(".snize-search-results-header").innerText

возвращает пустую строку, поэтому, когда вы делите, вы получите -1 в вашем массиве.

Возможно, для этого значения требуется javascript длязапустить на странице.Проверьте возвращенный HTML.Я думаю, что значение не возвращается за это.Используйте такой метод, как selenium или IE, который позволяет js запускаться на странице и обновлять содержимое со значением

. В этом случае вам также потребуется lbound, чтобы вы могли использовать функцию, которая возвращает значение, которое использует IE * 1008.*

numPages  =  GetNumberOfPages 

Public Function GetNumberOfPages() As Long
    Dim IE As New InternetExplorer
    With IE
        .Visible = False
        .Navigate2 "https://mediamarkt.pt/pages/search-results-page?q=maquina+roupa&page=1"

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

        Dim numPages As Long, numResults As Long, arr() As String
        arr = Split(.document.querySelector(".snize-search-results-header").innerText, Chr$(32))
        numResults = arr(LBound(arr))
        GetNumberOfPages =  numResults
        .Quit
    End With
End Function

На следующей странице вы смотрите на другое имя класса (я думаю)

Set data = html.getElementsByClassName("snize-product")

Изучите html для проверки.

...