Cheerio 网络抓取 ul > li 属性

Cheerio web scraping ul > li attribute

我想从这个 url 中抓取 "data-price",但它返回时未定义。有什么想法吗?

https://i.stack.imgur.com/N9gei.png

async function variant() {
    const response = await axios("https://extrabutterny.com/collections/release-draws/products/nike-sb-dunk-low-pro-blue-fury-bq6817-400?variant=31800767021104");   
    console.log("response: ", response);
    const html = await response.data;
    const $ = cheerio.load(html);
    const id = $(".DrawApp-SizeChartList > li").attr("data-price");
    console.log(id);
}

当您发出请求时,网站 return 的一些代码将由您的浏览器处理。一些网站 return java 将构建页面的脚本代码。这是你的情况。该网站正在 return 编写一些代码,需要浏览器处理 java 脚本,然后构建 HTML。
我不知道 axios 是否可以做到这一点,但你需要的是一个 无头浏览器 。我建议你 Puppeteer.
很好的教程here.

后台返回HTML时,您要查找的class中没有List项。外观如下:

<ul class="DrawApp-SizeChartList">
</ul>

没有列表项。这就是 idundefined 的原因。浏览器中的 JavaScript 运行 并填充列表。

好处是您无需 运行 browser/puppeteer 即可获得价格。该网站向后端查询以获取有关产品的详细信息。

这是 url: https://eb-draw.herokuapp.com/draws/4482352611376

您会在此处看到价格:

"variants": [
  {
    "id": 16793,
    "draw_id": 1764,
    "variant_id": "31800767021104",
    "variant_label": "8",
    "variant_price": "100.00",
    "winner_count": 3,
    "winners_left": 3,
    "current_entries": 0,
    "created_at": "2020-03-27 21:19:14",
    "updated_at": "2020-03-27 21:19:14"
  },
  ...
] 

但是您从哪里获得产品的 ID? 在这里:

$(".js-price-preview").attr("data-product-id")
// "4482352611376"

希望对您有所帮助!

我知道您已经接受了答案,但是如果您使用 https://github.com/whatsdis/web-scraping-language

然后你可以编写 WSL,它也可以呈现 javascript 页面,你可以使用 Xpath:

GOTO https://extrabutterny.com/collections/release-draws/products/nike-sb-dunk-low-pro-blue-fury-bq6817-400?variant=31800767021104

EXTRACT {'price':'*[@class="DrawApp-SizeChartList"]/li/@data-price'}