亚马逊销售数据(使用Excel VBA)

我试图通过Excel VBAsearch每个search关键字的结果编号(在HTML代码中)。 通过className,id和data-asin缩小了标准,但由于VBA不支持该参考库,所以最后一个被certificate是棘手的。

这段代码的结构是:

  1. 进入amazon.com并转到search栏。

  2. 循环从C列开始。从SearchTerm1列中提取search项并search。

  3. 加载结果页面后,尝试通过className,ID(都可以在HTML代码中find)和ASIN号(从列B中提取此数字以匹配search结果中的数据asin值)来查找指定的产品页)。 如果没有全部3个标准,excel将无法在第一个结果页面上find该产品。

  4. 如果在第一页上find产品,则抓住其结果位置(例如,第一个结果为“result_0”,第二个为result_1),并将其放在D列(SRank1)中。
  5. 如果没有find产品,那么循环会一直持续,直到search词列为空。
  6. 如果在第一页上找不到产品,请继续前进页面并search指定的产品,以获取该项目的“search排名”。
  7. 对列SearchTerm2,3和4重复相同的步骤。

下面的截图是只根据className和ID标准拉动的代码,它从页面中提取最后一个产品结果,这不是我分析产品如何做的目标。

代码只从结果页面拉取最后一个“搜索排名”,而不是实际产品的结果位置。

如果产品是search页面上的第一个结果,则包含的代码只会拉取产品排名,这意味着某些内容最终可以正常工作,但是缺less一两步来抓取页面上的所有产品位置。 在这里输入图像说明

在这里输入图像说明

任何帮助或推动正确的方向将不胜感激。 我希望VBA在这些销售研究方面更具多function性。 到目前为止,它已经创造了奇迹,但是我可能会达到极限。 代码如下。

Sub AmazonSearchRank() Dim MyHTML_Element As IHTMLElement Dim MyURL As String Dim AASearchRank As Workbook Dim AAws As Worksheet Dim InputSearchOrder As HTMLInputElement Dim elems As IHTMLElementCollection Dim TDelement As HTMLTableCell Dim InputSearchButton As HTMLInputButtonElement Dim IE As InternetExplorer Dim AASearchTerms As Workbook Dim SearchTermsSheet As Worksheet Dim x As Integer Dim i As Long MyURL = "https://www.amazon.com" Set IE = New InternetExplorer With IE .Silent = True .Navigate MyURL .Visible = True Do DoEvents Loop Until .ReadyState = READYSTATE_COMPLETE End With Set HTMLDoc = IE.Document Set AASearchRank = Application.Workbooks.Open("C:\Users\CompanyName\Desktop\Automation Anywhere\Sample_Items_For_SearchRank.xls") Set AAws = AASearchRank.Worksheets("Sheet1") Set InputSearchButton = HTMLDoc.getElementById("nav-search-submit-text") Set InputSearchOrder = HTMLDoc.getElementById("twotabsearchbox") If Not InputSearchOrder Is Nothing Then InputSearchButton.Click Do DoEvents Loop Until IE.ReadyState = READYSTATE_COMPLETE End If x = 2 If AAws.Range("D" & x).Value = "" Then Do Until AAws.Range("B" & x) = "" Set InputSearchOrder = HTMLDoc.getElementById("twotabsearchtextbox") InputSearchOrder.Value = AAws.Range("C" & x) Set InputSearchButton = HTMLDoc.getElementsByClassName("nav-input")(0) InputSearchButton.Click Do DoEvents Loop Until IE.ReadyState = READYSTATE_COMPLETE Application.Wait (Now + TimeValue("0:00:05")) Set elems = HTMLDoc.getElementsByClassName("s-result-item celwidget") i = 2 For Each TDelement In elems If TDelement.className = "s-result-item celwidget" And InStr(TDelement.ID, "result") InStr(TDelement.innerHTML, AAws.Range("B" & x).Value) Then AAws.Range("D" & x).Value = TDelement.ID i = i + 1 End If Next x = x + 1 Loop End If End Sub 

下面是一个例子,它从表单Terms提供的每个search查询下载Amazon的产品,并使用ASIN和说明填充Products表。 它使用XHR,所以不需要IE。 代码如下:

 Sub Test() lngRow = 1 ' search each term For Each strTerm In Sheets("Terms").UsedRange lngPage = 1 Do ' HTTP GET request of the search result page strUrl = "https://www.amazon.com/s/ref=nb_sb_noss_2?page=" & lngPage & "&keywords=" & EncodeUriComponent(strTerm) Set objXHR = CreateObject("MSXML2.XMLHttp") objXHR.Open "GET", strUrl, False objXHR.Send strResp = objXHR.ResponseText ' split response to array by items arrResp = Split(strResp, "<li id=""result_") ' process each item on the page For i = 1 To UBound(arrResp) strItem = arrResp(i) ' extract ASIN strTmp = Split(strItem, "data-asin=""")(1) strTmp = Split(strTmp, """")(0) Sheets("Products").Cells(lngRow, 1).NumberFormat = "@" Sheets("Products").Cells(lngRow, 1).Value = strTmp ' extract the product description strTmp = Split("<li id=""result_" & strItem, "</li>")(0) & "</li>" Sheets("Products").Cells(lngRow, 2).Value = GetInnerText(strTmp) ' show current item Sheets("Products").Cells(lngRow, 1).Select ' next row lngRow = lngRow + 1 Next ' adjust sheet Sheets("Products").Columns.AutoFit Sheets("Products").Rows.AutoFit ' next page lngPage = lngPage + 1 Loop Until UBound(arrResp) = 0 ' empty search result Next End Sub Function EncodeUriComponent(strText) Static objHtmlfile As Object If objHtmlfile Is Nothing Then Set objHtmlfile = CreateObject("htmlfile") objHtmlfile.parentWindow.execScript "function encode(s) {return encodeURIComponent(s)}", "jscript" End If EncodeUriComponent = objHtmlfile.parentWindow.encode(strText) End Function Function GetInnerText(strHtmlContent) Dim objHtmlFile, objBody Set objHtmlFile = CreateObject("htmlfile") objHtmlFile.write strHtmlContent Set objBody = objHtmlFile.getElementsByTagName("body")(0) GetInnerText = Trim(objBody.innerText) End Function 

我放在Terms表:

条款

Product单上的结果包含571项:

制品

这不是一个完整的答案,但我希望它可以帮助你。

通过反复试验,我终于解决了这个血腥的事情。 我只需要拿出包含“InStr(TDelement.ID,”结果“)”的代码的一部分,然后一切就像黄油一样顺畅。