VBA WebScraping возвращает пустые значения - PullRequest
1 голос
/ 07 марта 2019

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

Option Explicit

Public Sub Loiça()
Sheets("Loiça").Range("A:A,Z:Z").EntireColumn.Delete
    Dim IE As New InternetExplorer, i As Long, data As Object, div As Object, item As Object, r As Long, c As Long
    With IE
        .Visible = False
        .Navigate2 "https://www.radiopopular.pt/categoria/maquina-de-lavar-louca/"

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

        Dim numResults As Long, arr() As String
        arr = Split(.document.querySelector(".status.cb").innerText, Chr$(32))
        numResults = arr(LBound(arr))
        Dim resultsPerPage As Long
        resultsPerPage = .document.querySelectorAll(".data cb").Length
            If i > 1 Then
                .Navigate2 ("https://www.radiopopular.pt/categoria/maquina-de-lavar-louca/")
                While .Busy Or .readyState < 4: DoEvents: Wend
            End If
            Set data = .document.getElementsByClassName("data cb")
            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
        .Quit
    End With
    '---------------------------------------------------------------------------'
End Sub

1 Ответ

0 голосов
/ 07 марта 2019

Это было забавное испытание. Некоторые моменты, на которые стоит обратить внимание:

  1. Похоже, что страница не загружается в Internet Explorer (по крайней мере, для меня) - это может быть из-за того, что устаревшие браузеры не поддерживаются. Поэтому было необходимо переключиться на Selenium basic и Chrome. После загрузки и установки selenium basic вам, возможно, придется поменять ChromeDriver.exe в папке selenium для latest . Затем вам нужно перейти VBE> Инструменты> Ссылки> Добавить ссылку на Selenium Type Library.
  2. Страница загружается динамически с помощью ajax в пакетах по 12 записей. Вам нужно прокрутить страницу, пока не появятся все результаты.
  3. Вы не можете получить счетчик результатов так же, как вы показываете, поскольку возвращаемая строка имеет другой, и, возможно, переменный формат. Вместо этого вы можете получить сумму от элемента, который хранит это число.
  4. Чтобы продолжить использовать синтаксис для записи, вам нужно перевести html-страницу в переменную HTMLDocument, а затем работать с этим.

VBA:

Option Explicit
Public Sub Loiça()
    Dim d As WebDriver, t As Date, i As Long, data As Object, div As Object, item As Object, r As Long, c As Long
    Dim numResults As Long, html As HTMLDocument
    Const MAX_WAIT_SEC As Long = 600
    Const URL As String = "https://www.radiopopular.pt/categoria/maquina-de-lavar-louca/"

    Set d = New ChromeDriver

    With d
        .Start "Chrome"
        .get URL

        Worksheets("Loiça").Range("A:A,Z:Z").EntireColumn.Delete
        numResults = .FindElementByCss("#total").Text
        t = Timer
        Do
            .ExecuteScript "window.scrollBy(0, window.innerHeight);", "javascript"
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop Until .FindElementByCss("#products").Text = numResults
        Set html = New HTMLDocument
        html.body.innerHTML = .PageSource
        Set data = html.getElementsByClassName("data")
        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
        .Quit
    End With
End Sub
...