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

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ş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:50:17