初探Puppeteer自动化

132 阅读3分钟

一、我是谁

Puppeteer是一个Node库,由Chrome团队进行维护。简单的来说就是一个运行在命令行中的浏览器,可以通过代码来控制浏览器,让我们为所欲为!

又名《爬虫界扫地僧》

为什么叫爬虫界的扫地僧了?因为它可以模拟真实用户的操作,从打开标签页,到输入关键字,甚至在输入过程中可以模拟用户打字速度的这种精细操作,严重混淆服务端风控服务的判断,那一般的风控系统会从几个方面进行反爬虫

  1. 接口调用频次限制
  2. 同IP的访问频次
  3. 验证码
  4. 登录token验证
  5. 链接随机化
  6. 请求头验证

但这些验证对Puppeteer来说,基本无效。因为对于整个请求方式和行为判断上讲,用户的真实场景模拟可以直接宣布以上判断无效

二、我能做什么

  1. 利用网页生成PDF、图片
  2. 爬取网站内容,包括SPA应用
  3. 自动化测试,表单提交、UI测试、键盘输入等
  4. 站点自动用例测试,比如自动下单
  5. 捕获站点的时间线,分析网站性能问题
  6. 打开控制台
  7. 加断点调试
  8. 添加自定义函数
  9. 手机模拟
  10. 请求拦截
  11. 还有很多就不举例了

三、我怎么使用

  1. 案例(截图):
const puppeteer = require('puppeteer')
const app = async () => {
    const browser = await puppeteer.launch({
        headless: false, // 开始预览模式,可以看到浏览器界面
        slowMo: 1000, // 减速1000ms,放慢浏览器执行速度,方便测试观察
        timeout: 120000, // 超时配置
        defaultViewport: { width: 390, height: 844 }, // 页面窗口配置
        args: ['–no-sandbox', '--window-size=800,1000'], // 浏览器窗口配置
    })

    const page = await browser.newPage()
    await page.goto('https://m.baidu.com') // 跳转百度首页

    // 截图
    await page.screenshot({ path: './index.png' })

    // 结束,关闭浏览器
    browser.close()
}

app()
  1. 案例(生成PDF):
const puppeteer = require('puppeteer')
const app = async () => {
    const browser = await puppeteer.launch({
        headless: true,
        slowMo: 1000,
        timeout: 120000,
        defaultViewport: { width: 390, height: 844 },
        args: ['–no-sandbox', '--window-size=800,1000'],
    })

    const page = await browser.newPage()
    await page.goto('https://m.baidu.com')

    // 生成pdf
    await page.pdf({ path: './index.pdf' }) // 这里有个坑,生成pdf不能使用预览模式,也就是headless需要为true

    // browser.close()
}

app()
  1. 案例(百度搜索):
const puppeteer = require('puppeteer')
const app = async () => {
    const browser = await puppeteer.launch({
        headless: false,
        slowMo: 1000,
        timeout: 120000,
        defaultViewport: { width: 390, height: 844 },
        args: ['–no-sandbox', '--window-size=800,1000'],
    })

    const page = await browser.newPage()
    await page.goto('https://m.baidu.com')

    // 输入账号密码
    await page.waitForTimeout(2000)
    const inputSelector = '#index-kw'
    await page.waitForSelector(inputSelector)
    await page.type(inputSelector, '我好帅')

    // 点击登录
    await page.waitForTimeout(2000)
    const submitSelector = '#index-bn'
    await page.waitForSelector(submitSelector)
    page.click(submitSelector)
    
    // browser.close()
}

app()

四、我能带来什么价值

  1. 部门角度

    1. 开发各种项目基建工具
    2. 开发各种性能优化工具
    3. 自由发挥
  2. 个人角度

    1. 各种小工具
    2. 12306抢票
    3. 网页小外挂
    4. 自由发挥

官方文档:puppeteer.js中文文档|puppeteerjs中文网|puppeteer爬虫教程