【发布时间】:2021-10-24 00:07:49
【问题描述】:
我有用于加载 HTMLTable 的代码,但我最近有一个很大的列表,并意识到它只是拉到列表的顶部。当我在浏览器中向下滚动表格时,观察开发控制台的进一步调查显示多个“发布”请求。我正在讨论构建代码(如果可以的话)以尝试找到表中的最后一项,然后再次运行查询,但我想看看我是否可以“正确”解决根本问题而不是破解它。
我怎样才能模拟滚动和监控帖子请求或任何其他建议?
这是一些示例代码,但不幸的是,我不能将链接共享为仅作为 LAN 访问。注意:不需要登录,但如果不使用 IE 对象来生成与请求相关的 cookie(无法通过 CLI 发布),我无法弄清楚如何做到这一点。
Do Until InStr(1, IEObj.document.getElementById("gbox_tbl").innerHTML, "WAREHOUSE") > 0
DoEvents
Loop
Dim table As MSHTML.HTMLTable, HTMLCollection As IHTMLElementCollection
Set table = IEObj.document.getElementById("gbox_tbl")
Set ClipBoard = New MSForms.DataObject
Application.Wait (Now() + TimeValue("00:00:01"))
ClipBoard.SetText table.outerHTML
ClipBoard.PutInClipboard
Dim TempWS As Worksheet
Call WorksheetCreateDelIfExists("TempSheet")
Set TempWS = Worksheets("TempSheet")
TempWS.Activate
Range("A1").Select
ActiveSheet.Paste
'Stop
Dim UsedRng As Range
Set UsedRng = GetUsedRange(TempWS)
UsedRng.Copy
Dim FindSMPDestWS As Worksheet, wss As Worksheet, SearchTerm As String, i As Integer
i = 0
SearchTerm = "FindWSR"
For Each wss In ActiveWorkbook.Worksheets
If Left(wss.Name, Len(SearchTerm)) = SearchTerm Then
i = i + 1
End If
Next wss
If i = 0 Then
Call WorksheetCreate("FindWSR")
Else
Call WorksheetCreate("FindWSR(" & i & ")")
End If
Set FindSMPDestWS = ActiveSheet
FindSMPDestWS.Activate
Range("A1").Select
FindSMPDestWS.Paste
If Range("A1") <> "Loading..." Then
Application.Wait (Now() + TimeValue("00:00:01"))
ClipBoard.SetText table.outerHTML
ClipBoard.PutInClipboard
Range("A1").Select
FindSMPDestWS.Paste
End If
【问题讨论】:
-
您检查过帖子请求吗?您需要了解 POST 请求在做什么。由于我们没有看到这些,因此很难提供建议。
-
例如POST 请求可能针对成批的结果,并且在其中一个/多个结果中,您可能有总计数和批次大小/偏移量/页码等,根据这些数据,您可能能够制定逻辑来发布您自己的 POST请求获取所有数据。
-
两种 IE 典型方法是:1)在页面底部找到一个元素并滚动到它 2)保持滚动窗口高度并获取元素计数,直到不改变。这取决于能够访问滚动元素。要搜索的 SO 示例通常涉及
lazy-loading。您使用哪个取决于哪个可以提供可靠的结果。如果使用 ajax 进行更新,一种不太常见的方法是使用 execScript 来监视 ajax 的完成情况。就个人而言,我会选择 POST 请求而不是 IE,但我知道这可能是不可能的。 -
couldn't post via CLI?不知道你是怎么做的。您也许可以使用 CURL 执行所有这些操作。
标签: excel vba internet-explorer html-table