我很在意的一件事情是好看,嗯,好看.以及是否有趣.雖然不一定有用.
創(chuàng)新互聯(lián)公司長期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為雙峰企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè),雙峰網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。下面是效果圖,由于數(shù)據(jù)量有限,所以還不夠眼花繚亂.
本文的主要內(nèi)容是通過echarts,threejs將web日志或者任何含有IP數(shù)據(jù)的文本文件可視化.簡單的來說,裝逼,可以將這個動態(tài)圖放在大屏幕上.
所有源碼及相關(guān)數(shù)據(jù)文件請訪問下面github倉庫
https://github.com/youerning/blog/tree/master/ip-visualize
數(shù)據(jù)獲取方式
歸根結(jié)底數(shù)據(jù)最終來自日志文件, 這里主要指web日志。
這里使用我自己網(wǎng)站的web日志,格式如下.
'116.24.64.239 - - [12/Mar/2018:18:58:40 +0800] "GET /example HTTP/2.0" 502 365\n'
...
'116.24.64.239 - - [12/Mar/2018:18:54:55 +0800] "GET / HTTP/2.0" 200 1603\n'
通過下面代碼將IP地址拿出來.
# 打開日志文件
fp = open("website.log")
# 創(chuàng)建ip集合,由于這里只需要IP地址,所以用集合的特性去重
ip_set = set()
# 通過循環(huán)每次讀取日志一行,如果日志量大建議以下方式,日志文件不大,可以直接readlines,一次性全部讀取出來,
while True:
line = fp.readline()
if len(line.strip()) < 1:
break
ip = line.split()[0]
ip_set.add(ip)
# 訪問用戶IP的個數(shù)
len(ip_set)
# 查看前20個IP
list(ip_set)[:20]
['111.206.36.133',
'220.181.108.183',
'40.77.178.63',
'220.181.108.146',
'119.147.207.152',
'112.97.63.49',
'66.249.64.16',
'138.246.253.19',
'123.125.67.164',
'40.77.179.59',
'66.249.69.170',
'119.147.207.144',
'66.249.79.108',
'157.55.39.23',
'123.125.71.80',
'42.236.10.84',
'123.125.71.79',
'111.206.36.10',
'106.11.152.155',
'66.249.66.148']
不過為了使用廣泛這里使用正則表達(dá)式.
import re
pat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
ipfind = re.compile(pat)
line = '116.24.64.239 - - [12/Mar/2018:18:54:55 +0800] "GET / HTTP/2.0" 200 1603\n'
ip = ipfind.findall(line)
if ip:
ip = ip[0]
print(ip)
下面是完整步驟
# 創(chuàng)建ip列表
ip_lis = list()
# files of logs
files = glob("logs/*")
# complie regex
pat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
ipfind = re.compile(pat)
# extract ip from every file
for logfile in files:
with open(logfile) as fp:
# 通過循環(huán)每次讀取日志一行,如果日志量大建議以下方式,日志文件不大,可以直接readlines,一次性全部讀取出來
# 如果太大則用readline一行一行的讀
lines = fp.readlines()
for line in lines:
if len(line.strip()) < 1:
continue
ip = ipfind.findall(line)
if ip:
ip = ip[0]
ip_lis.append(ip)
至此,我們將訪問文件里面的的IP拿出來了。
值得注意的是: 如果你有搭建elk之類的日志集群,那么獲取數(shù)據(jù)會更簡單更快,只是方式不同而已.這里就不贅述了.
如果只是拿到IP數(shù)據(jù),在本文并沒有用,因為為了在地圖上可視化每一個IP的位置,我們需要知道每個IP地址的地理信息,即,經(jīng)緯度,所在城市等。
這里使用dev.maxmind.com提供的開源免費的geoip數(shù)據(jù)庫.
下載地址: https://dev.maxmind.com/geoip/geoip2/geolite2/
這里不保證IP地址對應(yīng)的位置信息絕對正確。為了保證IP地址的準(zhǔn)確性,可以搜索在線的Geo服務(wù)。
為了使用上面下載的數(shù)據(jù)庫,首先得下載相應(yīng)的模塊.
pip install geoip2
通過下面代碼獲取指定IP的地理信息
# 導(dǎo)入相應(yīng)模塊
import geoip2.database
# 記載下載的數(shù)據(jù)庫文件路徑,這里是在代碼執(zhí)行的工作目錄
reader = geoip2.database.Reader("GeoLite2-City.mmdb")
response = reader.city("61.141.65.76")
# 查看國家名
response.country.name
Out[115]: 'China'
# 查看城市名
response.city.name
Out[116]: 'Shenzhen'
response.city.names["zh-CN"]
Out[117]: '深圳市'
# 查看經(jīng)緯度
response.location.latitude
Out[118]: 22.5333
response.location.longitude
Out[119]: 114.1333
上面只是用geoip2這個庫查看城市,國家, 經(jīng)緯度,更多信息可自己探索.
在處理數(shù)據(jù)之前,我們要知道,我們要處理成什么數(shù)據(jù)格式,由于畫圖是一件很費時費力的工作,這里借助的是這個echarts的demo,地址如下:
http://echarts.baidu.com/examples/editor.html?c=lines3d-flights&gl=1
該demo的數(shù)據(jù)源如下:
http://echarts.baidu.com/examples/data-gl/asset/data/flights.json
數(shù)據(jù)結(jié)構(gòu)大致如下。
但是這個格式實在是有點讓人誤導(dǎo)
通過閱讀demo的js代碼,你會發(fā)現(xiàn),繪制飛線的數(shù)據(jù)格式為:
[[[源緯度數(shù)據(jù)點, 源經(jīng)度數(shù)據(jù)點], [目標(biāo)維度數(shù)據(jù)點, 目標(biāo)經(jīng)度數(shù)據(jù)點]]..]
而threejs所需的數(shù)據(jù)格式號如下
var data = [
[
'seriesA', [ latitude, longitude, magnitude, latitude, longitude, magnitude, ... ]
],
[
'seriesB', [ latitude, longitude, magnitude, latitude, longitude, magnitude, ... ]
]
];
關(guān)于echarts官網(wǎng)demo的解讀可以在下面地址查看.
https://github.com/youerning/blog/blob/master/ip-visualize/ipvis/prototype/lines3d-flights.html
代碼插入太多太占篇幅。
數(shù)據(jù)處理如下
from functools import lru_cache
@lru_cache(maxsize=512)
def get_info(ip):
"""
return info of ip
Returns:
city, country, sourceCoord, destCoord
"""
try:
resp = reader.city(ip)
city = resp.city.name
if not city:
city = "unknow"
country = resp.country.names["zh-CN"]
if not country:
country = "unknow"
except Exception as e:
print("the ip is bad: {}".format(ip))
print("=" * 30)
print(e)
return False
sourceCoord = [resp.location.longitude, resp.location.latitude]
return city, country, sourceCoord, destCoord
# ip_Lis為上面獲取的IP地址列表
ipinfo_lis = [get_info(ip) for ip in ip_lis]
在處理完數(shù)據(jù)之后就可以通過一個接口暴露數(shù)據(jù),這里使用json數(shù)據(jù)格式.
然后通過ajax獲取數(shù)據(jù).
這里只說思路
日志文件
主要是通過python的文件對象的文件位置作為數(shù)據(jù)是否有新內(nèi)容寫入,如果有就讀入,加載數(shù)據(jù)到暴露的數(shù)據(jù)接口
#安裝依賴
pip install flask, geoip2
# 下載源代碼
# 進(jìn)入到ipvis目錄
# 將含有日志文件放到logs目錄下
# 啟動
python app.py
# 訪問web
http://127.0.0.1/p1
http://127.0.0.1/p2
值得注意的是geoip自定義的數(shù)據(jù)庫查詢并不是非常的快,所以當(dāng)你訪問頁面的時候會感覺比較慢,主要是ip數(shù)據(jù)的查詢耗時太久, 1.8w條數(shù)據(jù)大概查詢14秒左右
還有就是echarts這個庫可能有性能問題(至少是這個球形圖的時候,即時是官方網(wǎng)站的官方demo),因為當(dāng)你打開http://127.0.0.1/p1的時候,可能cpu飆升到100%
一個僅僅于我而言有意思的小項目。不確定你們有沒有更多的有意思的想法.
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章題目:面子工程之IP數(shù)據(jù)可視化-創(chuàng)新互聯(lián)
文章起源:http://www.rwnh.cn/article46/dcoheg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、手機網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、微信公眾號、網(wǎng)站建設(shè)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容