VBA - 网页定价抓取工具,创建URL循环

VBA - Web pricing scraper, creating URL loop

提问人:SparkyVBA 提问时间:10/30/2023 最后编辑:SparkyVBA 更新时间:10/31/2023 访问量:53

问:

我希望有人可以帮助像我这样的初学者。 我正在尝试创建一个网络爬虫,该爬虫从 B 列中的 URL 中获取定价。 我想创建一个循环,以便将 HTML 中的价格从“B”列中的 URL 提取到“C”列。

由于某种原因,我的代码没有运行,并给出了“自动化错误”。 当我将单元格指定为“范围”时,我的代码无需循环即可工作。但我不想重复代码 50 次。

有人可以帮我修复我的循环吗?:)

(出于隐私原因,我隐藏了“ClassName”)

Sub FetchPrices_data()

    Dim Model As String
    Dim request As Object
    Dim response As String
    Dim html As New HTMLDocument
    Dim Price As String
    Dim i As Integer
    
    For i = 1 To 50
    
        Model = Range("B" & i).Value
        
        Set request = CreateObject("MSXML2.XMLHTTP")
        
        request.Open "GET", Model, False
        
        request.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
        
        request.send
        
            response = StrConv(request.responseBody, vbUnicode)
            
            html.body.innerHTML = response
            
                Price = html.getElementsByClassName(" Hidden ").Item(0).innerText
                
                Range("C" & i).Value = Price
    
    Next i
    
End Sub
Excel VBA 网页抓取

评论

2赞 Foxfire And Burns And Burns 10/30/2023
将创建对象的部分移出循环,无需创建 50 倍。此外,请尝试使用 F8 逐步调试代码,并查看失败的确切循环。¿也许是错误的值?Model

答:

0赞 SparkyVBA 10/30/2023 #1

谢谢你的提示!现在已经解决了。 我还添加了一个错误指示器。
以下是我为解决问题所做的工作:

Sub FetchPrices_data()

    Dim Model As String
    Dim request As Object
    Dim response As String
    Dim html As New HTMLDocument
    Dim Price As String
    Dim i As Integer
    
    For i = 2 To 35        
        Model = Range("B" & i).Value
        
        Set request = CreateObject("MSXML2.XMLHTTP")
        
        If request Is Nothing Then
            Range("B" & i).Value = "URL Error."
            Exit Sub
        End If
        
        request.Open "GET", Model, False
        
        request.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
        
        request.send
        
        response = StrConv(request.responseBody, vbUnicode)
            
        html.body.innerHTML = response
            
        If Not html.getElementsByClassName(" *Hidden* ").Item(0) Is Nothing Then
            Price = html.getElementsByClassName(" *Hidden* ").Item(0).innerText
            Range("C" & i).Value = Price
        Else
            Range("C" & i).Value = "URL Error"
        End If                                                        
    Next i        
End Sub