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

Puppeteer爬虫函数调用传参异常:productUrl未正确赋值

问题分析与解决方案

问题根源

  1. 函数提前执行+参数未定义:searchUrls数组中直接写了alzask(productUrl),此时productUrl还未定义,导致函数执行时参数为undefined,而且这里存储的是函数执行后的Promise结果,而非函数本身。另外其他项是字符串(比如"edigitalsk(productUrl)"),根本不是可执行函数,无法调用。
  2. 未声明循环变量:for循环中的i和j未用let/const声明,会成为全局变量,引发作用域冲突。
  3. 逻辑冗余:双层循环匹配域名效率低,无匹配判断逻辑可简化。

修复后的代码

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();

优化点说明

  1. 对象映射替代双层循环:domainHandlers直接绑定域名与处理函数,通过Object.entries快速查找匹配项,代码更简洁高效。
  2. 简化数组结构:原productUrls是二维数组,每个元素仅含一个URL,改为一维数组更合理。
  3. 规范变量声明:全部用const/let声明变量,避免全局污染。
  4. 函数前置定义:处理函数放在使用前,无需依赖函数提升,逻辑更清晰。
  5. 模板字符串优化:用模板字符串替代字符串拼接,可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:21:12