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

NodeJS报错TypeError: pageScraper.scraper不是函数的解决求助

问题解决:TypeError: pageScraper.scraper is not a function 及StockX数据爬取修正方案

错误原因

你的pageScraper.js没有导出名为scraper的函数,而是直接自执行了一个异步函数,同时还重复启动了Puppeteer浏览器,和browser.js的浏览器实例逻辑冲突,导致pageController.js调用pageScraper.scraper()时找不到该函数。

修正步骤

1. 重构pageScraper.js,导出scraper函数

修改pageScraper.js,移除自执行函数,改为导出接收浏览器实例的scraper函数,使用传入的浏览器创建页面,不再单独启动浏览器:

const fs = require("fs").promises;

async function scraper(browser) {
  const page = await browser.newPage();
  const ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";
  await page.setUserAgent(ua);
  const url = "https://stockx.com/fr-fr/dior-b713-cactus-jack-mocha";

  // 等待目标API响应并提取数据
  const responseP = page.waitForResponse(async response => {
    if (response.url() === "https://stockx.com/api/p/e") {
      const payload = await response.json();
      return payload?.data?.product?.market?.bidAskData;
    }
  });

  await page.goto(url, { waitUntil: "domcontentloaded" });
  const result = await (await responseP).json();
  
  // 提取各尺码的highestBid和lowestAsk
  const sizeData = result.data.product.market.bidAskData.reduce((acc, item) => {
    acc[item.size] = {
      highestBid: item.highestBid,
      lowestAsk: item.lowestAsk
    };
    return acc;
  }, {});

  return sizeData;
}

module.exports = { scraper };

2. 修正pageController.js的文件写入逻辑

pageController.js中使用了fs.promises,建议用await替代回调函数,同时确保正确接收scraper返回的尺码数据:

const pageScraper = require('./pageScraper');
const fs = require("fs").promises;

async function scrapeAll(browserInstance) {
  let browser;
  try {
    browser = await browserInstance;
    const scrapedData = await pageScraper.scraper(browser);
    
    // 用await写入文件,避免回调嵌套
    await fs.writeFile("data.json", JSON.stringify(scrapedData, null, 2), 'utf8');
    console.log("数据已成功爬取并保存到'./data.json'");
    console.log(scrapedData);
  } catch (err) {
    console.log("无法解析浏览器实例 => ", err);
  } finally {
    // 爬取完成后关闭浏览器
    await browser?.close();
  }
}

module.exports = (browserInstance) => scrapeAll(browserInstance);

3. 保持其他文件不变

browser.js和index.js的逻辑无需修改,它们负责启动浏览器并传递给控制器。

运行验证

执行node index.js,程序会启动浏览器,爬取指定页面的尺码数据,最终data.json会生成如下格式的内容:

{
  "38": {
    "highestBid": xxx,
    "lowestAsk": xxx
  },
  "39": {
    "highestBid": xxx,
    "lowestAsk": xxx
  },
  ...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:36:23