使用Excel vba刮网站

时间:2018-04-23 07:11:04

标签: vba excel-vba web-scraping excel

所以我是vba的新手,我试图获得价格(我试着了解我的知识)。宏是:

\

该网站为THIS,我正在尝试获取此值:a

主要是错误:

运行时错误'91': 对象变量或未设置块变量。

调试是:

Sub Deneme()

Dim objIE As InternetExplorer
Dim Prc1 As String
Set objIE = New InternetExplorer
Dim Search_Terms() As Variant
Dim CopiedData() As Variant


Dim y As Integer
objIE.Visible = False


Search_Terms = Application.Transpose(ActiveSheet.Range("A2:A169").Value)

ReDim CopiedData(LBound(Search_Terms) To UBound(Search_Terms))


y = 2
For a = LBound(Search_Terms) To UBound(Search_Terms)


objIE.navigate "https://steamcommunity.com/market/listings/578080/" & Search_Terms(a)
Do: DoEvents: Loop Until objIE.readyState = 4
Prc1 = objIE.document.getElementsByClassName("market_commodity_orders_table")(4).getElementsByTagName("tr")(1).textContent '<----- the problem is here
ActiveSheet.Range("D" & y).Value = Prc1

y = y + 1
Next


objIE.Quit

End Sub

3 个答案:

答案 0 :(得分:1)

您的代码中有2个问题......

  1. 没有名为market_commodity_orders_table
  2. 的课程
  3. 项目计数以0开头,因此4ᵗʰ项目为项目编号3。
  4. 您可以使用:

    Prc1 = objIE.document.getElementsByClassName("market_commodity_orders_header_promote").Item(3).innerText
    

答案 1 :(得分:1)

在我为您测试新代码的过程中,我意识到除了您尝试使用的类名之外还有其他问题。

另一个问题是文档在某些其他资源之前加载 - 这可能是因为该网站每秒更新一次价格(因此价格最初未在objIE.Document对象中加载)。

为了解决这个问题,我添加了几个循环来等待你的对象变得可用。这应该适合你。

Sub Deneme()

    Dim objIE As InternetExplorer
    Dim Prc1 As String
    Set objIE = New InternetExplorer
    Dim Search_Terms() As Variant
    Dim CopiedData() As Variant
    Dim y As Integer
    Dim elemObj As Object

    objIE.Visible = False

    Search_Terms = Application.Transpose(ActiveSheet.Range("A2:A169").Value)

    ReDim CopiedData(LBound(Search_Terms) To UBound(Search_Terms))

    y = 2
    For a = LBound(Search_Terms) To UBound(Search_Terms)

        objIE.navigate "https://steamcommunity.com/market/listings/578080/" & Search_Terms(a)
        Do: DoEvents: Loop Until objIE.readyState = 4

        Do While Prc1 = ""
            Do While elemObj Is Nothing
                Set elemObj = objIE.document.getElementById("market_commodity_buyrequests")
                Set elemObj = elemObj.getElementsByClassName("market_commodity_orders_header_promote")(1)
            Loop
            Prc1 = elemObj.innerText
        Loop

        ActiveSheet.Range("D" & y).Value = Prc1
        Set elemObj = Nothing
        Prc1 = vbNullString

        y = y + 1

    Next

    objIE.Quit

End Sub

答案 2 :(得分:1)

让我们以略微不同的方式尝试。如果您有.querySelector()或更高版本,则以下代码应该可以完美地为您服务。我在这里使用了price。试一试,找到你所追求的Sub GetPrice() Const URL As String = "https://steamcommunity.com/market/listings/578080/PLAYERUNKNOWN's%20Bandana" Dim HTML As HTMLDocument, post As Object With New InternetExplorer .Visible = True .navigate URL While .Busy = True Or .readyState < 4: DoEvents: Wend Set HTML = .document Do: Set post = HTML.querySelector("#market_commodity_buyrequests .market_commodity_orders_header_promote:nth-of-type(2)"): DoEvents: Loop While post Is Nothing [A1] = post.innerText .Quit End With End Sub

Microsoft Internet Controls
Microsoft HTML Object Library

参考添加到库:

plot(Geom.line(preserve_order=true), Geom.point, x=bb[:,1], y=bb[:,2])