使用vba从网站上刮取数据
我试图从网站刮取数据: http : //uk.investing.com/rates-bonds/financial-futures通过VBA,像实时价格,即德国5 YR鲍勃,美国30Y T型债券,我已经尝试过Excelnetworking查询,但它只是刮了整个网站,但我只想刮掉率,有没有办法做到这一点?
有几种方法可以做到这一点。 这是我写的一个答案,希望在浏览关键词“从网站上抓取数据”时能够find所有的Internet Explorer自动化基础知识,但要记住没有什么值得作为您自己的研究(如果您不想坚持预先编写的代码,你无法自定义)。
请注意,这是一种方式 ,我不喜欢性能(因为它取决于浏览器的速度),但这是很好理解互联网自动化背后的理由。
1)如果我需要浏览网页,我需要一个浏览器! 所以我创build一个Internet Explorer浏览器:
Dim appIE As Object Set appIE = CreateObject("internetexplorer.application")
2)我要求浏览器浏览目标网页。 通过使用“.Visible”属性,我决定是否要浏览器执行其工作。 在构build代码的时候, Visible = True
是很好的,但是当代码工作在抓取数据的时候,每次都看不到它,所以Visible = False
。
With appIE .Navigate "http://uk.investing.com/rates-bonds/financial-futures" .Visible = True End With
3)网页需要一些时间加载。 所以,我会等待,同时它很忙…
Do While appIE.Busy DoEvents Loop
4)那么,现在页面被加载。 假设我想刮掉US30Y T-Bond的变化:我要做的就是点击Internet Explorer上的F12来查看网页的代码,然后使用指针(红色圆圈),点击元素我想刮一下看看怎样才能达到我的目的。
5)我应该做的是直截了当的。 首先,我将通过ID属性获取包含值的tr
元素:
Set allRowOfData = appIE.document.getElementById("pair_8907")
在这里,我将得到一个td
元素的集合(具体来说, tr
是一行数据, td
是它的单元格,我们正在寻找第8个元素,所以我会写:
Dim myValue As String: myValue = allRowOfData.Cells(7).innerHTML
为什么我写了7而不是8? 因为单元格的集合从0开始,所以第8个元素的索引是7(8-1)。 马上分析这一行代码:
-
.Cells()
让我访问td
元素; -
innerHTML
是包含我们寻找的值的单元格的属性。
一旦我们有了我们的价值,现在存储在myValue
variables中,我们可以closuresIE浏览器并通过将其设置为Nothing来释放内存:
appIE.Quit Set appIE = Nothing
那么,现在你有了自己的价值,你可以随心所欲地把它放到一个单元格中( Range("A1").Value = myValue
),或者放入一个表单的标签( Me.label1.Text = myValue
)。
我只想指出,这不是StackOverflow的工作方式:在这里您可以发布有关特定编码问题的问题,但是您应该先进行自己的search。 我之所以回答一个没有显示太多研究成果的问题,是因为我多次看到这个问题,回到了学习如何做的时候,我记得我希望能有更好的一些支持开始使用。 所以我希望这个答案只是一个“学习input”,根本不是最好/最完整的解决scheme,可以成为下一个用户遇到同样问题的支持。 因为我已经学会了如何编程,感谢这个社区,我喜欢认为你和其他初学者可以使用我的意见来发现美丽的编程世界。
享受你的练习;)
你可以使用winhttprequest对象,而不是Internet Explorer,因为它是好的加载数据,不包括图片n广告,而不是下载完整的网页,包括广告n图片那些使Internet Explorer对象比较winhttpRequest对象。
这个问题早就问过了。 但是我认为以下信息对于新手来说是有用的。 其实你可以很容易地从类名得到这样的值。
Sub ExtractLastValue() Set objIE = CreateObject("InternetExplorer.Application") objIE.Top = 0 objIE.Left = 0 objIE.Width = 800 objIE.Height = 600 objIE.Visible = True objIE.Navigate ("https://uk.investing.com/rates-bonds/financial-futures/") Do DoEvents Loop Until objIE.readystate = 4 MsgBox objIE.document.getElementsByClassName("pid-8907-last")(0).innerText End Sub
如果你是新来的networking抓取,请阅读这篇博文。
Web刮 – 基础知识
还有从网页中提取数据的各种技术。 这篇文章解释了几个例子。
Web刮 – 从网页收集数据