Puppeteer爬虫函数调用传参异常:productUrl未正确赋值
问题分析与解决方案
问题根源
- 函数提前执行+参数未定义:
searchUrls数组中直接写了alzask(productUrl),此时productUrl还未定义,导致函数执行时参数为undefined,而且这里存储的是函数执行后的Promise结果,而非函数本身。另外其他项是字符串(比如"edigitalsk(productUrl)"),根本不是可执行函数,无法调用。 - 未声明循环变量:
for循环中的i和j未用let/const声明,会成为全局变量,引发作用域冲突。 - 逻辑冗余:双层循环匹配域名效率低,无匹配判断逻辑可简化。
修复后的代码
const puppeteer = require("puppeteer"); async function scrapeData() { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 前置定义处理函数,逻辑更清晰 async function alzask(productUrl) { const priceSelector = ".price-box__price"; await page.goto(productUrl); return await page.$eval(priceSelector, price => price.textContent.trim()); } async function edigitalsk(productUrl) { // 补充edigital.sk的处理逻辑 await page.goto(productUrl); return "edigital price data"; } async function mironetcz(productUrl) { // 补充mironet.cz的处理逻辑 await page.goto(productUrl); return "mironet price data"; } const productUrls = [ 'https://www.alza.sk/nest-hub-2nd-gen-charcoal-eu-d6845008.htm', 'https://edigital.sk/prenosny-reproduktor/google-ga01331gr-nest-hub-2-smart-reproduktor-svetlo-sedy-p899177', 'https://www.mironet.cz/google-nest-hub-2-charcoal-7-displej-wifi-bt-50-google-assistant+dp497233/', 'https://www.planeo.sk/katalog/1316639-google-nest-hub-2nd-gen-chalk-hlasovy-asistent.html' ]; // 用对象映射域名与处理函数,替代双层循环 const domainHandlers = { "alza.sk": alzask, "edigital.sk": edigitalsk, "mironet.cz": mironetcz }; for (const productUrl of productUrls) { // 快速查找匹配的处理函数 const matchedHandler = Object.entries(domainHandlers).find(([domain]) => productUrl.includes(domain) ); if (matchedHandler) { const [_, handler] = matchedHandler; const price = await handler(productUrl); console.log(price); } else { console.log(`Product with url: ${productUrl} doesn't have storeFunc in database.`); } } await browser.close(); } scrapeData();
优化点说明
- 对象映射替代双层循环:
domainHandlers直接绑定域名与处理函数,通过Object.entries快速查找匹配项,代码更简洁高效。 - 简化数组结构:原
productUrls是二维数组,每个元素仅含一个URL,改为一维数组更合理。 - 规范变量声明:全部用
const/let声明变量,避免全局污染。 - 函数前置定义:处理函数放在使用前,无需依赖函数提升,逻辑更清晰。
- 模板字符串优化:用模板字符串替代字符串拼接,可读性更强。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

