Recupera pagina web incluso contenuto AJAX

Sto usando VBA per recuperare i prezzi delle azioni dal sito Web ASX (www.asx.com.au) per un po ‘di tempo, tuttavia, il mio script non funziona più come il sito web è stato aggiornato e ora utilizza javascript per creare il contenuto.

Di conseguenza, lo script mostrato di seguito restituisce ora le sezioni anziché il contenuto della pagina.

Il VBA (piuttosto standard di borsa):

With CreateObject("WINHTTP.WinHTTPRequest.5.1") .Open "GET", strURL, False .send http.body.innerHTML = .responseText End With 

E il .responseText contiene cose come:

  var urlArray = window.location.hash.split('/'); if (urlArray != null) { var var1 = urlArray[1]; window.location = "http://www.asx.com.au/asx/research/companyInfo.do?by=asxCode&asxCode=" + var1; }  

Come posso recuperare la pagina Web come si vedrebbe nel browser? L’unica cosa che non ho provato è la creazione di un object browser in grado di catturare l’HTML da quello.

Il sito Web http://www.asx.com.au ha un’API disponibile. Ho aperto una pagina in Chrome per una delle aziende – AMC dal link http://www.asx.com.au/asx/share-price-research/company/AMC , quindi ho aperto la finestra Strumenti per sviluppatori ( F12 ), Rete scheda e ha esaminato XHR nell’elenco dopo il caricamento della pagina dopo aver fatto clic su ciascuna sezione. Ho trovato diversi URL che restituiscono dati in formato JSON:

Per vedere una struttura dei dati presentati, i contenuti della risposta possono essere copiati e incollati in qualsiasi visualizzatore JSON (ad es. Questo strumento online http://jsonviewer.stack.hu ).

È ansible utilizzare il codice VBA di seguito per analizzare la risposta dall’URL https://www.asx.com.au/asx/1/share/AMC/prices e il risultato di output. Importare il modulo JSON.bas nel progetto VBA per l’elaborazione JSON.

 Option Explicit Sub Test_query_ASX() Const Transposed = False ' Output option Dim sCode As String Dim sInterval As String Dim sCount As String Dim sJSONString As String Dim vJSON As Variant Dim sState As String Dim aRows() Dim aHeader() sCode = "AMC" sInterval = "daily" sCount = "10" ' Get JSON via API With CreateObject("MSXML2.XMLHTTP") .Open "GET", "https://www.asx.com.au/asx/1/share/" & sCode & "/prices?interval=" & sInterval & "&count=" & sCount, False .Send sJSONString = .ResponseText End With ' Parse JSON response JSON.Parse sJSONString, vJSON, sState If sState = "Error" Then MsgBox "Invalid JSON" Exit Sub End If ' Pick core data vJSON = vJSON("data") ' Convert each data set to array JSON.ToArray vJSON, aRows, aHeader ' Output array to worksheet With ThisWorkbook.Sheets(1) .Cells.Delete If Transposed Then Output2DArray .Cells(1, 1), WorksheetFunction.Transpose(aHeader) Output2DArray .Cells(1, 2), WorksheetFunction.Transpose(aRows) Else OutputArray .Cells(1, 1), aHeader Output2DArray .Cells(2, 1), aRows End If .Columns.AutoFit End With MsgBox "Completed" End Sub Sub OutputArray(oDstRng As Range, aCells As Variant) With oDstRng .Parent.Select With .Resize(1, UBound(aCells) - LBound(aCells) + 1) .NumberFormat = "@" .Value = aCells End With End With End Sub Sub Output2DArray(oDstRng As Range, aCells As Variant) With oDstRng .Parent.Select With .Resize( _ UBound(aCells, 1) - LBound(aCells, 1) + 1, _ UBound(aCells, 2) - LBound(aCells, 2) + 1) .NumberFormat = "@" .Value = aCells End With End With End Sub 

Eseguire Sub Test_query_ASX() per elaborare i dati. L’output di Sheet1 per me è il seguente:

produzione

Con questo esempio è ansible estrarre i dati necessari dalle risposte JSON dagli URL elencati. A proposito, lo stesso approccio utilizzato in questo e in questo risponde.

AGGIORNARE

Dopo alcune modifiche sul sito web è necessario utilizzare https://www.asx.com.au/asx/... anziché http://www.asx.com.au/b2c-api/... , quindi ho corretto tutti gli URL precedenti.