通过Excel VBA进行网页抓取

Web Scraping via Excel VBA

提问人:SublimeDubs 提问时间:7/17/2023 最后编辑:Mayukh BhattacharyaSublimeDubs 更新时间:7/17/2023 访问量:46

问:

我正在尝试在VBA中设置一个宏,以从指定的网站中提取价格并在我的工作表中更新价格。我在VBA或HTML方面不是很有经验,所以我按照YouTube上的一些教程开始了。

我完全按照教程进行操作,但更改了网站。运行代码时,我需要运行时错误 424 对象。

当我调试错误时,它说价格为空。我尝试使用最接近我要返回到 excel 的值的类。扩展我放入代码中的类,它显示了我想要作为文本返回的价格的值。因此,据我所知,我的代码应该识别文本并将其分配给价格。我不太确定从这里去哪里。任何帮助将不胜感激。我将在下面发布我的代码:

Sub Get_Web_Data()

Dim request As Object
Dim response As String
Dim htlm As New HTMLDocument
Dim website As String
Dim price As Variant

'Website to go to.
website = "https://www.taptools.io/portfolio"

'Create the object that will make the webpage request.

Set request = CreateObject("MSXML2.XMLHTTP")

'Where to go and how to go there
request.Open "GET", website, False

'Get fresh data.
request.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"

'Send the request for the webpage.

request.send

'Put the wepage into an html object to make data references easier.

response = StrConv(request.responseBody, vbUnicode)

'Get the price from the specified element on the page.

price = HTML.getElementsByClassName("portfolio__table__content__right-align portfolio__table__content__stack portfolio__table__content__price")(0).innerText

'Output the price into a message box.
MsgBox price

End Sub
html excel VBA

评论

0赞 Jeremy Thompson 7/17/2023
这是一种糟糕的方法,您将面临很多问题。Excel VBA 具有旧的 IE6 WebBrowser,当今的网站都无法正常运行。另外,请花时间学习如何格式化您的问题。PS 这可能会有所帮助 stackoverflow.com/a/11174989/495455
0赞 Shane S 7/17/2023
我不会使用 VBA,而是在 excel 中使用电源查询。例如比特币,另一个投资数据
0赞 Shane S 7/17/2023
另一个更好的工具是 python。如果数据来自html并且已经在表格中,那么你可以使用pandas pd.read_html

答:

0赞 ninthbit 7/17/2023 #1

我不是专家,但如果这有帮助:

你的定义中有错别字。你有htlm而不是html。然后,您还将响应文本放入字符串“response”中,但您永远不会将其转换为用于 html 变量的 HTML DOM 对象。也许在那之后加上这个” 响应 = StrConv(......”线。

html.body.innerHTML = 响应

评论

0赞 Community 7/17/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 Zwenn 7/17/2023 #2

发布的 url 后面是一个登录页面。我想你想从登录后面的页面获得价格。所以我无法测试以下代码是否有效。特别是我不知道这条线是否会做你想要的:
price = doc.getElementsByClassName("portfolio__table__content__right-align portfolio__table__content__stack portfolio__table__content__price")(0).innerText

下载的 html 文档中的价格可能不可用,因为 xhr(XML HTTP 请求)只能处理静态文档。如果价格将由 JavaScript 放置到 html 代码中,您必须找到另一种获取它的方法。在这种情况下,您将再次收到运行时错误。424 object required

Sub Get_Web_Data()

  Dim url As String
  Dim doc As Object
  Dim price As String
  
  url = "https://www.taptools.io/portfolio"
  Set doc = CreateObject("htmlFile")
  
  With CreateObject("MSXML2.XMLHTTP.6.0")
    .Open "GET", url, False
    .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
    .send
    
    If .Status = 200 Then
      doc.body.innerhtml = .responseText
      price = doc.getElementsByClassName("portfolio__table__content__right-align portfolio__table__content__stack portfolio__table__content__price")(0).innerText
    Else
      MsgBox "Page not loaded. HTML status: " & .Status
    End If
  End With
  
  MsgBox price
End Sub