Datos de ventas de Amazon (con Excel VBA)

Resuelto Tak asked hace 54 años • 2 respuestas

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:

  1. Vaya a amazon.com y vaya a la barra de búsqueda.

  2. El bucle comienza con la columna C. Extraiga un término de búsqueda de la columna SearchTerm1 y busque.

  3. 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.

  4. 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).
  5. 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.
  6. 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.
  7. 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 solo extrae el último "clasificación de búsqueda" de la página de resultados, no la posición de resultado del producto real.

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. ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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
Tak avatar Jan 01 '70 08:01 Tak
Aceptado

Este es el ejemplo que descarga productos de Amazon para cada consulta de búsqueda presentada en la hoja Termsy completa la hoja Productscon 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 Termshoja:

términos

Los resultados de la Producthoja contienen 571 elementos:

productos

No es una respuesta completa, pero espero que te ayude.

omegastripes avatar Dec 23 '2015 21:12 omegastripes