背景介紹:
一般情況下,通路網站都會消耗伺服器的資源。而機器人可以做到比人更快的通路速度,更持續的通路時間,這對網站資源占用消耗是遠遠超過人的,而當伺服器資源被大量占用的時候, 就不能為人提供正常的網絡服務。而且機器人一般是直接擷取需要的資料,不加載不必要的的資訊,速度大大超過人的浏覽速度。例如很多網站都有圖檔,甚至廣告,加載都需要時間。一個視訊網站,好幾年了幾萬條的資料,半個小時采集完成。這種高頻率的通路,伺服器就得滿負荷工作,帶寬也會被占據,最後别人要通路就會受限制。基于這樣的一個背景下,很多網站會對一些自動化的工具去通路網頁作出一些檢測,并限制别人通過腳本的方式去進行通路。
比如,通過selenium去操作淘寶首頁,去登入。再不做任何處理的情況下,你會發現,每次輸入完賬号密碼之後,都會彈出一個要輸入驗證的框:
不同的網站,需要驗證的資訊可能不一樣,有的可能是需要輸入驗證碼,或者進行什麼人機驗證之類的,你可能會想,那就滑動一下進行驗證就好了,事實上,這種被識别為自動化的腳本進行通路的,驗證之後也出報錯或者出現其他未知的異常:
網站是如何檢測出來是機器人在操作的呢?
selenium在運作的時候會暴露出一些預定義的javascript變量(特征字元串),例如"window.navigator.webdriver",在非selenium環境下其值為undefined,而在selenium環境下,其值為true(如下圖所示為selenium驅動下chrome控制台列印出的值)。
除此之外,還有一些其它的标志性字元串(不同的浏覽器可能會有所不同),常見的特征串如下所示:
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代理,無法正常登入,啟動代理後,可以正常登入):
未啟動代理的效果:
啟動代理後的效果:
總結
1、百度到的方法解決不了我們遇到的問題的時候,如何去解決?百度到的結果有時候隻能為我們提供一個思路,盡量多看發帖時間在最近的,有的隻是拿着以前别人寫的東西copy一下,沒有自己去實戰過 ,并不一定能幫你解決問題,但是思路也許是對的
2、業務這邊文章中的操作可以解決登入淘寶的問題,但或許不能解決所有的場景,需要針對不同的網站做些适當的調整,至于mitmproxy到底是什麼,具體用法怎麼用,為什麼這麼用 ,這裡就不仔細介紹。
3、我覺得it行業是一個更新換代非常快的行業,不管從事哪個崗位,培養一定的自學能力和解決問題的能力很重要,前輩們雖為我們總結和積累了很多經驗,可以讓我們少走一些彎路,但能夠掌握解決問題的思路和方法更重要。