【问题标题】:Excel VBA Scrape amazon for inventoryExcel VBA 刮亚马逊库存
【发布时间】:2018-07-29 12:14:07
【问题描述】:

我正在寻找抓取亚马逊库存.. 这是我使用的链接 https://www.amazon.com/Stratford-Pharmaceuticals-Omega-Fatty-Strength/dp/B006JCU54Y/ref=sr_1_2?s=pet-supplies&ie=UTF8&qid=1518816130&sr=1-2&keywords=stratford

有一个标题为“与类似商品比较”的部分,我需要在其中提取价格(我已经这样做了)以及库存数量.. 第二部分不是直接获得的..手动我必须点击“添加到购物车”然后从下一页单击“购物车”然后从下一页选择“数量下拉并选择10+并手动输入任何大数字例如999并点击“更新” 将有包含剩余库存的警报消息 (此卖家只有 35 个可用。要查看其他卖家是否有更多可用,)>> 所以这是所需的数字,即 35 这是说明手动步骤的 excel 文件和快照。 我使用的是 IE,但如果可以使用 XMLHTTP 当然会很棒

这是我到目前为止设计的代码

Sub Test()
    Dim ws As Worksheet
    Dim ie          As Object
    Dim allLnks     As Object
    Dim lnk         As Object
    Dim r           As Long
    Dim liElem As Object
    Dim prElem As Object
    Dim crtElem As Object
    Dim elem As Object
    Dim cnt As Integer
    Dim inputElem As Object
    Dim inputEle As Object
    
    Set ws = ThisWorkbook.Worksheets("Sheet2")
    Set ie = CreateObject("InternetExplorer.Application")

    With ie
        .Visible = True
        .navigate ("https://www.amazon.com/Stratford-Pharmaceuticals-Omega-Fatty-Strength/dp/B006JCU54Y/ref=sr_1_2?s=pet-supplies&ie=UTF8&qid=1518816130&sr=1-2&keywords=stratford")

        Do: DoEvents: Loop Until .readystate = 4
        
        ws.Range("B2").Value = Format(Now(), "dd/mm/yyyy - hh:mm:ss")
        Set liElem = .document.getelementbyid("detail-bullets").getelementsbytagname("table")(0).getelementsbytagname("ul")(0)
        
        For Each elem In liElem.getelementsbytagname("li")
            If InStr(elem.innerText, "ASIN") > 0 Then ws.Range("B1").Value = Replace(elem.innerText, "ASIN: ", "")
            If InStr(elem.innerText, "Rank:") > 0 Then ws.Range("B3").Value = MyUDF(elem.innerText, "Rank: ", "(")
            If InStr(elem.innerText, "Review:") > 0 Then ws.Range("B4").Value = Replace(Split(Trim(Split(elem.innerText, "Review: ")(1)), vbLf)(1), Chr(13), "")
        Next elem
        
        Set prElem = .document.getelementbyid("comparison_price_row")
        For Each elem In prElem.getelementsbytagname("td")
            cnt = cnt + 1
            ws.Range("A" & cnt + 4).Value = "Seller " & cnt
            ws.Range("B" & cnt + 4).Value = elem.getElementsByClassName("a-offscreen")(0).innerText
        Next elem
        
        cnt = 0
        Set crtElem = .document.getelementbyid("HLCXComparisonTable").getElementsByClassName("a-button-inner")
        For Each elem In crtElem
            .navigate elem.getelementsbytagname("a")(0).href
            Do: DoEvents: Loop Until .readystate = 4
            .navigate .document.getElementsByClassName("a-button-inner")(0).getelementsbytagname("a")(0).href
            Do: DoEvents: Loop Until .readystate = 4
            
            cnt = cnt + 1
            ws.Range("C" & cnt + 4).Value = Replace(Split(Split(MyUDF(.document.getElementsByClassName("a-row a-spacing-base sc-action-quantity sc-action-quantity-right")(0).innerHTML, "maxlength=", "quantity="), "autocomplete")(0), "=")(1), """", "")
        Next elem
        
        Stop
        '.Quit
    End With
End Sub

Function MyUDF(s As String, b As String, a As String) As String
    Dim arr()       As String
    Dim r           As String

    arr = Split(s, b)

    If UBound(arr) > 0 Then
        r = arr(1)
        arr = Split(r, a)

        If UBound(arr) > 0 Then
            r = arr(0)
        End If
    End If

    MyUDF = Trim(r)
End Function

这里有一些快照可能会有所帮助

]4

【问题讨论】:

  • 请帮助解决这个问题?
  • 我不清楚您想要的预期项目是什么。你已经可以得到比较价格了,请问你想要的最后一套物品是什么?
  • 每件产品的可用余量如上图所示
  • 感谢您回复我。你想把那个号码刮掉吗?

标签: vba excel amazon screen-scraping


【解决方案1】:

试一试。它应该为您获取您想要的号码。我结合使用xmlhttpSelenium 使脚本运行得更快一些。我无法在第二种方法中使用 xmlhttp 请求,因为链接是 javascript 加密的。

运行以下脚本后,您可以了解卖家拥有多少此类物品。即使卖家没有此类物品,脚本也不会中断,因为我已经做到了。

就是这样:

Sub GetInfo()
    Const base As String = "https://www.amazon.com"
    Const mainurl As String = "https://www.amazon.com/Stratford-Pharmaceuticals-Omega-Fatty-Strength/dp/B006JCU54Y/ref=sr_1_2?s=pet-supplies&ie=UTF8&qid=1518816130&sr=1-2&keywords=stratford"
    Dim Http As New XMLHTTP60, Htmldoc As New HTMLDocument, itext As Object
    Dim driver As New ChromeDriver, idic As New Scripting.Dictionary
    Dim post As Object, oinput As Object, posts As Object, elem As Object
    Dim idrop As Object, oclick As Object, I&, key As Variant

    With Http
        .Open "GET", mainurl, False
        .send
        Htmldoc.body.innerHTML = .responseText
    End With

    With Htmldoc.querySelectorAll("[id^='comparison_add_to_cart_'].a-button-text")
        For I = 0 To .Length - 1
            idic(base & Replace(.item(I).getAttribute("href"), "about:", "")) = 1
        Next I
    End With

    For Each key In idic.keys
        driver.get key
        Set post = driver.FindElementByCss("input[value='addToCart']", Raise:=False, timeout:=10000)
        If Not post Is Nothing Then
            post.Click
        End If

        Set posts = driver.FindElementById("hlb-view-cart-announce", timeout:=10000)
        posts.Click

        Set elem = driver.FindElementByCss("span#a-autoid-0-announce", timeout:=10000)
        elem.Click

        Set idrop = driver.FindElementById("dropdown1_9", timeout:=10000)
        idrop.Click

        Set oinput = driver.FindElementByCss("input[name='quantityBox']", timeout:=10000)
        oinput.SendKeys "100"

        Set oclick = driver.FindElementByCss("#a-autoid-1", timeout:=10000)
        oclick.Click

        Set itext = driver.FindElementByCss(".sc-quantity-update-message span.a-size-base", Raise:=False, timeout:=5000)
        If Not itext Is Nothing Then
            R = R + 1: Cells(R, 1) = itext.Text
        Else
            R = R + 1: Cells(R, 1) = "Sorry dear nothing found"
        End If
    Next key
End Sub

参考添加:

Selenium Type Library
Microsoft HTML Object Library
Microsoft XML, v6.0
Microsoft Scripting Runtime

您可能会得到如下输出。现在,您可以使用正则表达式来解析数字 48:

This seller has only 48 of these available. To see if more are available from another seller, go to the product detail page.

【讨论】:

  • 感谢您的好话@QHarr。问题是这不是一次成功的尝试。不过,它可以使我们非常接近。亚马逊不喜欢机器人,这就是为什么脚本有时会在工作完成之前中断的原因。
  • xml 和硒!明天我会用一个新的头脑来看看这个:-)
  • “对不起亲爱的没有找到”大声笑
【解决方案2】:

获取股票信息的 CSS 选择器

从您的代码中获取以下示例:

您可以使用 CSS 选择器来定位有关库存水平的文本。

.sc-product-availability

使用购物车视图页面的 CSS 查询示例(由您的代码生成):

例如关联 cart view html 的 CSS 查询

. 是 ClassName 的选择器。


VBA

您可以使用.document.querySelectorAll 方法检索匹配项的nodeList(示例中为2)

Dim nodeList As Object
Set nodeList = .document.querySelectorAll(".sc-product-availability")

然后您将遍历其长度以检索项目(未经测试,但这是通用方法)。

Dim i As Long
For i = 0 to nodeList.Length - 1
    Debug.Print nodeList.Item(i).innerText
Next i

希望对你有用。

【讨论】:

  • 找不到我的帖子有用,所以摆脱它。但是,selenium 在这里可能是一个不错的选择,因为它具有用于显式等待的内置工具。
  • 您认为等待是个问题吗? TBH 我今天做了很多网络问题,所以我没有尝试显示的所有内容,而是试图帮助解决问题。明天有更多精力,我可能会看看。如果那时你还没有。
  • 我可以通过在 IE 中定义显式等待来解决这个问题,但这不值得付出努力,这就是为什么我喜欢在这种情况下切换到 selenium。在这里等待绝对是一个问题,因为如果您尝试我的脚本几次,那么您可能会在它的操作中的某个地方收到object variable 错误。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2012-12-05
  • 2015-08-31
相关资源
最近更新 更多