gpt4 book ai didi

excel - 如何使用 XML HTTP 请求在 Visual Basic for Applications 中提取 Web 数据?

转载 作者:行者123 更新时间:2023-12-04 20:52:24 28 4
gpt4 key购买 nike

Version: Microsoft Visual Basic for Applications 7.1


我正在从事一个小型数据挖掘/网络数据提取个人项目。不过,我的问题是关于数据提取。
使用 IE 从网页中提取数据是可行的,但运行速度很慢,因此我倾向于使用 XML HTTP 请求。然而,当我在一个我打算工作的网站上尝试它时,除了一些静态内容之外,我无法提取我需要的数据。检查响应文本后,我发现它不包含我需要的数据。可能它是由 JavaScript 或类似技术生成的。我不确定这些脚本是否像在 Web 浏览器中一样使用 XML HTTP 请求在 VBA 中呈现。
此外,有趣的是,在从开发人员工具 > 网络检查网页时,它提供了 Request URL其中响应包含我需要的大部分数据,但它是 JSON 格式。我不知道如何解析它,但我只是提供了此信息,因此您可以指出正确的方向,以防万一使用 XML HTTP 请求从动态网页中提取数据是不可能的。
我希望你能花几分钟看看我的代码以及我可能做错的地方。
非常感谢大家。我真的很感谢你的帮助。
这是我正在尝试做的基本想法:
使用 XML(无法提取所需数据):
Option Explicit

Sub dataMinExProject_XML()

Dim xmlPage As MSXML2.XMLHTTP60
Dim htmlDoc As MSHTML.HTMLDocument
Dim coName As MSHTML.IHTMLElement
Dim secSym As MSHTML.IHTMLElement
Dim closePrice As MSHTML.IHTMLElement
Dim URL As String

URL = "https://www.pse.com.ph/stockMarket/companyInfo.html?id=260&security=468&tab=0"

Set xmlPage = New MSXML2.XMLHTTP60
With xmlPage
.Open "POST", URL, False
.send
End With

Do Until xmlPage.ReadyState = 4
DoEvents
Loop

Set htmlDoc = New MSHTML.HTMLDocument
htmlDoc.body.innerHTML = xmlPage.responseText

Set coName = htmlDoc.getElementById("comTopInfoHead").Children(0)
Set secSym = htmlDoc.getElementById("secSymbol")
Set closePrice = htmlDoc.getElementById("headerLastTradePrice")

Debug.Print "Company Name: ", """" & coName.innerText & """"
Debug.Print "Security Symbol: ", """" & secSym.innerText & """"
Debug.Print "Closing Price: ", """" & closePrice.innerText & """"

xmlPage.abort
Set xmlPage = Nothing
MsgBox ("alright!")

End Sub
Immediate Window

Company Name: "BDO Unibank, Inc."
Security Symbol: ""
Closing Price: " "
在检查即时窗口时,它显示 Security SymbolClosing Price没有被提取出来。
只是为了比较,为了证明要提取的数据存在,我这里也提供了我的代码,它使用了一个IE的实例。
使用 IE(数据已提取但运行速度相对较慢):
Option Explicit

Sub dataMinExProject_IE()

Dim ieApp As SHDocVw.InternetExplorer
Dim htmlDoc As MSHTML.HTMLDocument
Dim coName As MSHTML.IHTMLElement
Dim secSym As MSHTML.IHTMLElement
Dim closePrice As MSHTML.IHTMLElement
Dim URL As String

URL = "https://www.pse.com.ph/stockMarket/companyInfo.html?id=260&security=468&tab=0"

Set ieApp = New SHDocVw.InternetExplorer
With ieApp
.Navigate (URL)
.Visible = vbTrue
End With

Do Until ieApp.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop

Set htmlDoc = ieApp.Document

Set coName = htmlDoc.getElementById("comTopInfoHead").Children(0)
Set secSym = htmlDoc.getElementById("secSymbol")
Set closePrice = htmlDoc.getElementById("headerLastTradePrice")

Do Until secSym.innerText <> vbNullString And closePrice.innerText <> vbNullString
Loop
DoEvents

Debug.Print "Company Name: ", """" & coName.innerText & """"
Debug.Print "Security Symbol: ", """" & secSym.innerText & """"
Debug.Print "Closing Price: ", """" & closePrice.innerText & """"

ieApp.Quit
Set ieApp = Nothing
MsgBox ("alright!")

End Sub
Immediate Window

Company Name: "BDO Unibank, Inc."
Security Symbol: "BDO"
Closing Price: "130.50"
查看立即窗口,它表明它已成功提取数据。然而,正如我之前所说,它的糟糕表现让我考虑了其他选择。

References:

Web Scraping of Masked URL Using VBA

最佳答案

处理 HTTP 请求是要走的路。正如您所说,IE 速度慢且效率低下。
一旦你找到了返回你感兴趣的数据作为响应的请求,你的工作就相对容易了,它很可能涉及以下之一:

  • 该请求返回一个 html 页面作为响应。在这种情况下,您应该使用 Microsoft HTML Object Library ,将响应 HTML 分配给 HTMLDocument并使用现有方法解析对象。为此,您需要引用 Microsoft HTML Object Library .
  • 请求返回 JSON字符串。在这种情况下,您可以将响应存储在字符串变量中,并使用 VBA JSON 将其解析为 json 对象。 .链接中给出的说明和示例非常有用。使用在线 JSON 查看器了解响应的结构,您将能够提取所需的任何信息。为此,您需要引用 Microsoft Scripting Runtime以及 VBA JSON当然是模块。
  • 两者的结合。例如,某些请求可能会返回一个 HTML 页面作为响应,其中包含 JSON 格式的数据。其他人可能会返回 JSON 字符串,其中包含的项目之一可能是 HTML 表格。在这种情况下,上述工作流程的组合就可以解决问题。

  • 就请求本身而言,请确保使用对请求至关重要的 header 。 header Content-Type:是其中之一,它对 POST 至关重要要求。您可以使用 .setRequestHeader方法。包含请求参数的请求正文也是必不可少的。我建议你使用 WinHTTP Services, version 5.1为您的要求。
    一旦掌握了这些,您就可以完全控制要检索的数据。

    关于excel - 如何使用 XML HTTP 请求在 Visual Basic for Applications 中提取 Web 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55596265/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com