Rumah  >  Soal Jawab  >  teks badan

python - Bagaimana untuk menamakan IP yang diekstrak melalui ungkapan biasa

source_ip = line.split('- -')[0].strip()
            if re.match('[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}',source_ip):
                if source_ip_dict.get(source_ip,'-')=='-':
                    source_ip_dict[source_ip]=1
                else:
                    source_ip_dict[source_ip]=source_ip_dict[source_ip]+1

Ekstrak IP log apache melalui kod di atas, dan lakukan deduplikasi statistik
Data IP yang diekstrak adalah seperti berikut:

.

Jadi bagaimana untuk menamakan dan mengklasifikasikan alamat IP ini,
Sebagai contoh,
202.108.11.103 dan 220.181.32.137 ialah IP Baidu Spider
Kesan yang diingini adalah seperti berikut
Namakan kedua-dua IP ini sebagai data statistik Baidu, kemudian bandingkan data statistik mereka. Tambah 4336+3411
Baidu Spider 7747

Cara mengendalikan ini

仅有的幸福仅有的幸福2711 hari yang lalu699

membalas semua(4)saya akan balas

  • 仅有的幸福

    仅有的幸福2017-05-18 11:02:19

    from itertools import groupby
    NAME_IP_MAPPING = {
        '202.108.11.103':'百度蜘蛛',
        '220.181.32.137': '百度蜘蛛',
    }
    spiders = [
        {'ip':'202.108.11.103','count':123}, 
        {'ip':'220.181.32.137','count':345}
    ]
    # 先用ip通过映射得到名字,再根据名字将spiders里的item分组,之后各自求和存入新的dict中。
    {k: sum(s['count'] for s in g)
        for k, g in groupby(spiders, lambda s:NAME_IP_MAPPING.get(s['ip']))}
    # output: {'百度蜘蛛': 468}

    balas
    0
  • 黄舟

    黄舟2017-05-18 11:02:19

    Anda boleh cuba membina kamus besar dengan kamus sebagai kunci dan nama perangkak sebagai nilai;

    ip_map = {
        '202.108.11.103': 'baidu-spider',
        '220'.181.32.137: 'baidu-spider',
        '192.168.1.1': 'other'
        ....
    }
    sum = {}
    for ip in source_ip:
        print ip
        sum[ip_mapping.get(ip, 'other')] = sum.get(ip, 0) + source_ip[ip]
    print sum
    

    balas
    0
  • 滿天的星座

    滿天的星座2017-05-18 11:02:19

    Pivot table menggunakan panda

    balas
    0
  • 阿神

    阿神2017-05-18 11:02:19

    Memang penat!
    Mengapa tidak membuat jadual berasingan untuk kumpulan IP ini, bernama IPGroup (id, ip, nama kumpulan)

    id ip Nama kumpulan
    1 202.108.11.103 Baidu Spider
    2 220.181.32.137 Baidu Spider

    Lepas tu boleh buat dengan satu SQL sahaja, betapa mudahnya (biar poster guna IPStastics)

    SELECT b.groupName, SUM(a.count)
    FROM IPStastics a 
      INNER JOIN IPGroup b
      ON a.ip = b.ip
    GROUP BY b.groupName

    balas
    0
  • Batalbalas