使用 Excel VBA 从 aspx 页面表中检索数据
Posted
技术标签:
【中文标题】使用 Excel VBA 从 aspx 页面表中检索数据【英文标题】:Retrieve data from a table of aspx page using Excel VBA 【发布时间】:2018-06-04 23:05:37 【问题描述】:我正在尝试使用 excel vba 从 aspx 页面检索表格数据。我知道如何从 URL 获取表格数据,但以下是主要问题。
问题
有一个 aspx 页面(比如 www.abc.aspx)。我目前在这个页面上。让这个页面成为page1。
现在我点击当前页面上的 page2 链接。值得注意的是,点击此链接后,旧网址(www.abc.aspx)没有变化,但内容发生了变化。(内容为page2)
如果您查看 page1 源代码
<form method="post" action="page1 url" id="Form1">
无论 page1 上的操作是什么(第 2 页点击),它都会发回相同的 page1 url。
那么,由于我不知道它的 URL,我如何在 excel VBA 中获取 page2 table 数据?
代码
这是我用来获取表格数据的。
我使用了 Internet Explorer 对象。然后导航到链接并将文档保存在 htmldoc 中。
ie.navigate "url"
Do While ie.READYSTATE <> READYSTATE_COMPLETE
Application.StatusBar = "Fetching data..."
DoEvents
Loop
Set htmldoc = ie.document
'Column headers
Set eleColth = htmldoc.getElementsByTagName("th")
j = 0 'start with the first value in the th collection
For Each eleCol In eleColth 'for each element in the td collection
ThisWorkbook.Sheets(1).Range("A1").Offset(i, j).Value = eleCol.innerText 'paste the inner text of the td element, and offset at the same time
j = j + 1 'move to next element in td collection
Next eleCol 'rinse and repeat
'Content
Set eleColtr = htmldoc.getElementsByTagName("tr")
'This section populates Excel
i = 0 'start with first value in tr collection
For Each eleRow In eleColtr 'for each element in the tr collection
Set eleColtd = htmldoc.getElementsByTagName("tr")(i).getElementsByTagName("td") 'get all the td elements in that specific tr
j = 0 'start with the first value in the td collection
For Each eleCol In eleColtd 'for each element in the td collection
ThisWorkbook.Sheets(1).Range("D3").Offset(i, j).Value = eleCol.innerText 'paste the inner text of the td element, and offset at the same time
j = j + 1 'move to next element in td collection
Next eleCol 'rinse and repeat
i = i + 1 'move to next element in td collection
Next eleRow 'rinse and repeat
ie.Quit
Set ie = Nothing
编辑:
示例
如果我们点击 Stack Overflow 中的问题 (https://***.com/questions) 现在点击第2页的问题(新链接是https://***.com/questions?page=2&sort=newest)
在我的例子中,如果我们点击page2,新链接不会更新。它是同一个旧链接。
编辑:我在这里发现了一个类似的问题
How do I get url that is hidden by javascript on external website?
谢谢。
【问题讨论】:
请添加minimal reproducible example。 我在上面的问题中添加了检索表数据的代码。 @MaximilianPeters 我现在也举了一个例子。 如果页面是纯 html,那么来自 page2 的数据应该已经加载,只是隐藏。你应该能够得到它们。如果页面使用一些动态引擎,比如 Angular,那可能会更复杂,因为数据在附加的 javascript 文件中。您必须单击该 page2 按钮或在该 JS 文件中查找您的数据。 @EganWolf 是aspx 【参考方案1】:好吧,我很同情,有一种思想流派(包括Tim Berners-Lee)说每个单独的页面都应该有自己的URI 和that these don't change。
但是网站管理员可以而且确实会搞砸你。他们可以重定向您的 HTTP 请求,并且可以像您的情况一样混淆导航。他们可以重写 HTTP 请求。
你有两个选择
选项 1 - 让 Internet Explorer 为您解析新内容
因此,如果内容在屏幕上可见,那么它必须在文档对象模型 (DOM) 中。在 IE 中,或者实际上在 Chrome 中,可以右键单击并获取上下文菜单,然后选择 Inspect 以查看该元素在 DOM 中的位置。
我认为您的代码展示了足够的专业知识来深入研究。但是,有时某些网站喜欢禁用“检查”菜单选项以避免程序员四处寻找。 (编辑:就像你的情况一样,我已经阅读了 cmets)
选项 2 - 使用 Fiddler 等 HTTP 嗅探工具检测 HTTP 重定向/重写
正如我上面所说,HTTP 请求可以由 Web 服务器重写和重定向,但 HTTP protocol does give notifications of redirects.有工具可以检测到这一点。一个流行的工具是Fiddler,今天我发现有一个特定的IE Fiddler add-on。
说实话,尽管浏览器本身附带的开发者工具,尤其是 Chrome(Ctrl+Shift+I,然后是“网络”选项卡),显示网络流量的详细程度越来越接近任何嗅探工具。
很抱歉,您被否决了,这似乎是一个非常合理的问题。
【讨论】:
page1 的 onclick 属性连接到 _doPostBack() 函数,该函数接受 eventTarget 和 eventArgument 并提交相同的表单以及更新的变量。还有一个 viewstate 隐藏变量。那么我该如何获取数据来自 page2,因为我不知道 page2 网址? _doPostBack() 及其参数是位于 HTTP Post 之上的 aspx 页面协议的一部分;所以忽略它们并使用 sniffer.to 查看底层 HTTP Post(上面的选项 2)。完成此操作后,将嗅探器屏幕截图/内容发布到主要问题的正文中, 我使用 Chrome 开发人员工具尝试了这个,并在点击 page1 上的 page2 链接时转到 Network 并显示相同的 page1 url。 好的,试试 Fiddler。或者,仍然使用 Chrome 看到这些 SO ***.com/questions/4734374/… 和 ***.com/questions/10987453/… 他们详细说明了“保留日志”复选框。 如何使用提琴手?你能解释一下吗【参考方案2】:鸟瞰问题:
你有一个似乎放不下的要求: 使用 Excel VBA。 我强调这一点,因为答案通常会提供满足 OP 中发布的替代前提的解决方案。
一种可能的解决方案:
因此,您必须将 Excel VBA 与另一个能够显示 html 重定向或模糊 URL 内容的工具连接。
Google Chrome 开发者工具显示所有内容,您可以使用Selenium VBA Wrapper 与 Excel VBA 很好地连接 Google Chrome。下载here。
它非常通用,例如,你可以看到how to scrape web data。
关于获取混淆的内容,有一些项目可能会有所帮助
how to get innerHTML of whole page in selenium driver?(不是 VBA,但很有用)
Selenium + VBA to Control Chrome
(注意:包装器的作者通常急于用 SO 回答,而且他的回答很准确)。
我猜是 YMMV,总是有人尝试obfuscate their data,使用各种技术,而且通常是有充分理由的......
如果您有 http://www.abc.aspx 的真实示例,可能会有所帮助。
【讨论】:
以上是关于使用 Excel VBA 从 aspx 页面表中检索数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 vba 从具有多个数据字段的 excel 数据透视表中删除小计