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