提问人:SublimeDubs 提问时间:7/17/2023 最后编辑:Mayukh BhattacharyaSublimeDubs 更新时间:7/17/2023 访问量:46
通过Excel VBA进行网页抓取
Web Scraping via Excel VBA
问:
我正在尝试在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
答:
我不是专家,但如果这有帮助:
你的定义中有错别字。你有htlm而不是html。然后,您还将响应文本放入字符串“response”中,但您永远不会将其转换为用于 html 变量的 HTML DOM 对象。也许在那之后加上这个” 响应 = StrConv(......”线。
html.body.innerHTML = 响应
评论
发布的 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
评论