使用VBA从亚马逊获取产品价格和名称

时间:2020-10-22 23:31:51

标签: html excel vba

因此,当我发现它完全陷在其中后,我终于不得不向专家询问。这是我写的宏。主要目的是从Amazon网站获取产品价格和产品名称,并将其粘贴到Excel列中。我需要手动在A1列中添加产品的ASIN号。它将自动转到给定的链接并收集数据,并将其粘贴到相应的列B1和C1中。

这是示例URL。我现在正在尝试从此URL获取数据。

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

我试图在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

2 个答案:

答案 0 :(得分:1)

GetElement s ByID

  • 前几天我写了函数getElementsByIDtestGEBI过程说明了如何使用它。
  • 我对此主题的知识非常有限,因此请注意,该功能可能会产生不需要的结果。到目前为止,如果没有互联网连接或ID不存在,它会失败并显示一条错误消息。
  • 当前设置会将Alessi Colombina Soup Plate, Set of 6 (FM10/2) 写入A2,将£129.00写入B2,然后自动拟合AB列。
  • li>

代码

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代码之前,还有两件事:

  1. 您编写的只需要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

    相同的页面
  2. 在亚马逊上,经常有价格不同的不同卖家使用相同的报价。在链接的报价中查找以下行: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