206 views

形象工程之IP数据可视化

By | 2019年2月22日

前提

了解python及框架flask
了解JavaScript
读取数据

IP数据

数据获得方法

日志文件
elk三件套
其他
说到底数据最后来源于日记文件, 这里主要指web日志。

这里应用自己网站的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”)

# 创建ip集合,由于这里只需要IP地址,所以用集合的特性去重
ip_set = set()

# 根据循环系统每一次读取日志每行,假如日志量大提议下列方式,日志文档不大,可以直接readlines,一次全部读取出来,
while True:
line = fp.readline()
if len(line.strip()) < 1:
break
ip = line.split()[0]
ip_set.add(ip)

# 访问用户IP的个数
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’]

不过为了使用广泛这里使用表达式.
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)

下面是全部步骤都在这里
# 创建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:
# 通过循环每次读取日志一行,如果日志量大建议用以下方式,日志文档不大,可以直接用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之类的日志群集,那么读取数据会更简单变快,仅仅方式不同罢了.这儿就不赘述了.
ip地址的地理信息

这儿不确保ip地址对应的位置信息绝对正确。为了确保ip地址的精确性,可以搜索在线的Geo服务。
为了使用上面下载的数据库,首先得下载相应的模块.

pip install geoip2
根据下边源代码获得指定iP的地理信息

# 导入相应模块
import geoip2.database

# 记载下载的数据库文件路径,这里是在代码执行的工作目录
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]: ‘深圳市’

# 查看经纬度
response.location.latitude
Out[118]: 22.5333

response.location.longitude
Out[119]: 114.1333
上边仅仅用geoip2这一库查询城市,国家, 经纬度,其他信息可自己探索.

解决数据

在解决数据之前,我们要知道,我们要解决成什么数据格式,由于画图是一件很费时费力的工作,这里借助的是这个echarts的demo,地址下表:
http://echarts.baidu.com/examples/editor.html?c=lines3d-flights&gl=1

该demo的字段下表:
http://echarts.baidu.com/examples/data-gl/asset/data/flights.json

数据结构大概下表。

形象工程之IP数据可视化

但是这个文件格式实在是有点令人误导
根据阅读文章demos的js代码,你会发觉,绘制飞线的数据格式为:
[[[源纬度数据点, 源经度数据点], [目标层面数据点, 目标经度数据点]]..]

而threejs需要的数据格式号下表

var data = [
[
‘seriesA’, [ latitude, longitude, magnitude, latitude, longitude, magnitude, … ]
],
[
‘seriesB’, [ latitude, longitude, magnitude, latitude, longitude, magnitude, … ]
]
];

源代码插入太多太占篇幅。
数据处理如下

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]
数据可视化

在解决完数据之后就可以根据一个插口暴露数据,这儿使用json数据格式.
然后通过ajax读取数据.

数据即时更新

这儿只说构思

日记文档
主要是通过python的文档对象的文档位置做为数据是否有新內容载入,如果有就读入,载入数据到暴露的数据接口
elk stack
这个就非常简单了,定时查寻数据
demos使用教程

#安裝依赖
pip install flask, geoip2

本文转载于:http://win-man.com/faq
本文关键词:服务器租用 高防CDN 免备案CDN 加速CDN
作者:服务器安全技术员

发表评论

电子邮件地址不会被公开。 必填项已用*标注