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))中還未生效。

相關文章
相關標籤/搜索