「知物由學」是網易易盾打造的一個品牌欄目,詞語出自漢·王充《論衡·實知》。人,能力有高下之分,學習才知道事物的道理,然後纔有智慧,不去求問就不會知道。「知物由學」但願經過一篇篇技術乾貨、趨勢解讀、人物思考和沉澱給你帶來收穫的同時,也但願打開你的眼界,成就不同的你。固然,若是你有不錯的認知或分享,也歡迎在「網易易盾」公衆號後臺投稿。正則表達式
隨着互聯網開放式、爆發式地增加,數據的價值變得愈來愈重要,尤爲是電商、傳媒、社交等等業務,將數據比做黃金也不爲過。於是隨之誕生了網絡爬蟲技術,黑客經過調用網站開放的免費接口來批量獲取有價值的數據,用以數據挖掘和分析行業情況等。然而大量的非法爬蟲會形成網站服務器壓力巨大,甚至影響正經常使用戶的訪問;並且有價值的數據被竊取,也會對網站的商業利益形成負面影響。算法
所以反爬蟲技術應運而生。反爬蟲技術大致包含「爬蟲識別」和「爬蟲反制」兩個步驟,後者主要是用於對前者識別出的爬蟲出的爬蟲進行懲罰和反制,主要包括限制訪問、驗證碼校驗、數據投毒等等,本文不作深究。而前者目前經常使用的方式是基於規則判斷。好比以某個用戶或者IP爲單位,統計其在必定時間內的訪問記錄,而後用人爲設定的一些閾值,這種能夠稱爲專家規則方法。其優勢是規則明確、可靠,能夠實時針對發現的爬蟲特徵來設定規則,從而實現與爬蟲對抗。數據庫
可是它也有明顯的缺點:segmentfault
因爲上述緣由,咱們結合了兩項熱門的技術:大數據和機器學習,來探究其在爬蟲識別中的應用。api
1、基於Flink的大數據統計安全
首先咱們須要經過一些大數據技術來獲取統計數據。Flink是一個新興的分佈式大數據流處理引擎,本文不作詳細介紹,只是利用了其基於事件時間窗口統計數據的功能。
流處理過程主要包含如下步驟: 服務器
Flink流處理過程網絡
Flink輸出數據架構
字段含義:機器學習
a)counts: 是一個map,key是所訪問的URI,value是訪問計數
b)count: counts中不一樣key的數量
c)sum: counts中全部value的和
d)min: counts中全部value的最小值
e)max: counts中全部value的最大值
2、數據的特徵提取
要利用機器學習的算法來實現爬蟲的判斷,首先要將原始數據轉化爲向量,向量中的維度數據要儘可能包含數據的特徵,這樣才能儘量地區分爬蟲和正常記錄的差別。
經過觀察發現,爬蟲記錄與正常記錄相比,主要有如下特徵:
針對以上特徵,咱們用如下維度來組成數據的特徵向量:
3、線下分析
咱們採用神經網絡算法,該算法的優勢是: 技術成熟、適應性強、工程化容易、可移植性強等等。可是它是一種有監督學習,須要有一批訓練數據才能工做。
3.1 訓練數據獲取階段:
獲取訓練數據的思路有兩種:
咱們採用的方法是基於PCA+Kmeans的無監督學習算法,大概步驟以下:
3.2 模型構建和訓練階段
使用Pytorch搭建神經網絡模型。能夠分批、多組地用同一批數據反覆訓練模型。 當達到必定的迭代次數,或者損失函數小於必定閾值,則表示模型訓練完畢。能夠將模型參數文件導出,供線上部署。
一個簡單的單層神經網絡例子
訓練過程
在測試集上的測試結果
4、線上部署
模型引擎的線上部署以下圖所示。Training模塊負責數據的線下處理和訓練,訓練完的模型文件上傳至Nos,而後將模型的配置信息以及模型文件的地址寫入Etcd。Model Engine模塊是線上的模型引擎,實時監聽Etcd中額配置,當配置更新時,會當即拉取模型文件,並加載。
Model Engine會消費Flink統計完寫入Kafka的數據,並用模型作爬蟲判別,並將判別的結果寫入數據庫,供其餘系統查詢使用。
線上部署架構
5、模型進化
到此咱們已經搭建了包含數據採集、線下訓練、線上部署的模型引擎架構,可是正如前面所說,目前的模型只能達到與規則引擎相近的效果,要想讓模型進化得更爲智能,必須加入反饋機制,使得模型可以進化。
反饋的思路是從模型引擎的輸出數據入手。神經網絡分類算法的輸出數據,除了包含記錄是否屬於爬蟲的判斷,還包含是否屬於爬蟲的機率。能夠根據機率分爲三段:非爬蟲:0~33%、疑似爬蟲:33%~66%,爬蟲:66%~100%。
對三段抽樣進行人工分析:
將分析完的數據做爲新的訓練集,對原來訓練好的模型進行增量訓練,使模型在保留部分歷史經驗的狀況下獲取新的特性。這一步固然也能夠結合一些別的增量學習、遷移學習以及強化學習的算法來實現。
相關閱讀: