news 2026/6/9 18:30:12

【Puppeteer 实战】自动登录后台并分页提取表格数据(含 50 条/页切换)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Puppeteer 实战】自动登录后台并分页提取表格数据(含 50 条/页切换)

本文通过一个完整示例,演示如何使用Puppeteer自动访问后台系统、设置 Cookie、切换分页大小,并循环点击「下一页」抓取所有表格 HTML 数据。


一、应用场景说明

在实际项目中,我们经常遇到以下需求:

  • 后台系统需要登录才能访问
  • 数据列表有分页,需要自动翻页
  • 希望批量抓取每一页的表格数据
  • 页面基于 Element UI(el-pagerbtn-next

本文将一步步实现:

✅ 打开后台页面
✅ 使用 Cookie 模拟登录
✅ 切换为50 条/页
✅ 自动计算总页数
✅ 循环点击「下一页」
✅ 抓取所有表格 HTML


二、环境准备

1. 安装 Puppeteer

npminstallpuppeteer

2. Node.js 版本

建议使用:

  • Node.js ≥ 14
  • Puppeteer ≥ 19

三、完整示例代码

下面是完整可运行的示例代码:

constpuppeteer=require('puppeteer');constfs=require('fs');// 封装一个延时方法functionwaitForTimeout(time){returnnewPromise(resolve=>setTimeout(resolve,time));}(async()=>{constbrowser=awaitpuppeteer.launch({headless:false// 关闭无头模式,方便调试});try{constpage=awaitbrowser.newPage();awaitpage.setViewport({width:1920,height:800});// 1. 进入后台登录页面awaitpage.goto('http://localhost:8093/admin');// 2. 设置登录 Cookie(模拟已登录)constcookies=[{name:'Admin-Token',value:'你的 token',domain:'localhost',path:'/'}];// 如果需要启用 Cookie,取消注释// await page.setCookie(...cookies);// 3. 跳转到数据列表页awaitpage.goto('http://localhost:8093/category');// 4. 切换分页大小为 50 条/页constpageSizeXPath='//span[text()="50条/页"]';awaitpage.waitForXPath(pageSizeXPath);const[pageSizeBtn]=awaitpage.$x(pageSizeXPath);if(pageSizeBtn){awaitpageSizeBtn.evaluate(el=>el.click());console.log('已切换为 50 条/页');}// 5. 获取总页数awaitpage.waitForSelector('ul.el-pager');constliElements=awaitpage.$$('ul.el-pager li');constlastLi=liElements[liElements.length-1];lettotalPages=1;if(lastLi){totalPages=parseInt(awaitpage.evaluate(li=>li.textContent,lastLi));console.log('总页数:',totalPages);}// 6. 循环点击下一页并抓取表格consttableSelector='table';constnextBtnSelector='button.btn-next';awaitpage.waitForSelector(nextBtnSelector,{visible:true});letcurrentPage=1;letallTableHTML='';while(currentPage<=totalPages){console.log(`正在抓取第${currentPage}`);// 抓取当前页表格consttables=awaitpage.$$(tableSelector);for(consttableoftables){consthtml=awaittable.evaluate(el=>el.outerHTML);allTableHTML+=html+'\n\n';}// 点击下一页constnextBtn=awaitpage.$(nextBtnSelector);if(!nextBtn)break;awaitnextBtn.click();awaitwaitForTimeout(3000);currentPage++;}console.log('分页抓取完成');// 7. 可选:保存为 HTML 文件fs.writeFileSync('tables.html',allTableHTML,'utf-8');console.log('表格 HTML 已保存到 tables.html');// await browser.close();}catch(e){console.error('发生错误:',e);}})();

四、关键代码讲解

1️⃣ 模拟登录(Cookie)

awaitpage.setCookie({name:'Admin-Token',value:'xxx',domain:'localhost',path:'/'});

适用于:

  • 后台 token 登录
  • 无需输入账号密码
  • 常见于 Vue / Element UI 项目

2️⃣ XPath 精准点击「50条/页」

constxpath='//span[text()="50条/页"]';const[el]=awaitpage.$x(xpath);awaitel.evaluate(e=>e.click());

优点:

  • 不依赖 class
  • 文本唯一即可定位

3️⃣ 获取 Element UI 总页数

ul.el-pager li:last-child

Element UI 的分页结构非常规整,最后一个li就是最大页数。


4️⃣ 自动翻页核心逻辑

while(currentPage<=totalPages){awaitnextBtn.click();awaitwaitForTimeout(3000);}

建议:

  • 使用显式等待
  • 避免点击过快导致请求丢失
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 16:50:27

JBoltAI AI应用中台:重塑企业智能化的统一基座与范式

在企业智能化转型进程中&#xff0c;“系统碎片化、数据孤岛、开发门槛高、能力难复用”等痛点&#xff0c;导致多数企业陷入“AI技术看得见、落地用不上”的困境。JBoltAI基于Java生态构建的AI应用中台&#xff0c;并非简单的工具集合&#xff0c;而是通过“统一基座标准化范式…

作者头像 李华
网站建设 2026/6/7 20:13:58

免费网站进阶!——InfinityFree创建数据库教程

&#x1f496;InfinityFree 简介 InfinityFree是一个提供免费虚拟主机服务的平台。每个账户可创建3个站点&#xff0c;支持自定义域名&#xff08;需使用其提供的二级域名&#xff09; 1 ⭐创建网站详见另一篇博客&#xff1a; /* by 01130.hk - online tools website : 01130.…

作者头像 李华
网站建设 2026/6/6 22:23:14

学长亲荐2026专科生必用TOP10AI论文工具测评

学长亲荐2026专科生必用TOP10AI论文工具测评 2026年专科生论文写作工具测评&#xff1a;为何需要一份精准指南&#xff1f; 随着AI技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的论文辅助软件&#xff0c;如…

作者头像 李华
网站建设 2026/6/6 7:39:16

【C++】哈希扩展——位图和布隆过滤器的介绍与实现

【C】哈希扩展——位图和布隆过滤器的介绍与实现&#xff08;2026年实用版&#xff09; 哈希扩展是数据结构中的高频话题&#xff0c;尤其在海量数据场景&#xff08;如缓存、去重、搜索&#xff09;。位图&#xff08;Bitmap&#xff09; 和 布隆过滤器&#xff08;Bloom Fil…

作者头像 李华