抓取下拉菜单提示

时间:2019-01-03 12:38:19

标签: python-3.x xpath web-scraping scrapy

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

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

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

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不变)。

1 个答案:

答案 0 :(得分:2)

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

在您的情况下,您会在html正文中嵌入鞋子的尺寸,价格等信息。如果您搜索足够唯一的变体名称,您将在正文中看到一些json:

enter image description here

现在您需要:

  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]