現行的網絡爬蟲檢測技術中,主要有以下兩大類:
- 行為檢測
- 指紋識別
(1)行為檢測:通過分析網頁上用戶的操作(鼠標的移動、點擊、滾動行為和瀏覽行為)來判斷操作者是否是機器控制的網絡爬蟲。
(2)指紋識別:通過分析設備和瀏覽器的信息來判斷訪問者是否為網絡爬蟲。
每一台電腦、每一個操作系統、每一個瀏覽器,都有屬於它自己的設備信息。比如電腦的CPU數量、顯卡型號、操作系統的位數、瀏覽器的版本等。
將這些設備信息加以組合,就可以作為請求者的指紋來進行識別。
fpscanner
會對傳入的瀏覽器指紋項進行識別和判斷,最終給出三個結果:
- 一致:表示為檢測到任何可疑;
- 不確定:表示檢測的指紋可以是爬蟲,也有可能不是爬蟲;
- 不一致:表示檢測的指紋是爬蟲
Selenium 中 通過execute_cdp_cmd()
方法,也能夠將webdriver
標記給去除掉。
canvas指紋
每一種瀏覽器都會使用不同的圖像處理引擎,不同的導出選項,不同的壓縮等級,所以每一台電腦繪制出的圖形都會有些許不同,這些圖案可以被用來給用戶設備分配特定編號(指紋),也就是說可以用來識別不同用戶,一般情況下用戶不會去更換硬件設備,所以canvas可以很好的指定當前用戶的瀏覽器,但是當多個用戶的硬件設備,瀏覽器一致時就特別容易產生相同的指紋,所以canvas指紋並不能完全的替代cookie作為用戶的身份驗證,但是可以作為輔助的驗證信息。
識別范圍:瀏覽器
用途:輔助用戶驗證消息
缺點:原始的實現的方法在同一硬件設備同一瀏覽器容易重復
原始實現方法:
var canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
ctx.font = "24px Arial";
ctx.fillText("carnoc",22,33);
ctx.moveTo(0,0);
ctx.lineTo(100,100);
ctx.stroke();
var b64 = canvas.toDataURL().replace("data:image/png;base64,","");
return hex_md5(b64)//這里又md5啦,md5后的識別碼就是我們需要的唯一設備號
通過定義相同的canvas行為產生一個base64的數據,但是由於base64的數據不好存儲這里使用js-md5進行編碼
問題:這樣簡易的canvas指紋在相同設備相同瀏覽器中重復率極高,所以要綜合其他因素進行判斷這里有一個改進版的庫,里面的判斷因素包括:
- 瀏覽器http請求中的用戶代理-navigator.userAgent
- 瀏覽器的語言(中文、英文……)-navigator.language
- 設備屏幕的色彩信息-screen.colorDepth
- 設備屏幕的寬高-screen.height screen.width
- 格林威治時間和本地時間之間的時差-Date().getTimezoneOffset()
- 是否支持sessionStorage-window.sessionStorage
- 是否支持localStorage-window.localStorage
- 是否支持indexdDB-window.indexedDB
- 是否支持-docment.body.addBehavior(IE5的一個屬性)
- 是否支持調用本地數據庫-window.openDatabase
- 瀏覽器所在系統的CPU等級-navigator.cupClass
- 客戶端的操作系統-navigator.platform
- 是否支持Do not track功能-navigator.doNotTrack
- 獲取瀏覽器部分插件信息-flash plugin、Adobe PDF reader、QuickTime、real players、ShockWave player、Windows media player、Silverlight、Skype
- canvas指紋
網傳的測試結果:
1.由於涉及設備以及瀏覽器的判定因素非常多,重復性很低,31台設備皆無重復
但是可以設想,畢竟是通過各種屬性值去判斷唯一性,理想情況下如果兩台設備相同瀏覽器各種設置也相同,還是會出現重復
2.也正因為涉及的因素多,一旦設備系統更新 or 瀏覽器版本更新 or 瀏覽器關鍵插件有變化(版本更新 or 新增卸載關鍵插件) ,生成的ID都會改變,由於瀏覽器版本更新還是比較頻繁的,很容易失去之前跟蹤的用戶
存儲設備碼
第一步的用戶的唯一設備號已經有了那么我們如何進行安全永久(脆弱)的保存呢?
我使用的是cookie+localStorage進行保存的
cookie有一個好處,是可以在二級域名下共享cookie的如m.baidu.com和news.baidu.com,而本地緩存則做不到這樣就順便解決了同二級域名共享一個設備號的需求。
主要思路:
獲取的設備號存cookie,同時存本地緩存localStorage
若檢查到本地緩存的設備號與cookie不一致,以cookie為准,同時更新本地緩存並把更改信息提交至后台
每次進行訪問時檢查cookie和本地緩存有一個被清除了就使用另一個的設備號進行恢復
本地和cookie都沒有的話只能重新生成一個設備號進行存儲了(我也很絕望啊)
收集信息且提交
經過第二步我們知道了如何生成設備號和存儲設備號了那么就應該進入第三步收集信息的環節了
具體要收集哪些信息看你的需求了(反正能得到的信息本來也不多)r如:設備分辨率,地理信息(移動端且開了GPS),瀏覽的網頁url,瀏覽時間等等,最后將你得到和信息和設備號hashid傳到后台吧
要進行一次匿名用戶信息一般需要三部
1:生成唯一設備碼
2:收集信息
3:存儲提交
原文鏈接:https://blog.csdn.net/qq_38363903/article/details/96742297