首页 > 解决方案 > 使用 VBA Selenium webdriver 刮一张桌子,但是太慢了

问题描述

我在 VBA 中使用 selenium web 驱动程序来抓取表格,但实际使用起来太慢了。我需要对我的 VBA 代码进行一些改进才能实际使用它。

我一直在这个特定的网站上使用 IE 自动化。复制整个 HTML 表格并粘贴它是一个非常快的过程。但是,由于网站确实发生了一些变化,我不能再在网站上使用 IE。所以我尝试设置一个 selenium 网络驱动程序,并使用 Chrome 来抓取同一张表。由于我无法复制整个表格(因为我不知道如何复制),我必须写下“for each”语句来为表格的每个单元格重复复制和粘贴过程。不幸的是,通过这样做,每个单元都需要将近半秒的时间,这使得它有点无法使用。我编写的代码确实有效,但正如我所提到的,它的速度要慢得多。我可能会将目标表分配为 Web 元素或其他东西,以加快进程。(我尝试过但失败了)在我看来,每个“针对每个语句”都使网络驱动程序通过网站搜索,

Sub NewSeleniumScraper(ByVal metricname, ByVal metricDate, Optional testval As String)


Dim WD As New Selenium.WebDriver
Dim Chrome As Object
Dim ws As Worksheet
Dim sheetsname As String
Lastrow = ws.Range("A1").CurrentRegion.Rows.Count


For Each tr In WD.FindElementByClass("table-wrap").FindElementByTag("tbody").FindElementsByTag("tr")
    c = 1
        For Each td In tr.FindElementsByTag("td")
            ws.Cells(Lastrow + r, c).Value = td.Text
            c = c + 1
        Next td
    r = r + 1
Next tr

我编写的代码复制搜索表中的每个值并将其粘贴到工作表的最后一行下方,一个单元格地粘贴。我想加快这个过程,因为目前每个单元格需要 0.5 秒,这使得复制表格需要一个小时的时间。

这就是表格的结构。

(都是类名)

"table-wrap"
"theader", "tbody"
many "tr" (for each row)
many "td" (for each cell in the row)

我需要刮的是 td 的价值。

标签: excelvbaseleniumweb-scraping

解决方案


谢谢大家的评论,对我帮助很大。我对代码进行了几次更改

  1. 我无法将所有行“设置”为一个元素(不确定这是正确的术语)

我发现您不需要“暗淡”网络元素。我删除了“dim”语句,只为 web 元素添加了“set”语句。(我不确定这是否加快了进程)

  1. 我无法用表的值填充数组。

我现在知道了,你应该将数组“redim”为具有固定大小的二维数组,我失败了,因为我试图填充一个动态的一维数组,就好像它是二维数组一样。

下面是新代码。

Set trs = WD.FindElementByClass("table-wrap").FindElementByTag("tbody").FindElementsByTag("tr")

rcount = trs.Count
ccount = trs(1).FindElementsByTag("td").Count
ReDim Preserve dataArray(1 To rcount, 1 To ccount)



r = 1
For Each tr In trs

    c = 1

    Set tds = tr.FindElementsByTag("td")

        For Each td In tds
            dataArray(r, c) = td.Text
            c = c + 1
        Next td
    r = r + 1
Next tr


Range(Cells(Lastrow + 1, 1), Cells(Lastrow + rcount, ccount)).Value = dataArray

我希望这可以帮助处于与我类似情况的人。


推荐阅读