亚马逊销售数据(使用Excel VBA)
我试图通过ExcelVBA获得我搜索的每个关键字的结果编号(HTML代码)。按类名、id和数据asin缩小标准范围,但最后一个标准被证明很棘手,因为VBA还不支持该引用库 此代码的结构是为了执行以下操作:亚马逊销售数据(使用Excel VBA),vba,excel,amazon-web-services,web-scraping,xmlhttprequest,Vba,Excel,Amazon Web Services,Web Scraping,Xmlhttprequest,我试图通过ExcelVBA获得我搜索的每个关键字的结果编号(HTML代码)。按类名、id和数据asin缩小标准范围,但最后一个标准被证明很棘手,因为VBA还不支持该引用库 此代码的结构是为了执行以下操作: 进入amazon.com并进入搜索栏 循环从C列开始。从SearchTerm1列中提取一个搜索项并进行搜索 加载结果页面后,尝试按类名、ID(在HTML代码中都可以找到)和ASIN编号(此编号从B列中提取,以便与搜索结果页面上的数据ASIN值匹配)查找指定的产品。如果没有这三个条件,excel
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
下面是一个示例,它从Amazon上为工作表
术语
上的每个搜索查询下载产品,并用ASIN和说明填充工作表产品
。它使用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
子测试()
lngRow=1
'搜索每个术语
每种格式的表格(“条款”)。使用
lngPage=1
做
'搜索结果页的HTTP GET请求
strUrl=”https://www.amazon.com/s/ref=nb_sb_noss_2?page=“&lngPage&”&keywords=“&EncodeUriComponent(strTerm)
设置objXHR=CreateObject(“MSXML2.XMLHttp”)
objXHR.Open“GET”,strUrl,False
objXHR.Send
strResp=objXHR.ResponseText
'按项拆分对数组的响应
arrrep=Split(strResp,“通过反复试验,我终于解决了这个该死的问题。我只需要取出部分代码,其中包括”和InStr(TDelement.ID,“result”)"然后一切都像黄油一样顺利。这确实很有帮助,而且是一个很好的解决方案,但VBA是我所寻找的。我尝试过,它工作得很好。我只需要对它进行一些调整,这样代码就可以排除第二列中所有多余的数据。这肯定给了我一些代码方面的指导-谢谢你,善良的用户。你愿意吗你能帮助我尝试使用XML引用ASIN代码吗?我正在做一个小项目,试图获得职位编号(结果编号)搜索页面加载后的每个产品。我附上了一个电子表格的屏幕截图,其中列出了我从一个卖家那里获得的产品示例。另外,一些注释将非常有用-我几乎没有XML方面的经验。谢谢!我也在试着调整代码。我只是需要重新学习所有这些的语法。循环将是一个挑战,哈哈。我得到了血腥的东西工作。这只是一个代码片段,我必须删除,猜测它是哪一个?TDelement.ID。我现在需要做的是插入一个函数,允许页面前进,直到Excel能够找到ASIN编号,然后移动到下一个搜索词。请您稍微修改一下您的问题以使其更清楚。添加您的代码的功能和错误,并添加工作表屏幕截图的说明,以及其中每列的用途(给出的内容和要查找的内容).Hey@omegastripes,我在问题中编辑了很多东西。如果还有什么需要澄清的,请告诉我。我很快就解决了这个难题,但我不确定我遗漏了什么。