天天看點

以淘寶為例教你如何突破網站對selenium的屏蔽

背景介紹:

一般情況下,通路網站都會消耗伺服器的資源。而機器人可以做到比人更快的通路速度,更持續的通路時間,這對網站資源占用消耗是遠遠超過人的,而當伺服器資源被大量占用的時候, 就不能為人提供正常的網絡服務。而且機器人一般是直接擷取需要的資料,不加載不必要的的資訊,速度大大超過人的浏覽速度。例如很多網站都有圖檔,甚至廣告,加載都需要時間。一個視訊網站,好幾年了幾萬條的資料,半個小時采集完成。這種高頻率的通路,伺服器就得滿負荷工作,帶寬也會被占據,最後别人要通路就會受限制。基于這樣的一個背景下,很多網站會對一些自動化的工具去通路網頁作出一些檢測,并限制别人通過腳本的方式去進行通路。

比如,通過selenium去操作淘寶首頁,去登入。再不做任何處理的情況下,你會發現,每次輸入完賬号密碼之後,都會彈出一個要輸入驗證的框:

以淘寶為例教你如何突破網站對selenium的屏蔽

不同的網站,需要驗證的資訊可能不一樣,有的可能是需要輸入驗證碼,或者進行什麼人機驗證之類的,你可能會想,那就滑動一下進行驗證就好了,事實上,這種被識别為自動化的腳本進行通路的,驗證之後也出報錯或者出現其他未知的異常:

以淘寶為例教你如何突破網站對selenium的屏蔽

網站是如何檢測出來是機器人在操作的呢?

selenium在運作的時候會暴露出一些預定義的javascript變量(特征字元串),例如"window.navigator.webdriver",在非selenium環境下其值為undefined,而在selenium環境下,其值為true(如下圖所示為selenium驅動下chrome控制台列印出的值)。

以淘寶為例教你如何突破網站對selenium的屏蔽

除此之外,還有一些其它的标志性字元串(不同的浏覽器可能會有所不同),常見的特征串如下所示:

webdriver

__driver_evaluate

__webdriver_evaluate

__fxdriver_unwrapped

__fxdriver_evaluate

__selenium_evaluate

_selenium_ide_recorder

__selenium_unwrapped

__driver_unwrapped

calledselenium

_webdriver_elem_cache

__webdriver_unwrapped

_selenium

driver-evaluate

webdriver-evaluate

chromedriverw

selenium-evaluate

webdrivercommand

__webdriverfunc

__webdriver_script_fn

__$webdriverasyncexecutor 

__lastwatiralert

__lastwatirconfirm

__lastwatirprompt

$chrome_asyncscriptinfo

$cdc_asdjflasutopfhvczlmcfl_

了解了這個特點之後,就可以在浏覽器用戶端js中通過檢測這些特征串來判斷目前是否使用了selenium,并将檢測結果附加到後續請求之中,這樣服務端就能識别并攔截後續的請求。

如何繞過網站的這個驗證呢?

在微信群看到有人在問怎麼繞過這個驗證,然後往上查了一下資料,大部分給的方案是:

在啟動浏覽器的時候加上一些配置,比如:

試過了,發現不行,還有的說讓手動把webdriver的屬性設定為undefined:

發現這樣設定之後,也并不能解決登陸淘寶網站的問題(或許不同網站的校驗規則不一樣,有的隻是做了簡單校驗,淘寶的校驗複雜點吧)。

最終,在網上查到了另一種方式,使用python的mitmproxy庫進行操作。

顧名思義,mitmproxy 就是用于 mitm 的 proxy,mitm 即中間人攻擊(man-in-the-middle attack)。用于中間人攻擊的代理首先會向正常的代理一樣轉發請求,保障服務端與用戶端的通信,其次,會适時的查、記錄其截獲的資料,或篡改資料,引發服務端或用戶端特定的行為。

使用 pip install mitmproxy 

建立一個py檔案,命名随意,這裡命名為modify_response.py

然後運作腳本:

然後再執行selenium的腳本即可實作正常的通過selenium進行登入淘寶網站,之前設定的chromeoptions也要加上。具體代碼如下:

效果示範(會運作2次腳本,第一次運作腳本時沒有啟動mitmproxy代理,無法正常登入,啟動代理後,可以正常登入):

未啟動代理的效果:

以淘寶為例教你如何突破網站對selenium的屏蔽

啟動代理後的效果:

以淘寶為例教你如何突破網站對selenium的屏蔽

總結

1、百度到的方法解決不了我們遇到的問題的時候,如何去解決?百度到的結果有時候隻能為我們提供一個思路,盡量多看發帖時間在最近的,有的隻是拿着以前别人寫的東西copy一下,沒有自己去實戰過 ,并不一定能幫你解決問題,但是思路也許是對的

2、業務這邊文章中的操作可以解決登入淘寶的問題,但或許不能解決所有的場景,需要針對不同的網站做些适當的調整,至于mitmproxy到底是什麼,具體用法怎麼用,為什麼這麼用 ,這裡就不仔細介紹。

3、我覺得it行業是一個更新換代非常快的行業,不管從事哪個崗位,培養一定的自學能力和解決問題的能力很重要,前輩們雖為我們總結和積累了很多經驗,可以讓我們少走一些彎路,但能夠掌握解決問題的思路和方法更重要。

繼續閱讀