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

