统计博客园个人博客访客的简单方法

  今日发表一篇较为逗比的文章。后来想统计下进入我博客的同学都用什么系统,都是哪儿的人(今天有点闲)。然后就有了下面的图表。

  根据UV,总共统计最后155名园友。

统计博客园个人博客访客的简单方法_第1张图片

统计博客园个人博客访客的简单方法_第2张图片

统计博客园个人博客访客的简单方法_第3张图片

  结果很清晰有木有,本来这种统计可以使用第三方统计代码(百度、cnzz)来实现,可咱是做技术的阿。那么就讲讲我是如何采集和分析的吧。

===第一步 采集===

  如下图。在个人后台的css代码部分添加如下css代码。原理就是页面加载css的时候会请求这个背景图,当服务器收到请求过来就将访客的UserAgent、IP等信息写入数据库。入库之后采集部分也就完成了。

  统计博客园个人博客访客的简单方法_第4张图片

    public class req : IHttpHandler
    {
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        public void ProcessRequest(HttpContext context)
        {
            var req = context.Request;
            var res = context.Response;

            res.ContentType = "text/html";

//写入数据库
            UpdaterReq.Add(new UpdaterReq.Record
            {
                Url = req.Url.ToString(),
                UserAgent = req.UserAgent != null ? req.UserAgent : "",
                Referrer = req.UrlReferrer != null ? req.UrlReferrer.ToString() : "",
                IP = req.GetRealIP(),
                Time = DateTime.Now
            });

            //res.Write("<pre>" + comm.JsonSerializer.Serialize(c, false) + "</pre>");
            res.Write(1);
        }
    }
View Code

===第二步 分析===

  如下图。数据表就2个字段,IP和UserAgent。我们知道,通过ip可以定位到地区,UA里面可以获取到操作系统,浏览器版本。那么上述图表中的信息都可以很方便的拿到。接下来就简单了,按照具体的规则处理即可。别忘记IP首先要去重,否则统计的是PV。而我统计的是UV。

  统计博客园个人博客访客的简单方法_第5张图片

var list = new Dictionary<string, string>();
                var cityDic = new Dictionary<string, int>();
                var osDic = new Dictionary<string, int>();
                var bsDic = new Dictionary<string, int>();
                var lines = txt.Replace("\r\n", "\n").Split('\n');
                foreach (var line in lines)
                {
                    if (line != "")
                    {
                        var ss = line.Replace("\t\t", "\t").Split('\t');
                        if (!list.ContainsKey(ss[0]))
                        {
                            var cs = City(ss[0]);
                            if (!cityDic.ContainsKey(cs[1]))
                            {
                                cityDic.Add(cs[1], 0);
                            }
                            cityDic[cs[1]]++;

                            list.Add(ss[0], ss[1]);
                        }
                    }
                }

                var sb = new StringBuilder();
                sb.AppendLine("统计人数:" + list.Count);
                sb.AppendLine("=====================================================");
                sb.AppendLine("地区:" + cityDic.Count);
                foreach (var item in cityDic)
                {
                    sb.AppendLine((item.Key == "" ? "其他" : item.Key) + "\t" + item.Value);
                }
                foreach (var item in list)
                {
                    var ua = item.Value.ToLower();
                    var os = "";
                    var bs = "";

                    if (ua.IndexOf("chrome") != -1)
                    {
                        bs = "Chrome";
                    }
                    else if (ua.IndexOf("msie") != -1)
                    {
                        bs = "IE";
                    }
                    else if (ua.IndexOf("firefox") != -1)
                    {
                        bs = "Firefox";
                    }
                    else if (ua.IndexOf("safari") != -1)
                    {
                        bs = "Safari";
                    }
                    if (!bsDic.ContainsKey(bs))
                    {
                        bsDic.Add(bs, 0);
                    }
                    bsDic[bs]++;

                    if (ua.IndexOf("windows nt") != -1)
                    {
                        os = "Windows";
                    }
                    else if (ua.IndexOf("android") != -1)
                    {
                        os = "Android";
                    }
                    else if (ua.IndexOf("iphone") != -1)
                    {
                        os = "iPhone";
                    }
                    else if (ua.IndexOf("macintosh") != -1)
                    {
                        os = "Mac";
                    }
                    else if (ua.IndexOf("ipad") != -1)
                    {
                        os = "iPad";
                    }
                    if (!osDic.ContainsKey(os))
                    {
                        osDic.Add(os, 0);
                    }
                    osDic[os]++;
                }
                sb.AppendLine("OS =====================================================");
                foreach (var item in osDic)
                {
                    sb.AppendLine((item.Key == "" ? "其他" : item.Key) + "\t" + item.Value);
                }
                sb.AppendLine("BS =====================================================");
                foreach (var item in bsDic)
                {
                    sb.AppendLine((item.Key == "" ? "其他" : item.Key) + "\t" + item.Value);
                }

                Console.WriteLine(sb.ToString());

                File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "stat.txt"), sb.ToString());
View Code

  分析之后的结果我保存到一个txt文件。然后导入到execl,然后就有图表了。

===总结===

  整个实现比较简单,统计也很粗略。虽然现在很多成熟的统计系统可以用,不过人家的东西用多了,自己总得知道原理。否则技术永远停留在表明,那样的话技术是得不到提高的。再一点很重要,自己做产品统计是非常重要的一节,你需要非常清晰的知道自己的用户的使用习惯。好了,发表,睡觉。

你可能感兴趣的:(博客)