Puppeteer遍历亚马逊分页获取Deal链接时翻页点击失效求助
解决Puppeteer遍历亚马逊土耳其站分页获取Deal链接的问题
问题核心
你尝试用Puppeteer遍历亚马逊土耳其站Deal页面的所有分页、抓取商品链接时,遇到两个关键问题:
page.click()无法在page.evaluate()中使用- 改用原生JS点击翻页按钮后,分页遍历逻辑完全失效
这是因为你把同步的while循环和异步的页面操作混在一起,且错误地在浏览器上下文里处理整个分页流程,没有利用Puppeteer的异步等待能力。
修正后的代码
const puppeteer = require("puppeteer"); (async () => { const browser = await puppeteer.launch({ headless: false, slowMo: 20, defaultViewport: null, }); const page = await browser.newPage(); await page.goto("https://www.amazon.com.tr/deals?ref_=nav_cs_gb", { waitUntil: "networkidle2", }); const allDealLinks = []; let hasNextPage = true; while (hasNextPage) { // 等待商品容器加载完成 await page.waitForSelector('[data-testid="grid-deals-container"]'); // 抓取当前页的所有Deal链接 const currentPageLinks = await page.evaluate(() => { return Array.from(document.querySelectorAll('[data-testid="grid-deals-container"] > div > div > div > a')) .map(link => link.href); }); allDealLinks.push(...currentPageLinks); // 检查是否存在下一页按钮 const nextPageButton = await page.$(".a-last a"); if (!nextPageButton) { hasNextPage = false; break; } // 点击下一页并等待页面加载完成 await Promise.all([ nextPageButton.click(), page.waitForNavigation({ waitUntil: "networkidle2" }) ]); } // 打印所有抓取到的链接 console.log("所有Deal链接:", allDealLinks); await browser.close(); })();
关键修改点说明
- 将分页逻辑移至Node.js上下文:放弃在
page.evaluate()中处理循环与翻页,改用Puppeteer API在Node端控制流程,确保能正确等待页面加载、元素操作完成。 - 强制等待元素加载:每次循环先调用
page.waitForSelector()等待商品容器出现,避免页面未加载完全导致元素查找失败。 - 简化链接选择逻辑:使用
querySelectorAll直接定位所有商品链接,替代多层children嵌套写法,代码更健壮且易维护。 - 同步等待页面导航:点击下一页时,通过
Promise.all()同时执行点击操作与页面导航等待,保证页面完全加载后再进入下一轮抓取。 - 准确判断下一页状态:用
page.$()检测下一页按钮是否存在,无按钮时立即终止循环。
内容的提问来源于stack exchange,提问作者Hüseyin Aktaş
相关产品推荐
相关产品推荐

