首页 > 解决方案 > 抓取下拉提示

问题描述

我在尝试从下拉按钮获取数据时遇到了一些问题,并且网站中的任何答案(或至少您找到的答案)都没有帮助我。

我要抓取的网站是亚马逊,例如“耐克鞋”。

当我输入属于“耐克鞋”的产品时,我可能会得到这样的产品:

https://www.amazon.com/NIKE-Flex-2017-Running-Shoes/dp/B072LGTJKQ/ref=sr_1_1_sspa?ie=UTF8&qid=1546518735&sr=8-1-spons&keywords=nike+shoes&psc=1

尺寸和颜色随页面一起提供。所以刮很简单。

当我得到这种类型的产品时,问题就来了:

https://www.amazon.com/NIKE-Lebron-Soldier-Mid-Top-Basketball/dp/B07KJJ52S4/ref=sr_1_3?ie=UTF8&qid=1546518445&sr=8-3&keywords=nike+shoes

我必须选择一个尺寸,也许是一种颜色,如果我选择不同的尺寸,价格也会发生变化。

我的问题是,有没有办法,例如,访问每个“鞋码”,这样我至少可以检查那个尺码的价格?

如果页面有某种包含源代码中尺码的列表,那不会那么难,但是当我选择尺码并且源代码上没有出现鞋子尺码的“列表”时,页面会发生变化(URL 也没有t 改变)。

标签: python-3.xxpathweb-scrapingscrapy

解决方案


大多数电子商务网站通过将 json 嵌入 html 并使用 javascript 加载适当的选择来处理变体。因此,一旦您抓取了 html,您很可能拥有所有的变体数据。

在您的情况下,您将鞋码、价格等嵌入到 html 正文中。如果您搜索足够独特的变体名称,您可以在正文中看到一些 json:

在此处输入图像描述

现在你需要:

  1. 确定它的 json 部分在哪里:

    它通常位于<script>标签中的某个位置或作为data-<something>任何标签的属性。

  2. 提取json部分:

    如果它直接嵌入到 javascript 中,您可以使用正则表达式清理提取它:

    script = response.xpath('//script/text()').extract_frist()
    import re
    # capture everything between {}
    data = re.findall(script, '(\{.+?\}_') 
    
  3. 将 json 加载为 dict 并解析树,例如:

    import json
    d = json.loads(data[0])
    d['products'][0]
    

推荐阅读