Datos de ventas de Amazon (con Excel VBA)
Estoy intentando obtener el número de resultado (en el código HTML) de cada palabra clave que busco mediante Excel VBA. Reducir los criterios por nombre de clase, identificación y código de datos, pero este último está resultando complicado ya que VBA aún no admite esa biblioteca de referencia.
Para qué está estructurado este código:
Vaya a amazon.com y vaya a la barra de búsqueda.
El bucle comienza con la columna C. Extraiga un término de búsqueda de la columna SearchTerm1 y busque.
Una vez cargada la página de resultados, intente encontrar el producto especificado por nombre de clase, ID (ambos se encuentran en el código HTML) y número ASIN (este número se extrae de la columna B para que coincida con el valor de datos-ASIN en los resultados de búsqueda). página). Sin los 3 criterios, Excel no podrá encontrar el producto si aparece en la primera página de resultados.
- Si el producto se encuentra en la primera página, tome su posición de resultado (por ejemplo, "resultado_0" para el primer resultado y resultado_1 para el segundo) y colóquelo en la columna D (SRank1).
- Si no se encuentra el producto, el bucle continúa de todos modos hasta que la columna del término de búsqueda esté vacía.
- Si el producto no se encuentra en la primera página, continúe avanzando en las páginas y buscando el producto especificado para obtener el "clasificación de búsqueda" del artículo.
- Se repiten los mismos pasos para las columnas SearchTerm2, 3 y 4.
La captura de pantalla a continuación es el código que solo se extrae según los criterios de nombre de clase e ID, y extrae el último resultado del producto de la página, que no es mi objetivo al analizar el rendimiento de los productos.
El código incluido solo obtiene la clasificación del producto si el producto es el primer resultado en la página de búsqueda, lo que significa que algo finalmente está funcionando, pero falta uno o dos pasos para capturar todas las posiciones del producto de la página.
Cualquier ayuda o impulso en la dirección correcta sería muy apreciada. Desearía que VBA fuera más versátil para este tipo de investigaciones de ventas. Hasta ahora ha hecho maravillas, pero es posible que esté llegando a su límite. El código está debajo.
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
Este es el ejemplo que descarga productos de Amazon para cada consulta de búsqueda presentada en la hoja Terms
y completa la hoja Products
con ASIN y descripciones. Utiliza XHR, por lo que no es necesario IE. El código es el siguiente:
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
Coloqué en la Terms
hoja:
Los resultados de la Product
hoja contienen 571 elementos:
No es una respuesta completa, pero espero que te ayude.