Как скрести данные из таблицы на всех страницах? - PullRequest
0 голосов
/ 14 мая 2019

Я извлекаю данные с веб-сайта, и мой код извлекает только первые две страницы.

Я попытался вставить цикл for, но он не переходит на другие страницы.

Вот код HTML:

<div class="dataTables_length" id="activitylog_table_length"><label>Show <select name="activitylog_table_length" aria-controls="activitylog_table" class="custom-select custom-select-sm form-control form-control-sm">
<option value="10">10</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="200">200</option>
<option value="500">500</option></select> entries</label></div>



<div class="dataTables_info" id="activitylog_table_info" role="status" aria-live="polite">Showing 1 to 10 of 668 entries</div>

<div class="col-sm-12 col-md-7"><div class="dataTables_paginate paging_full_numbers" id="activitylog_table_paginate"><ul class="pagination">
<li class="paginate_button page-item first disabled" id="activitylog_table_first">
<a href="#" aria-controls="activitylog_table" data-dt-idx="0" tabindex="0" class="page-link">
<i class="la la-angle-double-left"></i></a></li><li class="paginate_button page-item previous disabled" id="activitylog_table_previous">
<a href="#" aria-controls="activitylog_table" data-dt-idx="1" tabindex="0" class="page-link">
<i class="la la-angle-left"></i>
</a>
</li><li class="paginate_button page-item active"><a href="#" aria-controls="activitylog_table" data-dt-idx="2" tabindex="0" class="page-link">1</a>
</li><li class="paginate_button page-item "><a href="#" aria-controls="activitylog_table" data-dt-idx="3" tabindex="0" class="page-link">2</a>
</li><li class="paginate_button page-item "><a href="#" aria-controls="activitylog_table" data-dt-idx="4" tabindex="0" class="page-link">3</a>
</li><li class="paginate_button page-item "><a href="#" aria-controls="activitylog_table" data-dt-idx="5" tabindex="0" class="page-link">4</a>
</li><li class="paginate_button page-item "><a href="#" aria-controls="activitylog_table" data-dt-idx="6" tabindex="0" class="page-link">5</a>
</li><li class="paginate_button page-item disabled" id="activitylog_table_ellipsis"><a href="#" aria-controls="activitylog_table" data-dt-idx="7" tabindex="0" class="page-link">…</a>
</li><li class="paginate_button page-item "><a href="#" aria-controls="activitylog_table" data-dt-idx="8" tabindex="0" class="page-link">67</a>
</li><li class="paginate_button page-item next" id="activitylog_table_next">
<a href="#" aria-controls="activitylog_table" data-dt-idx="9" tabindex="0" class="page-link">
<i class="la la-angle-right"></i>
</a><
/li><li class="paginate_button page-item last" id="activitylog_table_last"><a href="#" aria-controls="activitylog_table" data-dt-idx="10" tabindex="0" class="page-link"><i class="la la-angle-double-right"></i></a></li></ul></div></div>

Sub Extract ()

Dim ie As Object
Dim btn As Object
Dim temp As Object
Dim Table As Object
Dim tRows As Object
Dim rNum As Integer
Dim cNum As Integer
Dim tCells As Object
Dim np As Variant
Dim numPages As String
Dim url As String
Dim pages As MSHTML.IHTMLElementCollection
Dim i As Integer
Dim NextHref As String
Dim NextURL As String

url = "https://admin.timesheetmobile.com/mr2/new/activity.php"

Set ie = CreateObject("InternetExplorer.Application")

ie.Visible = False

' Navigate to the webpage
ie.navigate url

 ' Wait while the page is loading
 While ie.Busy
      DoEvents
 Wend
 Application.Wait DateAdd("s", 3, Now)
 ' Wait an additional 3 seconds for good measure


Dim numPages As String
Set temp = ie.document.getElementsByClassName("dataTables_info")

numPages = temp(0).innerText

pos = Mid(numPages, 20, 3)
np = Round(pos, 0)

 rNum = 1
 cNum = 1

  Set Table = ie.document.getElementsByClassName("dataTables_scrollBody")

    Set tRows = Table(0).getElementsByTagName("tr")

    Set tHead = Table(0).getElementsByTagName("th")

    For Each h In tHead
        Sheet6.Cells(rNum, cNum).Value = h.innerText
        cNum = cNum + 1
    Next

    rNum = rNum + 1
    cNum = 1

For i = 1 To np

        Set tCells = r.getElementsByTagName("td")

        For Each c In tCells

            Sheet6.Cells(rNum, cNum).Value = c.innerText

            cNum = cNum + 1
        Next

        rNum = rNum + 1
        cNum = 1

    Next


    Set btn = ie.document.getElementsByClassName("paginate_button page-item next")
    btn(0).Click



Next

 ' Clear the ie object. This probably isn't necessary, but helps
 ' clean things up
Set ie = Nothing

End Sub

Я бы хотел извлечь все данные со страниц 1 до np. Это возможно? Или есть другие способы сделать это?

1 Ответ

0 голосов
/ 14 мая 2019

Это немного псевдокод, но он описывает выделение количества страниц и затем нажатие следующей кнопки до тех пор, пока не будут просмотрены все страницы.Я использую селектор идентификатора для следующей кнопки, так как он работает быстрее и надежнее, чем селектор составного класса.

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

В зависимости от того, как вы хотите записать информацию таблицы, вы можете хранить информацию в массиве;в противном случае возможно выписать таблицы во время цикла, найдя следующую доступную строку в листе ..... Я покажу, как записать следующую доступную строку в предыдущем ответе SO здесь . В этом ответе показано, как использовать буфер обмена для публикации таблицы в следующей строке во время цикла.

Лучше было бы, если бы вы могли проходить проверку подлинности и получать всю информацию через XHR просит, но невозможно сказать, возможно ли это в настоящее время.

Option Explicit
Public Sub test()
    Dim ie As New InternetExplorer, numPages As Long, length As Long

    With ie
        .Visible = True
        .navigate "loginURL"

        While .Busy Or .readyState < 4: DoEvents: Wend
        'login stuff here ....

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

        With .document
            length = .querySelectorAll(".page-link").length
            numPages = CLng(.querySelectorAll(".page-link").item(length - 3).innerText)
            'Assume on page 1 and extract last page number from length -2 (ignoring data-dt-idx="10" and data-dt-idx="9"
            'do something with page 1 then click through next button for num of pages
            For i = 2 To numPages
                .querySelector("#activitylog_table_next").Click
                .querySelector("[data-dt-idx='" & i + 1 & "']").click  'alternate
                While ie.Busy Or ie.readyState < 4: DoEvents: Wend
                'do something with other pages
            Next
            Stop '<=delete me later
        End With
        .Quit
    End With
End Sub

Чтобы установить 500 на страницу

ie.document.querySelector("[value='500']").Selected = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...