Как извлечь полную таблицу, которая загружается дальше при прокрутке вниз? - PullRequest
2 голосов
/ 21 июня 2019

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

Ваша помощь будет очень признательна.

Спасибо.

Sub pullhistoricalprice()

    Dim xmlpage As New MSXML2.XMLHTTP60
    Dim htmldoc As New MSHTML.HTMLDocument
    Dim objTable As Object
    Dim lRow As Long
    Dim lngTable As Long
    Dim lngRow As Long
    Dim lngCol As Long
    Dim ActRw As Long

    xmlpage.Open "GET", "https://finance.yahoo.com/quote/AAPL/history?period1=345400200&period2=1561046400&interval=1d&filter=history&frequency=1d", False
    xmlpage.send
    htmldoc.body.innerHTML = xmlpage.responseText
    htmldoc.parentWindow.scrollBy 0, 100
    Application.Wait Now + TimeValue("00:00:03")

    With htmldoc.body
        Set objTable = .getElementsByTagName("table")
        For lngTable = 2 To objTable.Length - 2
            For lngRow = 0 To objTable(lngTable).Rows.Length - 1
                For lngCol = 0 To objTable(lngTable).Rows(lngRow).Cells.Length - 1
                    ThisWorkbook.Sheets("Sheet1").Cells(ActRw + lngRow + 1, lngCol + 1) = objTable(lngTable).Rows(lngRow).Cells(lngCol).innerText
                Next lngCol
            Next lngRow
            ActRw = ActRw + objTable(lngTable).Rows.Length + 1
        Next lngTable
    End With

End Sub

1 Ответ

0 голосов
/ 21 июня 2019

Вы можете взять любой текущий файл cookie, полученный с помощью кнопки загрузки, а затем передать его в WinHttp-запросе на файл, который вы затем загрузите в двоичном формате.

Cookie находится в заголовках записанного запроса (средства разработки - нажмите F12, чтобы открыть, перейдите на вкладку сети и нажмите «загрузить») - найдите выполненный запрос и посмотрите cookie

enter image description here

Теоретически можно извлечь этот файл cookie по предварительному запросу. В противном случае этот код будет представлять собой временное решение с учетом даты истечения срока действия файлов cookie.

Public Sub Test()
    DownloadFile "C:\Users\User\Desktop\", "https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=345400200&period2=1561046400&interval=1d&events=history&crumb=gdzXUTfT0l/"
End Sub
Public Function DownloadFile(ByVal downloadFolder As String, ByVal downloadURL As String) As String
    Dim http As Object, tempArr As Variant
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
    http.Open "GET", downloadURL, False
    http.setrequestheader "cookie", "B=bujjnjpeetmah; APID=UP86674562-8245-11e9-8433-020167e61c30; PRF=t%3DAAPL%252BASLN%252BA; GUCS=AQBqKRDM; GUC=AQABAQFdDhdd3UImCwVo&s=AQAAADRx8bGn&g=XQzIlw"
    http.send
    On Error GoTo errhand
    With CreateObject("ADODB.Stream")
        .Open
        .Type = 1
        .write http.responseBody
        .SaveToFile downloadFolder & "data.csv", 2  '< "/" on enter of downloadFolder. 2 for overwrite which is Ok if no file modifications.
        .Close
    End With
    DownloadFile = downloadFolder & tempArr
    Exit Function
errhand:
    If Err.Number <> 0 Then
        Debug.Print Err.Number, Err.Description
        MsgBox "Download failed"
    End If
    DownloadFile = vbNullString
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...