反爬蟲——使用chrome headless時一些需要註意的細節
以前我們介紹過chrome headless的用法(https://www.cnblogs.com/apocelipes/p/9264673.html)。
今天我們要稍微提一下其中一個細節。
反爬和window.navigator對象
navigator對象,一個對大家來說既熟悉又陌生的名詞,熟悉是因為在學BOM對象的時候或多或少都見過甚至在代碼中使用過,陌生是因為對於navigator對象來說雖然各大瀏覽器都有實現卻一直沒有一個統一的標準,所以在不同瀏覽器上的navigator對象也可能是不一樣的,所以不鼓勵在生產環境使用,用得少,自然也就陌生了。
然而反爬就是要不從常規處下手,如果有某個特性比較冷僻,又可以用來區分人類用戶和爬蟲或者增加爬取難度,那麽它就一定會被反爬工程師善加利用。今天我們的主角就是navigator對象了。
一般的反爬蟲會有header驗證,瀏覽器驗證等等,這些在你使用headless browsers時都不成問題,所以反爬工程師們要如何阻止你的爬蟲呢?不急,我們先看下正常瀏覽器裏navigator對象的內容:
這是chrome瀏覽器,因為headless沒辦法截圖,所以我就把navigator對象的屬性全部保存成了文本,這是使用headless時的信息:
vendorSub: productSub: 20030107 vendor: Google Inc. cookieEnabled: true appCodeName: Mozilla appName: Netscape appVersion: 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ... ... webdriver: true... unregisterProtocolHandler: function unregisterProtocolHandler() { [native code] } deviceMemory: 8 clipboard: {} ...
因為篇幅,我做了節選,需要註意的就是紅色的部分,這是相比正常瀏覽器所多出來的部分。
經常和爬蟲打交道的可能已經看出了,這是啟用了webdriver協議之後會包含的字段,可是我們使用的chrome headless使用的是devtools protocol啊,怎麽也會有這個標誌呢?
答案在這裏:
沒錯,當你指定了“--headless”參數的時候,不管是什麽協議,都會帶有該字段,如果你不指定“--headless”參數使用devtools protocol控制chrome,那麽就和使用正常的瀏覽器沒有區別
仔細想一想,正常的人類訪問網頁怎麽可能用沒有界面的headless模式嘛,這樣如果你不當心的話一抓一個準。
解決方案
解決辦法其實也不麻煩,大致有如下幾點:
- 更換瀏覽器,如上圖所示,這一特性是chrome 63以後添加的,那麽只要用chrome 62即可,devtools protocol也支持chrome 62;
- 不使用headless模式,不使用headless模式也自然不會被檢測到,當然,啟動一個瀏覽器窗口來渲染頁面,性能肯定是不及headless的,這點需要權衡;
- 只對必要的頁面使用headless,其余數據仍用httpclient模擬請求的方式獲取,這也是最有效的方式,當然這樣會極大的增加開發成本。
總之繞過這一檢測機制的方法有很多,這篇文章僅僅是拋磚引玉而已,希望大家以後遇到類似的反爬措施時不要覺得束手無策。
最後希望大家在做爬蟲時請遵守網絡道德,不要給對方站點添麻煩。
如果有意見和建議,歡迎指出!
參考:https://www.chromestatus.com/feature/6216034532982784
反爬蟲——使用chrome headless時一些需要註意的細節