0

我正在尝试分析 Web 服务器日志以获取 IP 地址、用户代理、请求路径数据。我想存储特定 IP 访问的不同路径。此外,一些客户端欺骗用户代理,因此一个 IP 可以呈现许多用户代理字符串。我想为每个 IP 存储这个用户代理和路径数据。

现在我已经创建了一个数据结构如下:

ip_dict[ip_address] = [ total_count_int, [{'path_name_1': path_name_1-count_int }, {'path_name_2': path_name_2_count} ], [ {'crawler': crawler_count_int} ]  ]

列表中的第一项 - 请求总数 列表中的
第二项 - 列表中的{'visited site path' : count }
第三项 - 列表{'visited user agent' : count }

但是,实现它来修改现有项目变得越来越复杂。如果相应的关键元素匹配,我想增加计数。

任何有关创建更好的数据结构或修改上述数据结构中的元素的帮助将不胜感激。

4

1 回答 1

0

似乎你想要的是一个 dicts 的 dict:

def update(ip_dict, ip_address, site_path, user_agent):
    if ip_address in ip_dict:
        ip_entry = ip_dict[ip_address]

        ip_entry['total_count'] += 1

        if site_path in ip_entry['site_paths']:
            ip_entry['site_paths'][site_path] += 1
        else:
            ip_entry['site_paths'][site_path] = 0

        if user_agent in ip_entry['user_agents']:
            ip_entry['user_agents'][user_agent] += 1
        else:
            ip_entry['user_agents'][user_agent] = 0
    else:
        ip_dict[ip_address] = {
            'total_count': 1,
            'site_paths': {site_path: 1},
            'user_agent': {user_agent: 1}
        }

# initialize the ip dict
ip_dict = {}

# read from your log file and for every entry, call
update(ip_dict, '1.2.3.4', site_path, user_agent)

当然,您可以通过使用来优化它defaultdict,但这超出了这个问题的范围。

于 2013-10-29T21:13:21.093 回答