Как определить URL-адрес одностраничного приложения на основе HTML-кода - PullRequest
0 голосов
/ 11 сентября 2018

Мне нужно удалить информацию с веб-страницы, которая использует одностраничный код приложения (https://www.rigzone.com/oil/jobs/search/), просто загрузите что-нибудь в поле «поиск» и нажмите кнопку, затем используйте стрелки внизу для перехода со страницы на странице, вы заметите, что во время этого процесса URL, отображаемый в верхней панели, остается прежним. Я предполагаю (пожалуйста, исправьте меня, если я ошибаюсь), что есть способ показать URL, соответствующий каждой из страниц с опубликованы различные позиции. В идеале я хотел бы определить те, которые открывают их в моем скрипте, извлекать HTML-код и с помощью VBA xmlhttp извлекать нужную мне информацию. Как я могу это сделать?

В качестве альтернативы я мог бы просто найти элемент, соответствующий кнопке «Далее» в нижней части, и активировать его в скрипте, который удаляет данные, что, вероятно, будет намного проще, но мне любопытно, что делать первым.

Спасибо!

1 Ответ

0 голосов
/ 11 сентября 2018

Вот очень уродливый код, который нуждается в улучшении, использующий IE и продолжающий нажимать кнопку «Далее» для ожидаемого количества страниц на основе 20 результатов на страницу.

Если есть способ создать как POST XMLHTTPRequestЯ бы пошел по этому пути.Еще лучше было бы, если бы API существовал.

Option Explicit
Public Sub LoopPages()
    Dim IE As New InternetExplorer, t As Date, num As String, i As Long
    Const MAX_WAIT_SEC As Long = 5
    Const RESULTS_PER_PAGE = 20

    With IE
        .Visible = True
        .navigate "https://www.rigzone.com/oil/jobs/search/"

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

        With .document
            .getElementById("txtSearch").Value = "Health"
            .getElementById("txtLocation").Value = "Paris, France"
            .getElementById("btnBasicSearch").Click
        End With

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

        Application.Wait Now + TimeSerial(0, 0, 4)
        t = Timer

        Do
            On Error Resume Next
            num = Split(Split(.document.querySelector(".rz-table-dd-sm + div").innerText, "of ")(1), Chr$(32))(0)
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While num = vbNullString

        'do stuff with initial page

        On Error GoTo errhand
        num = Round(CLng(num) / RESULTS_PER_PAGE, 0)
        num = IIf(num < 1, 1, num)

        For i = 1 To num          
            .document.querySelector(".next").Click        
            While .Busy Or .readyState < 4: DoEvents: Wend            
            'other code with new page               
        Next   
        Stop                                     '<== Delete me later   
errhand:
        .Quit
    End With
End Sub

Комбинация селектора CSS:

.rz-table-dd-sm + div

. При этом используется селектор соседних сестер "+" для выбораdiv рядом с элементом с классом rz-table-dd-sm."." является селектором класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...