puppeteer应用优化

1,161 阅读1分钟

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
  })
})

请求拦截

过滤无关业务的请求

  1. 解析 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()
  }
})
  1. 对于针对接入的第三方上报请求,无需等待
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()
  }
})
  1. 特定拦截某个请求做业务处理(实现方案同上)
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'
      })
    })
  }
})

参考资料