我有一个网站,有1000个页面,我想在一个工作表中从每个页面提取表格。我尝试过的方法是将页数放在循环中并提取数据。这方面的问题是它不是自动化的&它提取新工作表中每一页的表格数据。
什么是有效的解决方案,这样网站的每个页面的表格提取都可以在一张纸上完成,而不会有太多延迟,因为有数千个页面。所以我的问题是:
1.如何从网站上获得页数,以便我可以在循环中使用它,即For i = 1 To Numberofpages
?或者除了获取页数(例如转到下一页直到下一页不适用(之外,还有其他方法吗
2.如何将从每页提取的所有表格放在一张工作表上?
- 参考网页:http://www.nepalstock.com/main/floorsheet/index/1/?contract-否=&股票符号=&买方=&seller=&_极限=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))