Init – Python数据分析(1)

1.1. 前言

由于公司业务的发展,在一些产品的功能上面不再满足于哪些简简单单的功能性的主要功能了。也开始考虑一些为产品增添色彩的功能(数据统计)。

当然,产品中的一些基本的统计功能,使用关系型数据库(MySQL)基本都能解决的。但是当访问量上来了数据量稍微有了,使用MySQL来承担报表的工作就显得有点吃力了。

这时候就不得不从业务和架构上去考虑来做这些报表功能。

1.2. 业务的需求

对于做需求的来说,数据总是需要实时的,他们根本就不理解 '实时' 这两个字会给系统带来多大的负担。

如:用户对浏览过的商品、页面的浏览量

1、(实时)在访问量小的时候可以使用 MySQL 完全可以解决问题。

2、(实时)在访问量稍微大了点对系统有点压力 可以使用 MySQL/Redis + 从库查询 来克服对主库带来的压力。

3、(放弃实时,变成准实时)在访问量真的很大了使用上面的在做统计就有边的费力了这时候就需要使用其他的方法了。现在有许多的方法可以很好的完成这样的工作(Strom/Spark/Hadoop)。

1、Strom: 实时流式计算

2、Spark/Pandas: 内存计算

3、Hadoop(M/R): 离线计算

1.3. 正题

今天我们介绍使用 Hadoop(M/R) 框架 和 Pandas 来分析Nginx日志

相关的示例Nginx日志文件在网盘上:

链接: https://pan.baidu.com/s/1qYyAyvi 密码: rnbj

源代码:https://github.com/daiguadaidai/nginx_log_parse

1.4. Nginx 日志格式

这边我将日志分为 7个 部分:

cdn_ip(CDN请求IP): 140.205.127.56

access_time(请求时间): 13/Jun/2016:14:37:04 +0800

request_url(请求的URL): /wp-content/plugins/font-awesome-4-menus/fonts/fontawesome-webfont.woff2

response_status(NG 响应状态码): 304

reference_url(外链URL): www.ttmark.com

browser(用户使用的浏览器): Chrome/42.0.2311.154 Safari/537.36 LBBROWSER

real_ip(用户真实IP): 60.222.159.45

1.5. 这边使用Python写了一个类专门用来解析Nginx日志的

代码如下:

该类中主要有两个方法:

  1. parse: 将传入的字符串解析为有用的 7个 部分
  2. to_dict: 将解析好的7个部分的数据转化成键值对。

1.6. IP对应地区文件讲解

这边提供了两种文件

  1. area_ip.sql: ip地址的sql文件,可以直接导入关系型数据库。
  2. area_ip.csv: 以 tab 分割的IP地址数据

在我们的示例中使用的是 area_ip.csv

area_ip.csv 的数据:

每一个数据中存放的都是一个区域的IP的范围

以第一行为例

2634: 主键

0: 一个区域IP起始数字(一个IP地址可以转化成一个INT数字)

16777215: 一个区域IP结束数字

0.0.0.0: 一个区域的IP起始地址

0.255.255.255: 一个区域的IP结束地址

IANA: 该IP范围的所在区域

保留地址: 该IP的运营商是谁

1.7. 我们的目标

我们需要分析出以下几个结论:

  1. 每天的PV
  2. 一天中哪个时段访问量比较高
  3. 每个URL被请求了多少次(TOP 100)
  4. 外链地址点击次数(TOP 100)
  5. 浏览工具的种类(TOP 100)
  6. CDN IP 数量 (TOP 100)
  7. 真实用户IP访问次数(TOP 100)
  8. CDN IP 和 地址(TOP 100)
  9. 真实IP 和 地址(TOP 100)

 

昵称: HH

QQ: 275258836

ttlsa群交流沟通(QQ群②: 6690706 QQ群③: 168085569 QQ群④: 415230207(新) 微信公众号: ttlsacom)

感觉本文内容不错,读后有收获?

逛逛衣服店,鼓励作者写出更好文章。

HH
teakki

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: