スクリプト統計ipの海外ユーザー分布状況または国内省の分布状況
2714 ワード
: ip , ip
前提:指定したipが対応する地理的位置を返す情報を入力するサービスが必要です.直接呼び出すことができます.
思想:まずipフィールドを抽出し、一般的にsedコマンドまたはcutと結合する.
たとえば、ログのフォーマットは次のとおりです.
[INFO][2017-11-18 00:00:00] reqhandler.py 134, allocate, hid:XXXX msg:{'province': 'sn', 'ccid': -1, 'ip': 'xxx.xxx.xxx.xxx', 'isp': 'unicom', 'mid': 0, 'spaceid': '5A10BA4FCBB011E7A162000E1EFF0BA0', 'locator': 8, 'game': 10038, 'eid': 148079890, '_cmd_': 327681}
は、ipフィールドを抽出するために以下のコマンドを使用することができる.grep "allocate," /home/XX/logs/*/XX.2017-11-17 | sed "s/^.* 'ip': '//g" | sed "s/', 'isp'.*//g" >> /home/XX/ip_1117.log
次に、スクリプトを使用して分布状況を統計します.(ip.mmdbはipマッピングのファイルで、このスクリプトは国内の省の分布状況を統計するために使用されます)
# coding: utf8
import maxminddb
import csv
def get_country():
reader = maxminddb.Reader('/home/XX/ip_log/ip.mmdb')
en2zw = {}
en2count = {}
ips = get_record_from_file('/home/XX/ip_log/test.log')
total_len = len(ips) / 1000
count = 0
for ip in ips:
count += 1
try:
result = reader.get(ip)
print result
except Exception as ex:
print ip, ex
continue
if not result:
print ip, result
continue
zw = result['subdivisions']['names'].get('zh_CN', '')
en = result['subdivisions']['names'].get('en', '')
ct = result['country']['names'].get('en', '')
print zw, en, ct
if ct != 'China':
continue
if en not in en2zw:
en2zw[en] = zw
if en not in en2count:
en2count[en] = 1
else:
en2count[en] += 1
print ' '
print en2count
en2count.pop('China', None)
total = sum(en2count.values()) * 1.0
print 'total:', total
for en, count in en2count.iteritems():
print 'en:%s, zh_CN: %s, count:%s percent:%s' % (en, en2zw.get(en), count, count / total)
def get_record_from_file(filename):
u"""
,
Args:
filename {str}
"""
ret = []
with open(filename) as f:
for record in f:
record = record.strip()
if not record:
continue
ret.append(record)
return ret
if __name__ == '__main__':
get_country()