У меня есть вопросы о том, как нажимать и искать в Интернете с помощью VBA - PullRequest
0 голосов
/ 29 января 2020

У меня есть вопросы о том, как нажимать и искать в Интернете с помощью vba. Я написал код, но не могу найти, как нажать на кнопку в этой сети

Sub LEISearch()

    'dimension (declare or set aside memory for) our variables
    Dim objIE As InternetExplorer 'special object variable representing the IE browser
    Dim LEI As HTMLLinkElement 'special object variable for an <a> (link) element
    Dim y As Integer 'integer variable we'll use as a counter
    Dim result As String 'string variable that will hold our result link'
    Dim result2 As String


    'initiating a new instance of Internet Explorer and asigning it to objIE
    Set objIE = New InternetExplorer

    'make IE browser visible (False would allow IE to run in the background)
    objIE.Visible = True

    'navigate IE to this web page (a pretty neat search engine really)
    objIE.navigate "https://www.gmeiutility.org/search.jsp?keyWord"

    'wait here a few seconds while the browser is busy
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    'in the search box put cell "A2" value, the word "in" and cell "C1" value
    objIE.document.getElementById("searchInput").Value = _
        Sheets("Macro1").Range("A1").Value

    'click the 'go' button
    Set LEIButton = objIE.document.getElementsByClassName("hiddenSubmitButton")
    LEIButton.Focus
    LEIButton.Click


    'wait again for the browser
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
End Sub

1 Ответ

0 голосов
/ 30 января 2020

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

Я настоятельно рекомендую избегать использования IE для очистки веб-сайтов, когда это возможно. Это очень неэффективно. Особенно в таком случае, когда может быть несколько страниц результатов. Вместо этого вы можете использовать HTTP requests.

HTTP-запрос - это структурированный способ запроса чего-либо с сервера. В этом случае мы хотим отправить ключевое слово на сервер и получить соответствующие результаты поиска.

Чтобы узнать, как должен выглядеть этот запрос, необходимо проверить сетевой трафик c, когда кнопка с лупа нажата. Вы можете сделать это с помощью инструментов разработчика вашего браузера (Ctrl + Shift + E, если вы используете Firefox):

enter image description here

Если вы go через заголовки и параметры запроса вы увидите, как должны выглядеть URL, тело и заголовки. В этом конкретном случае все параметры кодируются в URL, а заголовки не являются необходимыми для успешного выполнения запроса, поэтому все, что вам нужно, - это URL.

Некоторые параметры URL являются ключевым словом количество результатов на страницу и количество страниц.

Полезная нагрузка ответа в формате json. Вы можете проверить его структуру с помощью инструмента, подобного this . Вот как это выглядит:

enter image description here

По сути, ответ 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

Вам потребуется добавить следующие ссылки на ваш проект (VBE> Инструменты> Ссылки):

Microsoft WinHTTP Services version 5.1
Microsoft HTML Objects Library
Microsoft Scripting Runtime

Вам также нужно добавить этот JSON парсер в ваш проект. Следуйте инструкциям по установке в ссылке, и вы должны быть установлены на go.

...