为什么手动分析
Anthony说网站访问分析是门学问,相当复杂。我查了下,貌似大公司确实是有负责SEO和相关运维的人。
事实上,目前有很多成熟的统计工具:如 Google Analytics、百度统计、CNZZ、淘宝的量子统计等等。
如何使用统计工具,根据它们提供的海量数据分析来进行分析,是需要长期摸索的。这次我只是想试试直接用Python分析SAE访问日志access_log,看看4月5号的巨大流量到底是因为有学生无聊写了爬虫还是确实用户黏性很大。
手动分析的思路
我注意到access_log的格式是相当工整的,每条访问记录为一行。我个人认为每条记录可分解为以下数据:
主域名
,我们的网站域名
用户IP地址
,包括 ip和 xxx
时间戳
,时区
代码版本
请求method
,如GET/POST/PUT
访问路径
, 如 /online
http协议
、状态码
、传输内容大小
。类似: HTTP/1.0 200 3751
访客来源
,refer
浏览器类型
,agent。这个是分析的重点,估计要认真倒腾正则表达式
服务器名称
(?),应该是sae的服务器代码
这样,便可以将log格式化保存并分析。
最佳思路:
1.开个cron任务每天自动下载日志
2.将日志格式化处理,保存数据库
3.对数据表进行分析
但是上述方法耗时巨大,花这精力不如折腾Google Analytics!
简化版思路:
1.手动下载感兴趣的日志
2.Python脚本处理日志,转成列表&字典
综合体
3.需要分析什么东西,就写相应的函数进行处理
实际操作
通过换行符
和空格
来辨识数据,我将log保存为IP、timestamp、method、route、agent等列表。
1.判断是否有爬虫
专业一点的爬虫会不断更换IP地址,不过我觉得这么专业的黑客才懒得爬我们的网站呢!
所以,我直接去统计各IP的访问次数,不就可以判断了嘛~
相关代码如下:
from collections import Counter
c = Counter(IP)
print c.most_common(20)
第一次接触collections
模块,官方文档见此,关于Counter
的简单介绍见此。
如果不用上述方法,直接去统计列表中各元素出现次数并排序,可是个不小的问题。参见啄木鸟社区的讨论和这篇还有这篇。
2.统计iPhone/iPad和Android用户分布
对了,不能忘了WP。我们不是支付婊!
一步步清洗数据时发现,【浏览器欺骗】真的是太常见了!下面是一个WP的ua,真是可怜!
"Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Nokia 925) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537 MicroMes
senger/6.0"
所以,想要筛选真实设备信息,是需要大量 for-if-print尝试的,不断的逻辑推理和排查,才能得出具有一定可信度的结论。
初步结论如下:
1.总pv为102306条
2.从微信中访问的有93119条(MicroMessenger/
)
3.iPad访问条数是2829
4.iPhone是26889(包含iPhone,不包含WP)
5.Android设备访问次数是70752(包含Android,不包含WP。不知道还要排除谁)
6.从windows phone 访问的有598条(Windows Phone
)
7.从uc浏览器访问的只有23条,是一个Nokia用户
如果标记了该设备,然后再统计去重IP地址,差不多就是设备数。(不考虑更换IP地址)
待续。。。
有没有人看呀!!!!
3.统计网络状态分布
2G/3G/4G/WIFI。因为不同网络的标识亦不同,所以搞定到底是3G还是2G都是一门学问。
1.包含NetType标识的请求有91497次(估计是微信6.x才加入的特性)
2.WIFI环境的请求有63591次
3."cmnet"请求8952次 //中国移动2G?
4."3G"请求8450次
5."3gnet"请求5042次 //中国联通3G
6."2G"请求859次
7."ctnet"请求957次
8."ctwap"请求923次
9."uninet"请求532次 //中国联通2G
10.其他请求2191次
麻痹的,累死我了。原始方法,谁让你不学正则!麻痹的!说说结论:
wifi访问占了三分之二强,2G访问不到10%。也有可能是2G网速差所以请求不够多,暂未分析2G设备数。
4.统计各页面访问情况
online,私信,主页,匹配。待续
【注】分析online
时应排除翻页时的POST请求。
1.
online
被访问了11762次,其中GET请求3905次。(' /online2'有空格,NP++,排除refer的影响)
2.匹配
被访问了10336次。让我吃惊的数据,目前功能和体验都很差呀!
3.用户主页
被访问了31534次。考虑翻页请求,profile:online的比例终于有合理解释了
4.私信
发送了2478条。 MySQL语句获得
参考资料
理论篇
深入理解HTTP协议
认识User Agent
【UserAgent的历史变迁】小品文,我要笑哭起来了
【浏览器野史 UserAgent列传】