Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excelvba网页抓取_Vba_Excel_Web Scraping - Fatal编程技术网

excelvba网页抓取

excelvba网页抓取,vba,excel,web-scraping,Vba,Excel,Web Scraping,我是Excel VBA编程新手,需要一些帮助来调试我的代码,以便从Amazon上抓取一些数据 在我的sheet1中,我列出了产品的ASIN,并试图使用此代码完成URL,以登录到产品页面,然后将通过类ID或其他html标记显示产品的销售排名 然而,我不断得到错误: 未定义用户定义的类型 我想不出bug在哪里 代码如下所示: Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = Range("azAsin").

我是Excel VBA编程新手,需要一些帮助来调试我的代码,以便从Amazon上抓取一些数据

在我的sheet1中,我列出了产品的ASIN,并试图使用此代码完成URL,以登录到产品页面,然后将通过类ID或其他html标记显示产品的销售排名

然而,我不断得到错误:

未定义用户定义的类型

我想不出bug在哪里

代码如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = Range("azAsin").Row And Target.Column = Range("azAsin").Column Then
     Dim IE As New InternetExplorer
     IE.Visible = True
     IE.Navigate "https://www.amazon.com/dp/" & Range("azAsin").Value
    Do
     DoEvents
    Loop Until IE.readyState = READYSTATE_COMPLETE
    Dim pap As HTMLDocument
    Set pap = IE.document
    Dim sDoc As String
    sDoc = Doc.getElementsById("SalesRank")

    MsgBox sDoc
    End If
End Sub
试试这个:

Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
'...

Dim objRank as Object
Set objRank = ie.Document.getElementById("SalesRank")

Dim rank As String
If Not objRank Is Nothing Then rank = objRank.innerText
试试这个:

Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
'...

Dim objRank as Object
Set objRank = ie.Document.getElementById("SalesRank")

Dim rank As String
If Not objRank Is Nothing Then rank = objRank.innerText

这是一个完全最新的版本,它也不再需要浏览器


对代码的观察:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim html As Object, i As Long, URL As String
    URL = "https://www.amazon.com/dp/" & Range("azAsin").Value

    If Target.Row = Range("azAsin").Row And Target.Column = Range("azAsin").Column Then

        With CreateObject("MSXML2.serverXMLHTTP")
            .Open "GET", URL, False
            .send
            Set html = CreateObject("HTMLFile")
            html.body.innerHTML = .responseText
        End With

        For i = 0 To html.all.Length - 1
            If html.all(i).ID = "SalesRank" Then MsgBox html.all(i).innerText
        Next i
    End If
End Sub
另一个答案已更正,但未提及,在现有脚本中,您尝试:

Dim sDoc As String
Doc = Doc.getElementsById("SalesRank")
getElementsById
无效,因为
Id
应为单数,语法为
getElementById
。这也将返回一个对象,而不是字符串。因此,您需要
ie.Document.getElementById(“SalesRank”).innerText
来获取字符串;尽管最好先设置一个对象并测试
,如果不是obj,则测试
,正如前回答者所做的那样


代码:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim html As Object, i As Long, URL As String
    URL = "https://www.amazon.com/dp/" & Range("azAsin").Value

    If Target.Row = Range("azAsin").Row And Target.Column = Range("azAsin").Column Then

        With CreateObject("MSXML2.serverXMLHTTP")
            .Open "GET", URL, False
            .send
            Set html = CreateObject("HTMLFile")
            html.body.innerHTML = .responseText
        End With

        For i = 0 To html.all.Length - 1
            If html.all(i).ID = "SalesRank" Then MsgBox html.all(i).innerText
        Next i
    End If
End Sub

这是一个完全最新的版本,它也不再需要浏览器


对代码的观察:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim html As Object, i As Long, URL As String
    URL = "https://www.amazon.com/dp/" & Range("azAsin").Value

    If Target.Row = Range("azAsin").Row And Target.Column = Range("azAsin").Column Then

        With CreateObject("MSXML2.serverXMLHTTP")
            .Open "GET", URL, False
            .send
            Set html = CreateObject("HTMLFile")
            html.body.innerHTML = .responseText
        End With

        For i = 0 To html.all.Length - 1
            If html.all(i).ID = "SalesRank" Then MsgBox html.all(i).innerText
        Next i
    End If
End Sub
另一个答案已更正,但未提及,在现有脚本中,您尝试:

Dim sDoc As String
Doc = Doc.getElementsById("SalesRank")
getElementsById
无效,因为
Id
应为单数,语法为
getElementById
。这也将返回一个对象,而不是字符串。因此,您需要
ie.Document.getElementById(“SalesRank”).innerText
来获取字符串;尽管最好先设置一个对象并测试
,如果不是obj,则测试
,正如前回答者所做的那样


代码:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim html As Object, i As Long, URL As String
    URL = "https://www.amazon.com/dp/" & Range("azAsin").Value

    If Target.Row = Range("azAsin").Row And Target.Column = Range("azAsin").Column Then

        With CreateObject("MSXML2.serverXMLHTTP")
            .Open "GET", URL, False
            .send
            Set html = CreateObject("HTMLFile")
            html.body.innerHTML = .responseText
        End With

        For i = 0 To html.all.Length - 1
            If html.all(i).ID = "SalesRank" Then MsgBox html.all(i).innerText
        Next i
    End If
End Sub

您是否包含了对
Microsoft Internet Controls
库的引用?另一个选项是使用后期绑定,但我模糊地记得,它在用于web抓取的类时不可靠。使用后期绑定时,诸如
Dim pap as HTMLDocument
之类的语句将变为
Dim pap as Object
,但不必设置引用。将
IE
声明为对象变量,ie应用程序的
CreateObject
。您是否包含了对
Microsoft Internet控件
库的引用?另一个选项是使用后期绑定,但我模糊地记得,它在用于web抓取的类时不可靠。使用后期绑定时,诸如
Dim pap as HTMLDocument
之类的语句将变为
Dim pap as Object
,但不必设置引用。将
IE
声明为对象变量,即IE应用程序的
CreateObject