如何修改Puppeteer代码将多页符合折扣要求的商品链接汇总到单个数组
修改后完整代码及说明
本次修改核心调整如下:
- 新增全局汇总数组
all_links存储所有分页符合要求的商品链接 - 修复原代码遗漏第一页商品数据的问题:原逻辑进入分页循环后直接点击下一页,会跳过初始加载的第一页内容
- 每页筛选完成后将当前页符合要求的链接批量推入汇总数组
- 分页遍历结束后自动关闭浏览器,返回最终汇总数组
const puppeteer = require('puppeteer') const minDiscount = 20; async function getLinks() { const browser = await puppeteer.launch({ headless: false, defaultViewport: null, }); const page = await browser.newPage(); // 初始化汇总数组 const all_links = []; const url = 'https://www.mytoys.de/spielzeug-spiele/holz/'; await page.goto(url); // 封装单页商品爬取逻辑,复用给所有分页 const scrapeCurrentPage = async () => { await page.waitForTimeout(1500); const products = await page.$$('.prod-grid.js-prod-grid .prod-grid__item.js-prod-grid_item'); const proms = await Promise.allSettled( products.map(async (prod) => { const disc = await prod.$$eval( '.prod-grid.js-prod-grid .prod-flag.prod-flag-sale', (discount) => discount.map((discItem) => discItem.innerText.replace(/[^0-9.]/g, '').replace(/\D+/g,'0') ) ); if (disc.length > 0) { const discountInt = parseInt(disc[0], 10); if (discountInt >= minDiscount) { const link = await prod.$$eval('.prod-grid.js-prod-grid .prod-tile__link.js-prodlink', (allAs) => allAs.map((a) => a.href)); if (link.length > 0) { return link[0]; } } } return null; }) ); const bulkArray = proms.map((item) => { if (item.status === 'fulfilled') return item.value; }); const endArray = bulkArray.filter(item => item !== null); // 当前页结果推入汇总数组 all_links.push(...endArray); console.log('当前页已爬取符合条件链接数:', endArray.length); } // 先爬第一页 await scrapeCurrentPage(); // 遍历后续分页 while(await page.$(".pager__link--next")){ await page.waitForSelector(".pager__link--next") await page.waitForTimeout(1000); await page.click('.pager__link--next') // 爬当前新加载的分页 await scrapeCurrentPage(); } // 关闭浏览器 await browser.close(); // 返回汇总结果 return all_links; } // 调用函数并打印最终汇总结果 getLinks().then(res => { console.log('所有分页符合条件的总链接数:', res.length); console.log('汇总链接列表:', res); });
内容的提问来源于stack exchange,提问作者Faster than a snail
相关产品推荐
相关产品推荐

