将由JavaScript生成的网页内容刮至Excel

我正在使用VBA和MSXML抓取一些网页内容,所以我知道基本知识。 但是现在我想从JavaScript生成的网页获取数据。 我不能给你确切的链接,因为它是私人的,但我可以描述它 – 基本上,有容器标题和一些图像,下面是表,它dynamic加载(圆圈),但不更新(所以他们只加载一次)。 如果在浏览器中查看开源代码,则无法find这些表,只能find图像的容器和标题/ src。 但是,如果你点击表格并select“检查元素”,你可以看到<th <tr> <td>等典型结构。我知道的方法:

1)保存页面,然后刮 – 可能不是最好的解决scheme。

如果我有他们的url列表,有没有快速的方式来保存所有的网页?

2)通过VBA使用Internet Explorer控件,等待页面加载,然后像平常一样获取元素 – 但是对于我来说(?)似乎很慢 – 即使加载了0.5s,也只有一页25s。

也许我应该closures一些减缓加载速度的东西?
你能检查什么是错的?

这里是我发现的代码:

 Sub FuturesScrap3(ByVal URL As String) Dim HTMLDoc As New HTMLDocument Dim AnchorLinks As Object Dim tdElements As Object Dim tdElement As Object Dim AnchorLink As Object Dim lRow As Long Dim oElement As Object Dim oIE As InternetExplorer Set oIE = New InternetExplorer oIE.navigate URL oIE.Visible = True Do Until (oIE.readyState = 4 And Not oIE.Busy) DoEvents Loop 'Wait for Javascript to run Application.Wait (Now + TimeValue("0:01:00")) HTMLDoc.body.innerHTML = oIE.document.body.innerHTML With HTMLDoc.body Set AnchorLinks = .getElementsByTagName("a") Set tdElements = .getElementsByTagName("td") ' For Each AnchorLink In AnchorLinks Debug.Print AnchorLink.innerText Next AnchorLink End With lRow = 1 For Each tdElement In tdElements Debug.Print tdElement.innerText Cells(lRow, 1).Value = tdElement.innerText lRow = lRow + 1 Next 'Clicking the Month tab For Each oElement In oIE.document.all If Trim(oElement.innerText) = "Month" Then oElement.Focus oElement.Click End If Next oElement Do Until (oIE.readyState = 4 And Not oIE.Busy) DoEvents Loop 'Wait for Javascript to run Application.Wait (Now + TimeValue("0:01:00")) HTMLDoc.body.innerHTML = oIE.document.body.innerHTML With HTMLDoc.body Set AnchorLinks = .getElementsByTagName("a") Set tdElements = .getElementsByTagName("td") ' For Each AnchorLink In AnchorLinks Debug.Print AnchorLink.innerText Next AnchorLink End With lRow = 1 For Each tdElement In tdElements Debug.Print tdElement.innerText Cells(lRow, 2).Value = tdElement.innerText lRow = lRow + 1 Next tdElement End sub 

3)使用像Selenium的networking驱动程序 – 找不到适当的例子。 如果你从头开始给我一些东西,比如通过classname从元素中获取数据,那将会很棒。

4)对我来说是未知的,但可能是最快速的获取数据直接从JSvariables/数组,这是用来build立这些表。 我听说你可以用JavaScript连接VBA,但没有find任何正确的例子如何获取数据。

所有的解决scheme都应该在VBA范围内。 我想知道什么是最快的方法。

谢谢您的意见。 @Marc,不,不可能使用networking查询/电力查询的“从网站导入”的数据,只有标题。

我编辑了一下代码 – 有1分钟(!)延迟(也许作者在页面加载脚本时加了延迟)。

 Sub FuturesScrap3(ByVal URL As String) Dim HTMLDoc As New HTMLDocument Dim AnchorLinks As Object Dim tdElements As Object Dim tdElement As Object Dim AnchorLink As Object Dim lRow As Long Dim oElement As Object Dim oIE As InternetExplorer Set oIE = New InternetExplorer oIE.navigate URL oIE.Visible = True Do Until (oIE.readyState = 4 And Not oIE.Busy) DoEvents Loop 'Wait for Javascript to run - 1 second is enough in my case Application.Wait (Now + TimeValue("0:00:01")) HTMLDoc.body.innerHTML = oIE.document.body.innerHTML With HTMLDoc.body Set AnchorLinks = .getElementsByTagName("a") Set tdElements = .getElementsByTagName("td") ' For Each AnchorLink In AnchorLinks Debug.Print AnchorLink.innerText Next AnchorLink End With lRow = 1 For Each tdElement In tdElements Debug.Print tdElement.innerText Cells(lRow, 1).Value = tdElement.innerText lRow = lRow + 1 Next 'Clicking the Month tab For Each oElement In oIE.document.all If Trim(oElement.innerText) = "Month" Then oElement.Focus oElement.Click End If Next oElement Do Until (oIE.readyState = 4 And Not oIE.Busy) DoEvents Loop HTMLDoc.body.innerHTML = oIE.document.body.innerHTML With HTMLDoc.body Set AnchorLinks = .getElementsByTagName("a") Set tdElements = .getElementsByTagName("td") ' For Each AnchorLink In AnchorLinks Debug.Print AnchorLink.innerText Next AnchorLink End With lRow = 1 For Each tdElement In tdElements Debug.Print tdElement.innerText Cells(lRow, 2).Value = tdElement.innerText lRow = lRow + 1 Next tdElement End sub