簡易構建適合風控系統的IP庫
ip作為識別和定位用戶的手段來說,對互聯網企業起著至關重要的作用,特別是在精準營銷、反欺詐等業務方面。本文描述如何簡單的去構建自己的ip地址庫。
拿來主義
實際上,對大部分用戶來說,如果要求不高,完全可以拿現成的資源來使用:
- 老外的數據有maxmind,不過對國內有些水土不服
- BAT級別的公司有開放api支持,但不提供離線庫
- 國內也有第三方的優秀提供商,比如ipip.net。他們提供免費的離線庫,以及收費的服務。是國內比較專業的ip信息服務商,也有一篇高質量的ip庫構建文章講述了來龍去脈。普通使用,推薦直接使用該庫
吃飽了撐著
但對我們這樣的風控公司來說,現成的資源有以下不足:
1.需要離線的數據庫。我們的產品是提供私有化的大數據風控平臺,由于涉及的信息比較敏感,需要隔絕外網來保證數據隱私性和安全性,api的方式不合適
2.需要定期更新的數據庫。ip地址經常變化,需要精準度高、更新頻繁的來源,評測下來,現存的第三方提供商還是存在數據覆蓋率和準確性方面的不足
3.需要規范化的數據。我們需要手機、身份證、ip等多個維度的歸屬地,但數據來源多樣,比如:在很多場合,這種數據不一致沒關系,但我們的風控引擎會拿來作比較計算,這種不一致會導致大量的計算偏差,引起誤報
- 有的顯示“南京”, 有的顯示“南京市”
- 有的顯示縣級市,有的顯示地級市
- 有些城市改過名稱,有的顯示老名稱,有的顯示新名稱
- 有的精確到市,有的精確到區
- ...
4.有一些優秀的數據源提供精確到區的數據,但我們不需要采用。ip分配多變,而且運營商分配頂多到市一級,所以區縣級的數據準確度會有很大挑戰,影響風控使用,建議是先棄掉
5.對于非主動獲取的第三方數據,習慣上不信任,需要去進行評估和重新驗證,貿然使用會有不良后果
所以,我們做了一些工作,來構建自己的ip庫,方便我們的風控系統使用。本文余下部分會描述我們的大概思路(具體實現會采用簡要方法來說明)。
ip庫原始數據獲取
作為一個非專業公司,不可能像 ipip.net 那樣花很大的力氣去撒點做網絡探測和分析,最省事的就是爬取網上的資源。這里舉一個簡單例子,拿局域網內最大的搜索引擎公司作為數據來源。
寫一個一行的爬蟲:
整條命令通過shell管道來實現,分別包括:
1.生成ip c段地址列表,由seq來生成相應的數字
2.將數字轉為ip的字符串形式,由awk來轉換
3.利用curl向度娘發起請求
- 請求地址可以直接在度娘頁面上請求后,看網絡后臺即可得到。這里不截圖展示了
- 該請求比較簡單,只用替換一個ip作為參數,直接xargs即可
- 度娘沒有下限,可以暴力一些,所以通過xargs的多進程特性,開啟多進程支持(這里設為100)
- 轉一下utf8
- 直接把原始ip和結果輸出,直接awk即可
4.等。這個簡易爬蟲效率上并不高,而且需要執行256*256*256=16777216次訪問,所以需要超過1天來完成。直接扔服務器上讓他慢慢跑吧
ip庫構建
去重處理
原始數據拿來后,需要進行整理,首先需要去掉重復信息,比如原始的數據是這樣的
這些c段緊靠在一起,完全沒有必要,再通過一行命令去做去重
說明:
1.首先按照ip進行排序,由于之前有多進程并發操作,結果數據會有亂序情況出現,不利于去重
2.利用awk,只輸出歸屬地相同的鄰近行的第一行
3.最終得到的結果中,任意相鄰的兩行地址都不一樣
地理位置規范化
這里涉及到我們去建地址庫的初衷,由于有的數據來源地理位置不統一,比如有的顯示市,有的顯示區,有的縣級市地級市傻傻分不清楚。所以需要對所有歸屬地進行規范化處理。
整個過程略復雜,我們通過算法去自動生成和校正如下的映射表,然后再利用規范化算法得到統一的地址。整個過程略復雜,而且映射表數據需要不停的自動化構建來校準,就不展示更多的細節。
山東:
名稱: 山東省
城市:
濟南:
名稱: 濟南市
章丘:
名稱: 濟南市
青島:
名稱: 青島市
即墨:
名稱: 青島市
平度:
名稱: 青島市
膠南:
名稱: 青島市
萊西:
名稱: 青島市
淄博:
名稱: 淄博市
棗莊:
名稱: 棗莊市
滕州:
名稱: 棗莊市
東營:
名稱: 東營市
煙臺:
名稱: 煙臺市
龍口:
名稱: 煙臺市
萊陽:
名稱: 煙臺市
萊州:
名稱: 煙臺市
蓬萊:
名稱: 煙臺市
ip庫生成
得到最終數據后,需要做最后打包。
一種最簡單的方式是直接將上述數據作為最終數據,然后使用的時候讀入,塞進一個 treemap 即可。但這種方式效率比較低,生成的包也比較大,從而影響到使用地理庫的應用。
我們采用了另一種方法,逆向了ipip.net的數據格式,用該格式打出自己的數據包,這里有幾個好處:
1.該數據格式比較精簡,能大大減少最終勝出的數據包大小
2.由于用戶比較多,網上有多語言的客戶端,方便借鑒(不過實際使用還需要自己重新優化,網上和官方的庫效率還是較低;要用的話也盡量用官方的庫,有些網友的庫不正確)
3.由于我們會共享數據給一些關系好的客戶,所以采用標準的格式,他們只要替換數據文件即可
生產級別的ip庫構建
上文描述了構建的大概過程,但核心的部分由于篇幅限制采用了簡易方法進行說明,如果要做生產級別的還需要注意一下方面:
1.更好的原始數據獲取
- 百度的數據來源并不是最好的
- 需要更健壯復雜的爬蟲系統,簡單的bash腳本還是有玩具性質,進拿來做展示用
- 大部分時間只關心國內數據,可以利用現有的asn數據來識別國家,減少數據爬取的規模。網上也有國內ip段的劃分
- c段地址有點粗,不太準確,而且爬取效率低,需要更聰明的爬取策略
2.持續的數據獲取,以及自動化的校準庫和ip庫構建。由于ip數據變化頻率高,只有不停更新才能保證更好的精度
3.統一ip、手機、身份證、wifi地址等數據做統一的地理信息庫。單個維度的信息往往只能用來做展示,如果有強計算需求的話需要做統一的數據庫
本文轉自豈安科技微信公眾號:bigsec,已取得授權