puppeteer 的PDD反爬經歷


使用puppeteer 爬取PDD數據時出現要求登錄,以前是沒有這問題的。

嘗試多種方式如果:

  • 變更UA
  • 變更代理IP
  • 變更Chromium版本(當然最終就是該問題的原因,但是因為版本跨度太大沒有測試出來)

 

最后查找瀏覽器判斷是否在自動化工具控制下的方法,結果查詢到文章,得知了新版Chrome有navigator.webdriver屬性。

如果是在自動化工具控制下,在控制台中輸出navigator.webdriver,可以看到true。

如果直接打開瀏覽器,在控制台出現的則是undefined,注意這里不是navigator.webdriver值為undefined,而是navigator沒有webdriver屬性。

該屬性值不能通過賦值進行覆蓋,但我們可以通過Object.defineProperty來覆蓋:

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

但是如果是通過in或者hasOwnProperty來判斷,

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

覆蓋webdriver為false就沒用了。暫時不知道如何處理這種情況,還沒看到deleteProperty這樣的方法,當然delete也是沒有用的。

翻看PDD前端源碼發現還對phantomjs等進行了檢測。

 

有興趣的可以看看Chrome添加該屬性的緣由:https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/6GysDZCWwB8/rXbGoRohBgAJ

可以根據ChromeStatus得知該屬性添加的版本為63,但這屬性需要到在puppeteer v0.12.0(對應chromium版本為64.0.3240.0 (r508693))中才開始有效,在v0.11.0(63.0.3205.0 (r499413))中還未生效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM