スクリプト統計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()