因此,当我发现它完全陷在其中后,我终于不得不向专家询问。这是我写的宏。主要目的是从Amazon网站获取产品价格和产品名称,并将其粘贴到Excel列中。我需要手动在A1列中添加产品的ASIN号。它将自动转到给定的链接并收集数据,并将其粘贴到相应的列B1和C1中。
这是示例URL。我现在正在尝试从此URL获取数据。
我试图在InspectElement中找到Price和Name的类,但没有找到可用于其中的任何类或ID。 当我运行宏时,它会在网站上加载并加载一段时间,但无法从那里获取产品价格或名称,而且无法预测为什么它不起作用。
我尝试使用getElementsbyClassName("")
和getElementsbyID("")
。都无法正常工作。
我的代码中是否存在任何错误(逻辑),或者我需要重写它? 其实我正在建立一个宏。专家的任何帮助都是非常可贵的。 我已经检查了Microsoft HTML对象库和Internet控件。
这是我正在使用的代码:
Sub useClassnames()
Dim element As IHTMLElement
Dim elements As IHTMLElementCollection
Dim IE As InternetExplorer
Dim html As HTMLDocument
Set IE = New InternetExplorer
IE.Visible = True
IE.navigate "https://www.amazon.co.uk/Alessi-Colombina-Soup-Plate-FM10/dp/B0012620YA/ref=sr_1_1?dchild=1&keywords=B0012620YA&qid=1603405464&sr=8-1"
'Wait until IE has loaded the web page
Do While IE.readyState <> READYSTATE_COMPLETE
Application.StatusBar = " Loading Web page … "
DoEvents
Loop
Set html = IE.document
Set elements = html.getElementsByClassName(" priceblock_ourprice ")
'Here is the className "priceblock_ourpirce" I found it in InspectElement but its not getting any data. I am not able to find the 'correct ClassName for Price and Name of Product from InspectElemnt. As I am not a web developer.
Dim count As Long
Dim erow As Long
count = 0
For Each element In elements
If element.className = “priceblock_ourprice” Then
erow = Sheet1.Cells(Rows.count, 1).End(xlUp).Offset(1, 0).Row
Cells(erow, 1) = html.getElementsById(“priceblock_ourprice”)(count).innerValue
Cells(erow, 2) = html.getElementsById(" productTitle ")(count).innerText
count = count + 1
End If
Next element
Range("A2:B2").Select
Columns("A:A ").EntireColumn.AutoFit ""
Columns("B:B").ColumnWidth = 36
MsgBox count
End Sub
答案 0 :(得分:1)
getElementsByID
。 testGEBI
过程说明了如何使用它。Alessi Colombina Soup Plate, Set of 6 (FM10/2)
写入A2
,将£129.00
写入B2
,然后自动拟合A
和B
列。代码
Option Explicit
Sub testGEBI()
Const First As String = "A2"
Const URL As String = "https://www.amazon.co.uk/Alessi-Colombina-Soup-" _
& "Plate-FM10/dp/B0012620YA/ref=sr_1_1?dchild=1&" _
& "keywords=B0012620YA&qid=1603405464&sr=8-1"
Dim Elements As Variant
Elements = Array("productTitle", "priceblock_ourprice")
Dim Data As Variant
Data = getElementsByID(Elements, URL)
With Range(First)
.Resize(, UBound(Data, 2)).Value = Data
Columns(.Column).Resize(, UBound(Data, 2)).AutoFit
End With
End Sub
Function getElementsByID(Elements As Variant, _
ByVal URL As String, _
Optional ByVal getColumn As Boolean = False) _
As Variant
Dim rText As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", URL, False
.setRequestHeader "Content-Type", "text/xml"
.Send
rText = .responseText
End With
Dim j As Long
With CreateObject("htmlfile")
.body.innerHTML = rText
Dim Offs As Long
Offs = LBound(Elements) - 1
Dim ElementsCount As Long
ElementsCount = UBound(Elements) - Offs
Dim Data As Variant
If Not getColumn Then
ReDim Data(1 To 1, 1 To ElementsCount)
For j = 1 To ElementsCount
Data(1, j) = WorksheetFunction _
.Trim(.getElementById(Elements(j + Offs)).innerText)
Next j
Else
ReDim Data(1 To ElementsCount, 1 To 1)
For j = 1 To ElementsCount
Data(j, 1) = WorksheetFunction _
.Trim(.getElementById(Elements(j + Offs)).innerText)
Next j
End If
End With
getElementsByID = Data
End Function
答案 1 :(得分:1)
我认为问题不是要刮擦您想要的值。我认为您必须学习另一种获取信息的方法,如何从网页中抓取价值。
您尝试通过检查元素来获取有关类名和ID的信息。更好的方法是在浏览器中按F12键(但不要使用IE)。我使用FireFox。按下F12后,将在页面底部打开其他工具。此区域的第一个标签是“检查器”。
您可以看到HTML代码。但是它由箭头组织,您可以单击以放大不同元素的HTML代码。将鼠标放在HTML的不同行上时,您可以在上部区域看到相应元素的蓝色覆盖。现在,您可以单击箭头级别,直到找到要搜索的元素。
在此处查找ID或类名。如果没有higig,则可以使用该元素来刮取元素,这有助于使HTML级别显得过分地掩盖正在使用的HTML。对于您的小项目,您可以使用ID刮取标题和价格。
在向您展示执行此操作的VBA代码之前,还有两件事:
您编写的只需要ASIN。没错,但是您不必在代码中这样做。您使用的网址带有您想抓取的标题。但是我对你有个好消息。您只能使用ASIN,而不能使用其他任何东西:https://www.amazon.co.uk/dp/B0012620YA
显示与https://www.amazon.co.uk/Alessi-Colombina-Soup-Plate-FM10/dp/B0012620YA/ref=sr_1_1?dchild=1&keywords=B0012620YA&qid=1603405464&sr=8-1
在亚马逊上,经常有价格不同的不同卖家使用相同的报价。在链接的报价中查找以下行:New (3) from £129.00 + FREE Shipping
如果单击该链接,则将打开包含卖方概述的页面。如果您需要所有价格和卖家名称,则必须做更多的工作。
以下是用于刮除报价中显示的标题和价格的VBA代码:
Sub ScrapeAmazonOffers()
Dim url As String
Dim ie As Object
Dim nodeTitle As Object
Dim nodePrice As Object
Dim resultExample As String
'Amazon offer url, only with ASIN
url = "https://www.amazon.co.uk/dp/B0012620YA"
'Initialize Internet Explorer, set visibility,
'call URL and wait until page is fully loaded
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate url
Do Until ie.readyState = 4: DoEvents: Loop
'Get offer title
Set nodeTitle = ie.document.getElementByID("productTitle")
resultExample = nodeTitle.innertext
'Get price
Set nodePrice = ie.document.getElementByID("priceblock_ourprice")
resultExample = resultExample & Chr(13) & nodePrice.innertext
'Clean up
ie.Quit
Set ie = Nothing
Set nodeTitle = Nothing
Set nodePrice = Nothing
'Show result for this example
MsgBox resultExample
End Sub