seo网站日志分析工具(Python分析网站日志之前教程,教你如何用模块)

优采云 发布时间: 2021-12-05 23:23

  seo网站日志分析工具(Python分析网站日志之前教程,教你如何用模块)

  人生苦短,我用Python,从入门到放弃,再学习如何安装X。这里有一个安装X的指南,教你如何使用Python分析网站日志数据。

  在使用Python分析网站日志之前,请先安装openpyxl模块。

  下面贴来分析网站日志的轮子:

  # -*- coding: utf-8 -*-

from openpyxl import Workbook

import json

import re

import time

# 日志格式,支持NGINX 来源:www.daxianseo.cn

log_format = '^\[(?P.*?)\+[:\d]+\]\[(?P\d+)\]\[(?P.*?)\] '\

'"(?P.*?) (?P.*?) (?:.*?)" ' \

'"(?P.*?)" "(?P.*?)"'

# 搜索引擎蜘蛛

spider_user_agent = {

'百度': re.compile('(Baiduspider(?:[-\w]+)?/[\d\.]+)', re.I),

'搜狗': re.compile('(Sogou \w+ spider/[\d\.]+)', re.I),

'神马': re.compile('(YisouSpider)', re.I),

'360': re.compile('(360Spider)', re.I),

'谷歌': re.compile('(Googlebot/[\d\.]+)', re.I),

'头条': re.compile('(Bytespider)', re.I),

'必应': re.compile('(bingbot/[\d\.]+)', re.I)

}

# 日志正则

log_re = re.compile(log_format, re.I)

def process_log_line(result_dict, log_line):

log_line_items = log_re.search(log_line)

if log_line_items is None:

return

for engine_name, spider_reg in spider_user_agent.items():

user_agent = log_line_items.group('http_user_agent')

has_spider = spider_reg.search(user_agent)

if has_spider is None: continue

# 访问时间处理

time_local = log_line_items.group('time_local')

time_local_str = time.strptime(time_local, '%Y-%m-%dT%H:%M:%S')

access_time = time.strftime('%Y-%m-%d:%H', time_local_str)

# 访客IP处理

remote_addr = log_line_items.group('remote_addr')

# 访问的URI处理

request_uri = log_line_items.group('request_uri')

# 状态码

status = int(log_line_items.group('status'))

# 蜘蛛名称

spider_name = has_spider.group(1)

process_spider_log(result_dict, engine_name, spider_name, remote_addr,

access_time, request_uri, status)

break

def process_spider_log(result_dict, engine_name, spider_name, remote_addr,

access_time, request_uri, status):

engine = result_dict.get(engine_name)

if engine:

engine['count'] += 1

# 处理蜘蛛名称

spider_names = engine['spider_names']

if spider_names.get(spider_name):

spider_names[spider_name] += 1

else:

spider_names[spider_name] = 1

# 处理蜘蛛IP

spider_ips = engine['spider_ips']

if spider_ips.get(remote_addr):

spider_ips[remote_addr] += 1

else:

spider_ips[remote_addr] = 1

# 处理访问时间

access_times = engine['access_times']

if access_times.get(access_time):

access_times[access_time] += 1

else:

access_times[access_time] = 1

# 处理状态码

status_codes = engine['status_codes']

if status_codes.get(status):

status_codes[status] += 1

else:

status_codes[status] = 1

# 处理请求的URI

request_uris = engine['request_uris']

if request_uris.get(request_uri):

request_uris[request_uri]['count'] += 1

spider_info = request_uris[request_uri]['spider_info']

if spider_info.get(spider_name):

if spider_info[spider_name].get(remote_addr):

spider_info[spider_name][remote_addr] += 1

else:

spider_info[spider_name][remote_addr] = 1

else:

spider_info[spider_name] = {remote_addr: 1}

else:

request_uris[request_uri] = {

'count': 1,

'spider_info': {

spider_name: {

remote_addr: 1

}

}

}

else:

result_dict[engine_name] = {

'count': 1,

'spider_names': {

spider_name: 1,

},

'spider_ips': {

remote_addr: 1

},

'access_times': {

access_time: 1

},

'status_codes': {

status: 1

},

'request_uris': {

request_uri: {

'count': 1,

'spider_info': {

spider_name: {

remote_addr: 1

}

}

}

}

}

  分析后的结果:

  

  需要注意的是,并非每个 NGINX 日志格式都相同。您的日志和轮子的顺序可能会更改,结果将是错误的。您需要自己调整顺序。

  

  关于网站日志数据分析教程,可以看这里:《网站日志数据分析教程》。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线