1. 程式人生 > >反爬蟲——使用chrome headless時一些需要註意的細節

反爬蟲——使用chrome headless時一些需要註意的細節

mem -- protoc 啟用 pre 使用 web 內容 bom

以前我們介紹過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時一些需要註意的細節