Этот случай - действительно хороший и чистый пример веб-слом, поэтому я воспользуюсь этой возможностью, чтобы представить образовательный пост.
Я настоятельно рекомендую избегать использования IE
для очистки веб-сайтов, когда это возможно. Это очень неэффективно. Особенно в таком случае, когда может быть несколько страниц результатов. Вместо этого вы можете использовать HTTP requests
.
HTTP-запрос - это структурированный способ запроса чего-либо с сервера. В этом случае мы хотим отправить ключевое слово на сервер и получить соответствующие результаты поиска.
Чтобы узнать, как должен выглядеть этот запрос, необходимо проверить сетевой трафик c, когда кнопка с лупа нажата. Вы можете сделать это с помощью инструментов разработчика вашего браузера (Ctrl + Shift + E, если вы используете Firefox):
![enter image description here](https://i.stack.imgur.com/JUYZm.jpg)
Если вы go через заголовки и параметры запроса вы увидите, как должны выглядеть URL, тело и заголовки. В этом конкретном случае все параметры кодируются в URL, а заголовки не являются необходимыми для успешного выполнения запроса, поэтому все, что вам нужно, - это URL.
Некоторые параметры URL являются ключевым словом количество результатов на страницу и количество страниц.
Полезная нагрузка ответа в формате json. Вы можете проверить его структуру с помощью инструмента, подобного this . Вот как это выглядит:
![enter image description here](https://i.stack.imgur.com/nGmUO.jpg)
По сути, ответ JSON состоит из указанного вами количества результатов, которое должно отображаться на странице (или Меньше). Чтобы перейти на следующую страницу, вам нужно отправить новый запрос с тем же ключевым словом, но с указанием нового номера страницы и т. Д.
Фактически, как вы можете видеть, веб-сайт предлагает гораздо больше данных, чем отображается на Ваш браузер, который может оказаться полезным.
Приведенный ниже код ищет ключевое слово test
, запрашивая 25 результатов на странице. Один первый запрос отправляется для определения количества страниц результатов, а затем код перебирает все страницы и печатает результаты в рабочем листе.
TL; DR
Option Explicit
Sub main()
Dim sht As Worksheet
Dim totalNumberOfPages As Long
Dim searchResults As Object
Dim pageNumber As Long
Dim results() As String
Dim entity As Object
Dim i As Long, j As Long
Dim rng As Range
Set sht = ThisWorkbook.Worksheets("Name of your Worksheet")
''''''First request to find out the number of pages''''''
Set searchResults = XHRrequest("test", 25, 1) '
totalNumberOfPages = searchResults("totalPages") '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''Loop through all the pages''''''''''''''''''''''''''''''''
For pageNumber = 1 To totalNumberOfPages Step 1 '
Set searchResults = XHRrequest("test", 25, pageNumber) '
ReDim results(1 To searchResults("entitySearchResult").Count, 1 To 7) '
i = 0 '
'''''''''''write the results in an array'''''''''''''''''''''''''''' '
For Each entity In searchResults("entitySearchResult") ' '
i = i + 1 ' '
results(i, 1) = entity("LEINumber") ' '
results(i, 2) = entity("legalName") ' '
results(i, 3) = entity("city") ' '
results(i, 4) = entity("headquartersCountry") ' '
results(i, 5) = entity("recordStatus") ' '
results(i, 6) = entity("renewalStatus") ' '
results(i, 7) = entity("entityStatus") ' '
Next entity ' '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '
'''''''''''''''write all the results in the worksheet in one go''''' '
With sht ' '
Set rng = .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0) ' '
End With ' '
rng.Resize(UBound(results, 1), UBound(results, 2)) = results ' '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '
Next pageNumber '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End Sub
Public Function XHRrequest(ByVal key As String, ByVal resultsPerPage As Long, ByVal pageNumber As Long) As Object
Dim req As New WinHttpRequest
Dim url As String
url = "https://www.gmeiutility.org/actions/Search/?isPendingValidationChecked=true&isSearchAllLOUChecked=true&keyWord=" & key & "&page=" & pageNumber & "&resultsPerPage=" & resultsPerPage & "&searchType=baseSearch" 'build the URL according to the parameters
'''''''''Send the HTTP request'''''''''''''''''''''''''''''''
With req '
.Open "POST", url, False '
.send '
Set XHRrequest = JsonConverter.ParseJson(.responseText) '
End With '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End Function
В демонстрационных целях приведенный выше код распечатывает все данные на листе с именем Name of your Worksheet
.
Если вам нужно выполнить несколько поисков, вы можете легко изменить код в соответствии с вашими потребностями. Более конкретно, вы можете l oop через несколько ключевых слов и вызывать функцию XHRrequest
, используя эти ключевые слова вместо «test».
Вот пример выходных данных: ![enter image description here](https://i.stack.imgur.com/57DIF.jpg)
Вам потребуется добавить следующие ссылки на ваш проект (VBE> Инструменты> Ссылки):
Microsoft WinHTTP Services version 5.1
Microsoft HTML Objects Library
Microsoft Scripting Runtime
Вам также нужно добавить этот JSON парсер в ваш проект. Следуйте инструкциям по установке в ссылке, и вы должны быть установлены на go.