puppeteer 的PDD反爬经历

使用puppeteer 爬取PDD数据时出现要求登陆,之前是没有这问题的。前端

尝试多种方式若是:web

  • 变动UA
  • 变动代理IP
  • 变动Chromium版本(固然最终就是该问题的缘由,可是由于版本跨度太大没有测试出来)

 

最后查找浏览器判断是否在自动化工具控制下的方法,结果查询到文章,得知了新版Chrome有navigator.webdriver属性。chrome

若是是在自动化工具控制下,在控制台中输出navigator.webdriver,能够看到true。浏览器

若是直接打开浏览器,在控制台出现的则是undefined,注意这里不是navigator.webdriver值为undefined,而是navigator没有webdriver属性。工具

该属性值不能经过赋值进行覆盖,但咱们能够经过Object.defineProperty来覆盖:测试

Object.defineProperty(navigator,'webdriver',{
    get: ()=>false
})

可是若是是经过in或者hasOwnProperty来判断,google

'webdriver' in navigator
//or
navigator.hasOwnProperty('webdriver')

覆盖webdriver为false就没用了。暂时不知道如何处理这种状况,还没看到deleteProperty这样的方法,固然delete也是没有用的。spa

翻看PDD前端源码发现还对phantomjs等进行了检测。代理

 

有兴趣的能够看看Chrome添加该属性的原因:https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/6GysDZCWwB8/rXbGoRohBgAJcode

能够根据ChromeStatus得知该属性添加的版本为63,但这属性须要到在puppeteer v0.12.0(对应chromium版本为64.0.3240.0 (r508693))中才开始有效,在v0.11.0(63.0.3205.0 (r499413))中还未生效。