excelvba网页抓取
我是Excel VBA编程新手,需要一些帮助来调试我的代码,以便从Amazon上抓取一些数据 在我的sheet1中,我列出了产品的ASIN,并试图使用此代码完成URL,以登录到产品页面,然后将通过类ID或其他html标记显示产品的销售排名 然而,我不断得到错误: 未定义用户定义的类型 我想不出bug在哪里 代码如下所示: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").
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
。