VBA Web刮擦代码循环在第三次迭代后失败



我正在尝试从多个网页中获取数据(从同一站点的不同库存页面(。我可以在执行循环的前3次中拔出数据,但是在第四次迭代中,它提出了错误91:对象变量或未设置块变量。

我尝试围绕Internet Explorer打开命令移动,以便在每次迭代的开头打开一个新的浏览器,并在循环结束时将其关闭,以确保IE对象并不会以某种方式失败。那不起作用,同样的问题。

Sub GetStock()

    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim cellnum As Range: Set cellnum = Range(ActiveCell.Address)
    Dim i As Integer
    Dim IE As Object
    Dim text As String
    i = 1
    Do Until i > 10
        Set IE = CreateObject("InternetExplorer.Application")
        IE.Visible = True
        cellnum = Range(ActiveCell.Offset(i, 7).Address)
        With IE
            .navigate cellnum.Value
            Do While .Busy And .readyState <> 4: DoEvents: Loop
            Sleep 1000
            text = .Document.getElementsByClassName("classname")(1).outerText
        End With
        ws.Cells(i, 12).Value = text
        i = i + 1
        IE.Quit
    Loop

End Sub

链接到网页的链接保存在单元格中,因此是Cellnum代码。找到正确的单元格,检索其中的网页,然后移动到其下方的单元格。该代码在前3个迭代中正常工作,但由于某种原因,该代码在第四次失败。错误代码标识" text = .document.getElementsbyclassName ..."行为错误。

我认为您的问题可能是由于网页上不存在的元素。如果确实存在,您是否确定您正在从集合中提取正确的元素?

尝试使用

运行它
.document.getElementsByClassName("classname")(0).outerText.

如果有效,那么我建议您查看网页上的类" className"的元素。而在其他页面上,您可能有2个或更多元素,但可能是在第三页上只有一个。

您可以发布要刮擦的网页吗?

找到了解决方案!Sleep.1000命令在所有情况下都没有提供足够的时间,我想代码正在尝试在一个页面可用之前提取数据。我以为那里的循环可以解决这个问题,但我想不是(对此非常新(。无论如何,我将其更改为睡眠。3000使我的缓慢的互联网足够赶上,它像梦一样工作。

感谢所有人的帮助。

最新更新