淘寶IP地址庫採集

作者:阿寶 
更新:2016-08-31 
來源:彩色世界(https://blog.hz601.org/2016/08/31/taobao-ip-sniffer/index.html) 

簡述

當初選擇做這麼一個項目,不是爲了拷貝一份庫自己做服務,也不是爲了其他目的,只是單純的熟悉關於http和mysql方面的知識。
下面言歸正傳。

淘寶IP地址庫簡介

此地址庫可以根據用戶提供的IP地址,快速查詢出該IP地址所在的地理信息和地理相關的信息,包括國家、省、市和運營商。用戶也可以主動提交信息來糾錯。

主要優勢表現爲:
(1)地域
覆蓋度:94.54% 精確到市級
準確度:96.5% 精確到市級
(2)運營商
覆蓋度:93.8%
準確度:暫無統計數據
(3)查詢速度
10qps
注:阿里同機房內網,實測速度爲4qps左右。
(4)接口
符合REST規範,方便擴展;
使用JSON作爲數據格式,方便使用;

基礎數據結構

下面介紹一下,需要使用到的一些基礎數據項,以及來源。
首先,我們來分析一下淘寶IP地址庫的返回數據,

{
“code” : 0,                              // 請求成功/失敗
"data" : {
“country” : “\u4e2d\u56fd”,     // 國家
"country_id" : “CN”,                // 國家代碼
"area" : “\u534e\u5317”,         // 地區
"area_id" : “100000”,               // 地區代碼
"region" : “\u5317\u4eac\u5e02”,   // 省(自治區、直轄市、特別行政區)
“region_id” : “110000”,                  // 省代碼
"city" : “\u5317\u4eac\u5e02”,       // 市(地區、自治州、盟及國家直轄市所屬市轄區和縣)
“city_id” : “110000”,                      // 市代碼
"county" : “”,                               // 縣(市轄區、縣級市、旗)
“county_id” : “-1”,                        // 縣代碼
"isp" : “\u4e2d\u56fd\u79d1\u6280\u7f51”,   // 運營商
"isp_id" : “1000114”,                                    // 運營商代碼
"ip" : “210.75.225.254// ipv4/ipv6
}
}

其中:
國家與國家代碼,由聯合國統計局統一制定。詳見:http://zh.wikipedia.org/wiki/ISO_3166-1
地區、省、市、縣以及相應的代碼,由中華人民共和國國家統計局統一制定,詳見:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html

運營商與運營商代碼,由國際電聯電信標準化部門統一制定,不過已經很久沒有維護,不可用。到目前爲止,本人也沒有找到一份完整的編碼表,希望知曉者告知。暫且就以淘寶IP地址庫中編碼爲準。

國家IP地址段,由互聯網IP地址分配中心統一管理,在此附上中文版的地址段信息,詳見程默的博客,在此表示感謝:http://ipblock.chacuo.net/

數據庫設計

數據項及命名

國家 country
地區 region
省(自治區、直轄市、特別行政區) province
市(地區、自治州、盟及國家直轄市所屬市轄區和縣) city
縣(市轄區、縣級市、旗) county
鎮(鄉、城鎮) town
村(村莊) village
運營商 isp
IP ip

IP表

國家代碼 2個字節 CHAR(2)
縣代碼 6位整形 UINT(20)
村代碼 12位整形 UINT(40)
運營商代碼 7位整形 UINT(24)
IP地址 4個字節 UINT(32)

國家表

二位字母 2個字節 CHAR(2)
三位字母 3個字節 CHAR(3)
三位數字 3位整形 UINT(10)
ISO英文用名 48個字節 CHAR(48)
中文用名 48個字節 CHAR(48)

地區表

代碼 1位整形 UINT(4)
名稱 4個字節 CHAR(4)

縣(市轄區、縣級市、旗)表

代碼 6位整形 UINT(20)
名稱 48個字節 CHAR(48)

村(村莊)表

代碼 12位整形 UINT(40)
名稱 48個字節 CHAR(48)

運營商表

代碼 7位整形 UINT(24)
名稱 48個字節 CHAR(48)

數據採集

IP運營商信息來源於各個運營商,IP所屬地域信息來源於CNNIC,不過這些信息不太容易拿到完整的。
所以,此處就以淘寶IP地址庫爲來源。

實現方案

使用 nodejs + python 實現,nodejs主要實現網絡交互集中的部分,python主要實現網頁抓取。數據庫使用常見的 mysql。

國家代碼抓取

使用 python 實現從 http://zh.wikipedia.org/wiki/ISO_3166-1 地址抓取代碼信息,並保存文本country.txt。當然,也可以直接手動拷貝粘貼到文本中。
使用 nodejs 按行讀取上一步抓取到的文本,做處理,使用 node-mysql 寫入數據庫。

縣代碼抓取

使用 python 實現從 http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html 地址抓取代碼信息,並保存文本cncounty.txt。當然,也可以直接手動拷貝粘貼到文本中。
使用 nodejs 按行讀取上一步抓取到的文本,做處理,使用 node-mysql 寫入數據庫。

國內IP段抓取

使用 python 實現從 http://ipblock.chacuo.net/ 地址抓取IP段信息,並保存文本cnip.txt。當然,也可以直接手動拷貝粘貼到文本中。

IP地址信息查詢

使用 nodejs 讀取 cnip.txt 文本,每次解析10000個IP,使用 http 模塊從淘寶IP地址庫查詢結果,並使用 node-mysql 寫入數據庫。
由於在 nodejs 中 http 處理和 mysql 處理都是異步操作,所以,增加一個緩衝區,保存http請求結果。筆者使用了經典的生產者消費者模型來處理這個問題。

結果

爲了保證請求的穩定,使用阿里雲服務器運行此係統。
實際運行時,每秒可以穩定的請求到5個IP信息,中國目前(截止2014年1月)擁有3.3億IP,完成全部請求大約需要2.98天。
完成全部存儲,數據庫大小爲22.3GB。

工具推薦
1.軟件開發必備翻牆代理,低延遲(50ms),月費10元,詳詢(寶哥兒QQ1066690060)請自覺遵守國家法律法規

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章