Maison  >  Questions et réponses  >  le corps du texte

python - Comment nommer une adresse IP extraite via une expression régulière

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

Extrayez l'adresse IP du journal Apache via le code ci-dessus et effectuez une déduplication statistique
Les données IP extraites sont les suivantes :

.

Alors, comment nommer et classer ces adresses IP,
Par exemple,
202.108.11.103 et 220.181.32.137 sont des IP Baidu Spider
L'effet souhaité est le suivant
Nommez ces deux IP comme Baidu Spider, puis comparez leurs données statistiques. Ajouter 4336+3411
Baidu Spider 7747

Comment faire fonctionner ceci

仅有的幸福仅有的幸福2711 Il y a quelques jours702

répondre à tous(4)je répondrai

  • 仅有的幸福

    仅有的幸福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}

    répondre
    0
  • 黄舟

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

    Vous pouvez essayer de créer un grand dictionnaire avec le dictionnaire comme clé et le nom du robot comme valeur ;

    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
    

    répondre
    0
  • 滿天的星座

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

    Tableau croisé dynamique utilisant des pandas

    répondre
    0
  • 阿神

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

    Comme c'est fatiguant !
    Pourquoi ne pas créer une table distincte pour ce groupe IP, nommée IPGroup (id, ip, groupname)

    id ip Nomdugroupe
    1 202.108.11.103 Baidu Araignée
    2 220.181.32.137 Araignée Baidu

    Après cela, cela peut être fait avec un seul SQL, comme c'est simple (laissez l'affiche utiliser IPStastics)

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

    répondre
    0
  • Annulerrépondre