0

0

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

花韻仙語

花韻仙語

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

|

271人浏览过

|

来源于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,否则后续页码计算错误。

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

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

AI Web Designer
AI Web Designer

AI网页设计师,快速生成个性化的网站设计

下载
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 分页爬虫

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2918

2024.08.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

177

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

530

2026.03.04

热门下载

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

精品课程

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

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 43万人学习

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

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