一、我是谁
Puppeteer是一个Node库,由Chrome团队进行维护。简单的来说就是一个运行在命令行中的浏览器,可以通过代码来控制浏览器,让我们为所欲为!
又名《爬虫界扫地僧》
为什么叫爬虫界的扫地僧了?因为它可以模拟真实用户的操作,从打开标签页,到输入关键字,甚至在输入过程中可以模拟用户打字速度的这种精细操作,严重混淆服务端风控服务的判断,那一般的风控系统会从几个方面进行反爬虫
- 接口调用频次限制
- 同IP的访问频次
- 验证码
- 登录token验证
- 链接随机化
- 请求头验证
但这些验证对Puppeteer来说,基本无效。因为对于整个请求方式和行为判断上讲,用户的真实场景模拟可以直接宣布以上判断无效
二、我能做什么
- 利用网页生成PDF、图片
- 爬取网站内容,包括SPA应用
- 自动化测试,表单提交、UI测试、键盘输入等
- 站点自动用例测试,比如自动下单
- 捕获站点的时间线,分析网站性能问题
- 打开控制台
- 加断点调试
- 添加自定义函数
- 手机模拟
- 请求拦截
- 还有很多就不举例了
三、我怎么使用
- 案例(截图):
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()
- 案例(生成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()
- 案例(百度搜索):
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()
四、我能带来什么价值
-
部门角度
- 开发各种项目基建工具
- 开发各种性能优化工具
- 自由发挥
-
个人角度
- 各种小工具
- 12306抢票
- 网页小外挂
- 自由发挥