0

0

如何使用 Puppeteer 稳健实现分页爬取(Next Page)

花韻仙語

花韻仙語

发布时间:2025-12-27 23:29:06

|

231人浏览过

|

来源于php中文网

原创

如何使用 Puppeteer 稳健实现分页爬取(Next Page)

本文详解 puppeteer 分页爬取中常见的 url 重复处理、导航失效及页码错乱问题,提供可落地的解决方案,确保每页仅处理一次,并正确识别末页边界。

在使用 Puppeteer 进行分页爬取(如 https://clerk.house.gov/Votes 这类前端分页站点)时,一个典型陷阱是:页面通过哈希跳转(#)或异步路由更新 URL,导致 page.waitForNavigation() 无法可靠触发——这正是原代码反复打印 ?page=2#、?page=3# 等重复 URL 的根本原因。waitForNavigation 仅监听完整的导航事件(如 GET 请求),而 SPA 或锚点驱动的分页常不触发该事件。

✅ 正确做法:用 browser.waitForTarget() 监听新页面加载

替代脆弱的 waitForNavigation(),应监听浏览器目标(Target)的创建与 URL 变化。关键逻辑如下:

const url = page.url();
console.log('Processing page:', url);

// ✅ 提取当前页码(兼容初始页无参数的情况)
const currentPageNum = url.includes('?page=')
  ? parseInt(url.match(/page=(\d+)/)[1], 10)
  : 1;

// ✅ 点击“下一页”按钮(注意:直接 click() 即可,无需 selector 参数)
await nextButton.click();

// ✅ 等待目标 URL 变为预期的下一页(更鲁棒,不受 hash 干扰)
await browser.waitForTarget(
  target => target.url().endsWith(`?page=${currentPageNum + 1}`),
  { timeout: 10000 }
);
⚠️ 注意事项:nextButton.click() 不接受 CSS 选择器参数(原代码 click('a[aria-label="Next"]...') 是错误用法,会报错);必须在点击前获取当前 URL,否则 page.url() 可能仍是旧地址(因点击后 URL 更新有延迟);waitForTarget 需设置合理超时(如 10s),避免无限等待;初始页(/Votes)无 ?page= 参数,需显式判断并设为 page=1,否则后续页码计算错误。

✅ 补充:处理末页边界(防止漏掉最后一页)

原逻辑在「下一页按钮消失时退出」,意味着最后一页的数据从未被提取。修正方式是:先处理当前页,再尝试翻页。完整结构建议如下:

腾讯混元
腾讯混元

腾讯混元大由腾讯研发的大语言模型,具备强大的中文创作能力、逻辑推理能力,以及可靠的任务执行能力。

下载
while (true) {
  // ✅ 1. 先处理当前页(无论是否为末页)
  console.log('Processing page:', page.url());
  // ? 在此处插入你的数据提取逻辑,例如:
  // const votes = await page.$$eval('.vote-item', els => els.map(e => e.textContent));

  // ✅ 2. 尝试查找并点击下一页按钮
  const nextButton = await page
    .waitForSelector('a[aria-label="Next"] span[class~="fa"]', { timeout: 3000 })
    .catch(() => null);

  if (!nextButton) {
    console.log('No more pages. Scraping completed.');
    break;
  }

  // ✅ 3. 执行翻页(使用上述 waitForTarget 方案)
  const currentUrl = page.url();
  const pageNum = currentUrl.includes('?page=')
    ? parseInt(currentUrl.match(/page=(\d+)/)[1], 10)
    : 1;

  await nextButton.click();
  await browser.waitForTarget(
    t => t.url().endsWith(`?page=${pageNum + 1}`),
    { timeout: 10000 }
  );
}

✅ 总结

  • ❌ 避免 page.waitForNavigation() 处理哈希/SPA 分页;
  • ✅ 使用 browser.waitForTarget() + URL 断言,精准等待目标页加载;
  • ✅ 始终先处理当前页,再判断是否翻页,确保末页不遗漏;
  • ✅ 点击操作后立即捕获 page.url(),避免页码解析错误;
  • ? 调试时可添加 await page.screenshot({ path:page-${pageNum}.png}); 辅助验证页面状态。

遵循以上模式,即可构建稳定、可维护的 Puppeteer 分页爬虫

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

498

2023.06.15

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

260

2023.07.27

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

731

2023.07.28

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

532

2023.08.01

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

748

2023.08.10

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

594

2023.08.10

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

556

2023.08.21

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

386

2023.08.22

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.6万人学习

CSS教程
CSS教程

共754课时 | 16.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号