【问题标题】:How to loop over the pages to get Table data using Selenium VBA?如何使用 Selenium VBA 遍历页面以获取表格数据?
【发布时间】:2021-09-20 23:07:02
【问题描述】:

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

有效的解决方案可能是什么,这样可以在单张纸上完成网站每个页面的表格提取,因为有数千个页。 所以我的问题是:

1.如何从网站获取页面数,以便我可以循环使用它,即For i = 1 To Numberofpages?或者除了获取页数之外还有其他方法(例如Going to next page until next page does not appearing)。

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

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

【问题讨论】:

    标签: vba selenium google-chrome selenium-chromedriver


    【解决方案1】:

    当您写出到工作表时,您需要一种方法来确定最后填充的行,添加所需的行间距,或者添加 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))
    

    【讨论】:

    • 第二个函数似乎可行,所以我使用了它,但在运行代码时出现Method Range of object Worksheet failed 错误。另外,我没有事先清楚地表达这个问题,所以我已经编辑了它。请看一下。 您能否也告诉我如何从网站获取页面数以便我可以循环使用它?
    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2020-08-28
    • 1970-01-01
    • 2018-04-15
    • 2023-02-10
    相关资源
    最近更新 更多