Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
亚马逊销售数据(使用Excel VBA)_Vba_Excel_Amazon Web Services_Web Scraping_Xmlhttprequest - Fatal编程技术网

亚马逊销售数据(使用Excel 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

我试图通过ExcelVBA获得我搜索的每个关键字的结果编号(HTML代码)。按类名、id和数据asin缩小标准范围,但最后一个标准被证明很棘手,因为VBA还不支持该引用库

此代码的结构是为了执行以下操作:

  • 进入amazon.com并进入搜索栏

  • 循环从C列开始。从SearchTerm1列中提取一个搜索项并进行搜索

  • 加载结果页面后,尝试按类名、ID(在HTML代码中都可以找到)和ASIN编号(此编号从B列中提取,以便与搜索结果页面上的数据ASIN值匹配)查找指定的产品。如果没有这三个条件,excel将无法找到第一个结果页面上列出的产品

  • 如果在第一页上找到产品,则获取其结果位置(例如,第一个结果为“result_0”,第二个结果为“result_1”),并将其放入D列(SRank1)
  • 如果找不到产品,循环将一直进行,直到搜索词列为空
  • 如果在第一页上找不到产品,请继续推进页面并搜索指定的产品,以获取项目的“搜索排名”
  • 对SearchTerm2、3和4列重复相同的步骤
  • 下面的屏幕截图是仅基于类名和ID标准的代码提取,它从页面中提取最后一个产品结果,这不是我分析产品的目的

    如果产品是搜索页面上的第一个结果,则包含的代码仅会拉取产品排名,这意味着某些东西最终会起作用,但缺少从页面中获取所有产品位置的一两步。

    我们将非常感谢您向正确方向提供的任何帮助或推动。我希望VBA在这类销售研究方面能有更多的用途。到目前为止,它创造了奇迹,但我可能已经达到了极限。代码如下

    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,我在问题中编辑了很多东西。如果还有什么需要澄清的,请告诉我。我很快就解决了这个难题,但我不确定我遗漏了什么。