Итак, у меня есть следующий код для удаления данных с веб-сайта, и он работает без проблем.
Теперь моя «проблема» заключается в том, что мне нужно запустить код на нескольких веб-страницах, потому что веб-сайт, который я очищаю, имеет скрипт разбиения на страницы.
Например: на одной странице 48 записей, но в большинстве случаев на странице более 200 записей, но они разделены на 3/4 страницы.
Мой код:
Public Sub Roupa()
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
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.worten.pt/grandes-eletrodomesticos/maquinas-de-roupa/maquinas-de-roupa-ver-todos-marca-BALAY-e-BOSCH-e-SIEMENS?per_page=100", False
.send
html.body.innerHTML = .responseText
End With
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
ОБНОВИТЬ
Я пытался добавить это For n = 1 To 2 перед With, это работает, но мне нужно знать точное количество страниц, так что это не так полезно..
Я уже пробовал это, на самом деле страница загружает только 48 записей, per_page=100 уже была моя попытка
@QHarr уже предоставил хороший подход для получения количества страниц из w-filters__element. Однако другой подход (я обычно использую) состоит в том, чтобы идти в цикле (увеличивая количество страниц) до тех пор, пока номер следующей страницы не будет найден во внутреннем тексте разбивки на страницы ListElement's (в данном случае pagination text-center или классе Div w-pagination-block)


Определите количество страниц, разделив количество результатов на количество результатов на страницу. Затем выполните цикл, объединяющий соответствующий номер страницы с URL-адресом.
Option Explicit
Public Sub Roupa()
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 RESULTS_PER_PAGE As Long = 48
Const START_URL As String = "https://www.worten.pt/grandes-eletrodomesticos/maquinas-de-roupa/maquinas-de-roupa-ver-todos-marca-BALAY-e-BOSCH-e-SIEMENS?per_page = " & RESULTS_PER_PAGE & "&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(".w-filters__element").innerText, Chr$(32))
numResults = arr(UBound(arr))
numPages = 1
If numResults > RESULTS_PER_PAGE Then
numPages = Application.RoundUp(numResults / RESULTS_PER_PAGE, 0)
End If
For i = 1 To numPages
If i > 1 Then
.Open "GET", Replace$("https://www.worten.pt/grandes-eletrodomesticos/maquinas-de-roupa/maquinas-de-roupa-ver-todos-marca-BALAY-e-BOSCH-e-SIEMENS?per_page = " & RESULTS_PER_PAGE & "&page=1", "page=1", "page = " & i), False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.send
html.body.innerHTML = .responseText
End If
Set data = html.getElementsByClassName("w-product__content")
For Each item In data
r = r + 1: c = 1
For Each div In item.getElementsByTagName("div")
With ThisWorkbook.Worksheets("Roupa")
.Cells(r, c) = div.innerText
End With
c = c + 1
Next
Next
Next
End With
Sheets("Roupa").Range("A:A,C:C,F:F,G:G,H:H,I:I").EntireColumn.Delete
End Sub
Размышляя о том, что сказал @AhmedAu, если страница загрузилась правильно, похоже, что хороший способ также получить количество страниц - просто использовать:
numPages = html.querySelectorAll("[data-page]").Length
Блин ты гений!! У вас есть хорошие курсы? Я хотел бы узнать больше!!
Что, если вы просто попробуете изменить это в URL-адресе —
per_page=100, чтобы сказатьper_page=100000?