puppeteer 文档内容较多,目前就常见应用场景进行启动参数优化即处理方式
启动参数优化
puppeteer.launch({
args: [
'--no-sandbox', // 沙盒模式
'--disable-setuid-sandbox', // uid沙盒
'--disable-dev-shm-usage', // 创建临时文件共享内存
'--disable-accelerated-2d-canvas', // canvas渲染
'--disable-gpu' // GPU硬件加速
]
})
反爬策略(攻与防))
// 将navigator中webdriver属性设为false,通过页面监测
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => false
})
})
请求拦截
过滤无关业务的请求
- 解析 dom 内容,无需图片音频等资源
const blockTypes = new Set(['image', 'media', 'font'])
// 开启请求拦截功能
page.setRequestInterception(true)
page.on('request', request => {
// 根据请求类型过滤
const resourceType = request.resourceType()
const shouldBlock = blockTypes.has(resourceType)
if (shouldBlock) {
request.abort()
} else {
request.continue()
}
})
- 对于针对接入的第三方上报请求,无需等待
await page.setRequestInterception(true)
page.on('request', request => {
const url = request.url()
// console.log(url)
if (url.includes('google.com') || url.includes('baidu.com')) {
request.abort()
} else {
request.continue()
}
})
- 特定拦截某个请求做业务处理(实现方案同上)
await page.setRequestInterception(true) //开启请求拦截
page.on('request', request => {
const url = request.url()
if (url === 'https://abc.com/api/getData') {
//对请求重写
return request.continue({
//可以对 url,method,postData,headers 进行覆盖
headers: Object.assign({}, request.headers(), {
'Auth-abc': 'abcde'
})
})
}
})