Версия: Microsoft Visual Basic для приложений 7.1
Я работаю над небольшим персональным проектом по извлечению и извлечению веб-данных. Мой вопрос касается извлечения данных.
Извлечение данных с веб-страницы с использованием IE работает, но выполняется очень медленно, и по этой причине я склоняюсь к использованию XML-HTTP-запросов. Однако, когда я попробовал это на веб-сайте, над которым я планирую работать, я не мог извлечь данные, которые мне нужны, за исключением некоторого статического содержимого. Изучив текст ответа, я обнаружил, что он не содержит данных, которые мне нужны. Вероятно, это генерируется JavaScript или аналогичными технологиями. Я не уверен, что эти сценарии отображаются в VBA с использованием XML-запросов XML, как в веб-браузерах.
Также интересно отметить, что при просмотре веб-страницы из Developer Tools> Network он предоставляет URL-адрес запроса , в котором ответ содержит большую часть данных, которые мне нужны, но находятся в JSON. формат. Я не знаю, как его проанализировать, но я просто предоставил эту информацию, чтобы вы могли указать мне правильное направление на тот случай, если извлечь данные из динамической веб-страницы с помощью HTTP-запроса XML невозможно.
Я надеюсь, что вы можете потратить пару минут, чтобы увидеть мой код и узнать, где я мог сделать это неправильно.
Спасибо всем большое. Буду очень признателен за вашу помощь.
Вот основная идея того, что я пытаюсь сделать:
С XML (невозможно извлечь необходимые данные):
Option Explicit
Sub dataMinExProject_XML()
Dim xmlPage As MSXML2.XMLHTTP60
Dim htmlDoc As MSHTML.HTMLDocument
Dim coName As MSHTML.IHTMLElement
Dim secSym As MSHTML.IHTMLElement
Dim closePrice As MSHTML.IHTMLElement
Dim URL As String
URL = "https://www.pse.com.ph/stockMarket/companyInfo.html?id=260&security=468&tab=0"
Set xmlPage = New MSXML2.XMLHTTP60
With xmlPage
.Open "POST", URL, False
.send
End With
Do Until xmlPage.ReadyState = 4
DoEvents
Loop
Set htmlDoc = New MSHTML.HTMLDocument
htmlDoc.body.innerHTML = xmlPage.responseText
Set coName = htmlDoc.getElementById("comTopInfoHead").Children(0)
Set secSym = htmlDoc.getElementById("secSymbol")
Set closePrice = htmlDoc.getElementById("headerLastTradePrice")
Debug.Print "Company Name: ", """" & coName.innerText & """"
Debug.Print "Security Symbol: ", """" & secSym.innerText & """"
Debug.Print "Closing Price: ", """" & closePrice.innerText & """"
xmlPage.abort
Set xmlPage = Nothing
MsgBox ("alright!")
End Sub
Immediate Window
Company Name: "BDO Unibank, Inc."
Security Symbol: ""
Closing Price: " "
При рассмотрении Непосредственного окна он показывает, что Security Symbol
и Closing Price
не были извлечены.
Просто для сравнения и чтобы доказать, что извлекаемые данные существуют, я также предоставил здесь свой код, который использует экземпляр IE.
С IE (данные извлекаются, но работает относительно медленно):
Option Explicit
Sub dataMinExProject_IE()
Dim ieApp As SHDocVw.InternetExplorer
Dim htmlDoc As MSHTML.HTMLDocument
Dim coName As MSHTML.IHTMLElement
Dim secSym As MSHTML.IHTMLElement
Dim closePrice As MSHTML.IHTMLElement
Dim URL As String
URL = "https://www.pse.com.ph/stockMarket/companyInfo.html?id=260&security=468&tab=0"
Set ieApp = New SHDocVw.InternetExplorer
With ieApp
.Navigate (URL)
.Visible = vbTrue
End With
Do Until ieApp.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
Set htmlDoc = ieApp.Document
Set coName = htmlDoc.getElementById("comTopInfoHead").Children(0)
Set secSym = htmlDoc.getElementById("secSymbol")
Set closePrice = htmlDoc.getElementById("headerLastTradePrice")
Do Until secSym.innerText <> vbNullString And closePrice.innerText <> vbNullString
Loop
DoEvents
Debug.Print "Company Name: ", """" & coName.innerText & """"
Debug.Print "Security Symbol: ", """" & secSym.innerText & """"
Debug.Print "Closing Price: ", """" & closePrice.innerText & """"
ieApp.Quit
Set ieApp = Nothing
MsgBox ("alright!")
End Sub
Immediate Window
Company Name: "BDO Unibank, Inc."
Security Symbol: "BDO"
Closing Price: "130.50"
Глядя на «Немедленное окно», оно показывает, что оно успешно извлекло данные. Однако, как я уже говорил ранее, его низкая производительность заставила меня взглянуть на другие варианты.
Ссылки:
Веб-очистка маскированного URL с использованием VBA