如何用JavaScript结合Puppeteer实现爬虫开发和自动化测试

来源:建站技术作者:上海SEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何用JavaScript结合Puppeteer实现爬虫开发和自动化测试》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用JavaScript结合Puppeteer实现爬虫开发和自动化测试》有用,将其分享出去将是对创作者最好的鼓励。

JavaScript结合Puppeteer可以高效实现爬虫开发和自动化测试工作,Puppeteer能够启动无头Chrome或Chromium浏览器,模拟真实用户操作,完成页面加载、数据提取、交互验证等一系列任务,适用范围覆盖数据采集、功能回归测试、页面性能监控等多个场景。

如何用JavaScript结合Puppeteer实现爬虫开发和自动化测试

Puppeteer环境搭建

首先需要在项目中安装Puppeteer依赖,Node.js版本建议保持在14.0.0及以上,避免兼容性问题。执行以下命令完成安装:

# 初始化项目
npm init -y
# 安装Puppeteer
npm install puppeteer

安装过程会自动下载对应系统的Chromium浏览器,国内网络环境下如果下载缓慢,可以配置npm镜像或者使用puppeteer-core版本,自行指定本地已有的Chrome浏览器路径。

使用Puppeteer实现基础爬虫

爬虫的核心需求是访问目标页面,提取所需的结构化数据,以下示例演示抓取一个示例页面的文章标题列表:

const puppeteer = require('puppeteer');

async function crawlArticleTitles() {
    // 启动浏览器
    const browser = await puppeteer.launch({
        headless: true, // 无头模式,不显示浏览器界面
        args: ['--no-sandbox', '--disable-setuid-sandbox'] // 适配部分服务器环境
    });
    // 创建新页面
    const page = await browser.newPage();
    // 访问目标页面,替换为实际需要爬取的地址
    await page.goto('https://ipipp.com/sample-articles', {
        waitUntil: 'networkidle2' // 等待网络请求空闲,确保页面加载完成
    });
    // 提取页面中的文章标题,选择器需要根据实际页面结构调整
    const titles = await page.evaluate(() => {
        const titleElements = document.querySelectorAll('.article-title');
        return Array.from(titleElements).map(el => el.textContent.trim());
    });
    console.log('抓取到的文章标题:', titles);
    // 关闭浏览器
    await browser.close();
}

crawlArticleTitles().catch(err => console.error('爬虫执行出错:', err));

上述代码中,page.evaluate方法可以在浏览器上下文执行JavaScript代码,直接操作DOM元素获取内容,相比传统HTTP请求爬虫,能够应对动态渲染的页面场景。

使用Puppeteer实现自动化测试

自动化测试可以模拟用户操作,验证页面功能是否符合预期,以下示例演示测试一个简单的登录流程:

const puppeteer = require('puppeteer');

async function testLoginFlow() {
    const browser = await puppeteer.launch({
        headless: false, // 显示浏览器界面,方便观察测试过程
        slowMo: 50 // 每个操作延迟50毫秒,避免操作过快导致元素未加载
    });
    const page = await browser.newPage();
    // 访问登录页面
    await page.goto('https://ipipp.com/login');
    // 输入用户名
    await page.type('#username', 'test_user');
    // 输入密码
    await page.type('#password', 'test_password_123');
    // 点击登录按钮
    await page.click('#login-btn');
    // 等待登录成功后的跳转,等待目标元素出现
    await page.waitForSelector('.user-avatar');
    // 验证登录后的用户名是否正确
    const userName = await page.$eval('.user-name', el => el.textContent);
    if (userName === 'test_user') {
        console.log('登录测试通过');
    } else {
        console.log('登录测试失败,实际用户名:', userName);
    }
    await browser.close();
}

testLoginFlow().catch(err => console.error('测试执行出错:', err));

自动化测试中常用的操作包括输入文本、点击元素、等待元素加载、获取元素内容等,Puppeteer提供了对应的API支持,能够满足大部分UI测试的需求。

常见问题与优化方案

  • 页面加载超时:可以通过page.setDefaultTimeout设置全局超时时间,或者在gotowaitForSelector等方法中单独设置超时参数
  • 反爬虫限制:可以设置浏览器的user-agent,模拟真实浏览器请求头,避免被目标站点识别为爬虫
  • 资源占用过高:无头模式下可以禁用图片、字体等不必要资源的加载,减少内存和CPU消耗

以下是禁用不必要资源的示例代码:

const puppeteer = require('puppeteer');

async function optimizedCrawl() {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    // 拦截请求,禁用图片和字体加载
    await page.setRequestInterception(true);
    page.on('request', req => {
        const resourceType = req.resourceType();
        if (resourceType === 'image' || resourceType === 'font') {
            req.abort();
        } else {
            req.continue();
        }
    });
    await page.goto('https://ipipp.com/target-page');
    // 后续数据提取逻辑
    await browser.close();
}

总结

Puppeteer为JavaScript开发者提供了强大的浏览器控制能力,无论是爬虫开发还是自动化测试,都可以通过简单的API调用实现复杂的交互逻辑。实际使用中需要根据具体场景调整配置,处理好异常情况和性能优化,才能发挥出工具的最大价值。

JavaScriptPuppeteer爬虫开发自动化测试修改时间:2026-06-24 10:48:18

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。