使用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
相关产品推荐
相关产品推荐

