如何使用Selenium VBA在页面上循环以获取表数据



我有一个网站,有1000个页面,我想在一个工作表中从每个页面提取表格。我尝试过的方法是将页数放在循环中并提取数据。这方面的问题是它不是自动化的&它提取新工作表中每一页的表格数据。

什么是有效的解决方案,这样网站的每个页面的表格提取都可以在一张纸上完成,而不会有太多延迟,因为有数千个页面。所以我的问题是:

1.如何从网站上获得页数,以便我可以在循环中使用它,即For i = 1 To Numberofpages?或者除了获取页数(例如转到下一页直到下一页不适用(之外,还有其他方法吗

2.如何将从每页提取的所有表格放在一张工作表上?

  • 参考网页:http://www.nepalstock.com/main/floorsheet/index/1/?contract-否=&股票符号=&买方=&seller=&amp_极限=30
Sub Scrape()
Dim ResultSections As Selenium.WebElements
Dim ResultSection As Selenium.WebElement
Dim i As Long

Set ch = New Selenium.ChromeDriver

ch.Start baseUrl:="http://www.nepalstock.com"

For i = 1 To 3  '3 is number of pages TO BE FOUND which here is taken for Example 
ch.Get "/main/floorsheet/index/" & i & "/?contract-no=&stock-symbol=&buyer=&seller=&_limit=30"
Set ResultSections = ch.FindElementsByClass("my-table")
For Each ResultSection In ResultSections
ResultSection.AsTable.ToExcel ThisWorkbook.Worksheets.Add.Range("A1")
Next ResultSection
Next

End Sub

当您向工作表写入时,您需要一个方法来确定最后填充的行,添加您想要的行间距,或者添加1表示没有间距,然后再写入。

如果你不知道哪一列可以用来确定最后一行,那么使用下面的第一个函数,如果你有一列可以依赖,那么使用后面的第二个函数,并输入适当的列号,例如列a应该是1。

记住在返回值中添加所需的偏移量编号:

Public Function GetLastRow(ByVal sh As Worksheet) As Long
On Error Resume Next
GetLastRow = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).row
On Error GoTo 0
End Function
Public Function GetLastRow(ByVal ws As Worksheet, Optional ByVal columnNumber As Long = 1) As Long
With ws
GetLastRow = .Cells(.Rows.Count, columnNumber).End(xlUp).row
End With
End Function

您可以使用以下内容:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
ResultSection.AsTable.ToExcel ws.Cells(GetLastRow(ws, 1) + 2 , "A") 'leave 1 row gap before writing out next output
'ResultSection.AsTable.ToExcel ws.Cells(GetLastRow(ws) + 2, "A")  'leave 1 row gap before writing out next output

就我个人而言,我通常更喜欢先用结果填充数组,然后一次写出来。考虑到所示的页数,某些操作失败的风险相当高,而且您还没有实现任何用于获取数据的回退重试机制。因此,我选择了在循环过程中频繁写入工作表的I/O开销。


计算第一个加载页面的页数:

Dim arr() As String
arr = Split(trim$(ch.FindElementByCss(".pager > a").text),"/")
numberOfPages = arr(ubound(arr))

相关内容

  • 没有找到相关文章

最新更新