素材牛VIP会员
通过正则提取出来的ip,怎么命名
 坐***来  分类:Python  人气:676  回帖:4  发布于6年前 收藏
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

通过以上的代码把apache的日志ip提取出来,并且进行统计去重了,
提取的ip数据如下:

那么要怎么将这些ip地址进行命名分类,

202.108.11.103跟220.181.32.137为百度蜘蛛ip
想要实现的效果如下
这两个ip命名为百度蜘蛛,然后把他们的统计数据相加即4336+3411
百度蜘蛛 7747

这个要怎么操作

 标签:python

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv6 码匠
生***炸 UI设计师 6年前#1

这样多累啊!
为什么不给这个ip分组单独建立一张表, 名为IPGroup (id, ip, groupname)

id ip groupName
1 202.108.11.103 百度蜘蛛
2 220.181.32.137 百度蜘蛛

之后一个SQL就搞定了,多么轻松(设楼主用的表明为IPStastics)

SELECT b.groupName, SUM(a.count)
FROM IPStastics a 
  INNER JOIN IPGroup b
  ON a.ip = b.ip
GROUP BY b.groupName
Lv1 新人
Al***ay 职业无 6年前#2

可以尝试构建一个大型的以字典为键, 爬虫名字为值的字典;

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
Lv2 入门
熊***子 学生 6年前#3

使用pandas的数据透视表

Lv1 新人
海***人 Web前端工程师 6年前#4
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}
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取