尝试抓取数据

时间:2020-07-14 11:21:52

标签: excel vba web-scraping

我是对此的新手,因此尝试获取一些指导。我正在尝试在VBA中开发一些代码,这些代码将使Yahoo Finance的期权价格上涨。到目前为止,这是我能够汇总的内容:

Option Explicit

Sub Pull_Option_Price()

    Dim URL As String
    Dim IE As Object
    Dim HTML As Object
    Dim OptionPrice As Object

    Set IE = CreateObject("InternetExplorer.Application")
    
    IE.Visible = True

    URL = "https://ca.finance.yahoo.com/quote/SQ200717C00065000?p=SQ200717C00065000"

    IE.Navigate URL

    Do Until IE.ReadyState = 4: DoEvents: Loop

    Set HTML = CreateObject("HTMLFile")

    Debug.Print HTML.Document.getElementbyClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D 
    (ib)").innerText
    
    Set IE = Nothing

End Sub

每次运行代码时,都会在以下行中收到运行时错误438:

Debug.Print HTML.Document.getElementbyClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)").innerText

从到目前为止在各种论坛上所读的内容来看,我只能将IE版本较低(低于9)使用.getElementsbyClassName,而我的版本为11,并且出于任何原因,我都无法访问我相信可以让我以另一种方式做到这一点。

我还能如何刮擦网站以获得期权价格?

1 个答案:

答案 0 :(得分:1)

就像braX在他的评论getElementsByClassName()中所写,它生成一个节点集合。集合中的元素由方括号中的css类名区分。每个元素都有一个像数组一样的索引。第一个索引为0。您的节点集合只有一个元素。因此,必须使用索引0才能从集合中获取它。

另一个问题是HTML.Document。这是行不通的,因为HTML是您用行Set HTML = CreateObject("HTMLFile")创建的空html文档,并且您也引用了document。您可以直接在IE中使用该文档。

右行是:
Debug.Print IE.Document.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText

您可以使用IE,但是速度很慢:

Sub Pull_Option_Price()

  Dim url As String
  Dim IE As Object

  url = "https://ca.finance.yahoo.com/quote/SQ200717C00065000?p=SQ200717C00065000"
  
  Set IE = CreateObject("InternetExplorer.Application")
  IE.Visible = True
  IE.Navigate url
  Do Until IE.ReadyState = 4: DoEvents: Loop
  
  Debug.Print IE.Document.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText
End Sub

更快的选项:
如果没有动态内容需要在页面上加载,则可以使用更快的xml http请求。一个限制是getElementsByClassName()仅可通过与xhr的早期绑定来工作。因此,您需要对库的以下两个excel引用:
Microsoft HTML对象库
Microsoft XML,v6.0

Sub Pull_Option_Price_xhr()

  Dim xhr As MSXML2.XMLHTTP60
  Dim htmlDoc As MSHTML.HTMLDocument
  Dim url As String
  
  url = "https://ca.finance.yahoo.com/quote/SQ200717C00065000?p=SQ200717C00065000"
  
  Set xhr = New MSXML2.XMLHTTP60
  Set htmlDoc = New MSHTML.HTMLDocument
  
  xhr.Open "GET", url, False
  xhr.Send
  htmlDoc.body.innerHTML = xhr.responseText
  
  Debug.Print htmlDoc.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText
End Sub