You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Nightmare爬取亚马逊印度站商品价格返回NaN问题求助

解决亚马逊价格追踪器返回NaN的问题

问题分析与修复步骤

1. DOM选择器使用错误

document.getElementsByClassName("a-price-whole")返回的是HTMLCollection元素集合,不是单个DOM元素,直接访问.innerText会得到undefined,最终parseFloat(undefined)返回NaN。

修复:改用document.querySelector(".a-price-whole")直接获取单个目标元素,或从集合中取第一个元素并做空值判断:

// 方案1:用querySelector更简洁
.evaluate(() => document.querySelector(".a-price-whole")?.innerText)

// 方案2:从元素集合中取第一个元素
.evaluate(() => document.getElementsByClassName("a-price-whole")[0]?.innerText)

2. Nightmare的.end()未调用

代码中.end未加括号,属于未执行方法,会导致Nightmare实例无法正确结束,影响Promise返回值。

修复:改为.end()调用方法:

const priceString = await nightmare
    .goto("https://www.amazon.in/Apple-AirPods-Pro-2nd-Generation/dp/B0BDKD8DVD/ref=sr_1_5")
    .wait(".a-price-whole") // 建议等待目标元素,而非无关的.a-offscreen
    .evaluate(() => document.querySelector(".a-price-whole")?.innerText)
    .end() // 加上括号执行结束方法

3. 未正确处理异步函数

parser()是异步函数,返回的是Promise对象,直接res.send(ans)会把Promise对象返回给客户端,而非实际价格数值。

修复:将路由处理函数改为async,用await获取异步结果:

app.get("/", async (req, res) => {
   const ans = await parser();
    res.send(ans ? ans.toString() : "价格获取失败");
})

4. 额外优化:清理价格字符串中的非数字字符

亚马逊印度站价格可能包含千分位逗号(如19,999),直接parseFloat会解析失败,需先清理字符串:

const cleanedPrice = priceString?.replace(/[^0-9.]/g, "");
const priceNumber = parseFloat(cleanedPrice) || 0;

修复后的完整代码

parser.js

const nightmare = require("nightmare")();

async function checkprice() {
    try {
        const priceString = await nightmare
            .goto("https://www.amazon.in/Apple-AirPods-Pro-2nd-Generation/dp/B0BDKD8DVD/ref=sr_1_5")
            .wait(".a-price-whole")
            .evaluate(() => document.querySelector(".a-price-whole")?.innerText)
            .end();
        
        const cleanedPrice = priceString?.replace(/[^0-9.]/g, "");
        const priceNumber = parseFloat(cleanedPrice) || 0;
        console.log(priceNumber);
        return priceNumber;
    } catch (error) {
        console.error("获取价格失败:", error);
        return 0;
    }
};

module.exports = checkprice;

app.js

const express = require("express")
const parser = require("./parser")

const app = express();

app.listen(3000, () => {
    console.log("listening on port 3000")
})

app.get("/", async (req, res) => {
   const ans = await parser();
    res.send(ans !== 0 ? `当前价格:${ans} INR` : "无法获取商品价格");
})

内容的提问来源于stack exchange,提问作者gratus richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:25:26