【发布时间】:2014-12-18 19:43:40
【问题描述】:
每当用户点击我网站上的某个页面时,我都会运行以下代码来跟踪用户点击、页面浏览量、他们的去向等...
public static void AddPath(string pathType, string renderType, int pageid = 0, int testid = 0)
{
UserTracking ut = (UserTracking)HttpContext.Current.Session["Paths"];
if (ut == null)
{
ut = new UserTracking();
ut.IPAddress = HttpContext.Current.Request.UserHostAddress;
ut.VisitDate = DateTime.Now;
ut.Device = (string)HttpContext.Current.Session["Browser"];
if (HttpContext.Current.Request.UrlReferrer != null)
{
ut.Referrer = HttpContext.Current.Request.UrlReferrer.PathAndQuery.ToString();
ut.ReferrerHost = HttpContext.Current.Request.UrlReferrer.Host.ToString();
ut.AbsoluteUri = HttpContext.Current.Request.UrlReferrer.AbsoluteUri.ToString();
}
}
//Do some stuff including adding paths
HttpContext.Current.Session["Paths"] = ut;
}
当会话结束时,我会在我的 Global.asax.cs 文件中存储该会话信息。当前会话超时设置为 20 分钟。
protected void Session_End(object sender, EventArgs e)
{
UserTracking ut = (UserTracking)Session["Paths"];
if (ut != null)
TrackingHelper.StorePathData(ut);
}
问题是我没有得到准确的信息存储。例如,我在几分钟内就获得了数千个看起来像这样的会话存储。
会话 #1 时间:2014-10-21 01:30:31.990 路径:/博客 IP地址:54.201.99.134
会话 #2 时间:2014-10-21 01:30:31.357 路径:/blog-page-2 IP地址:54.201.99.134
它应该做的是只为这些实例存储一个会话:
会话应该是什么样子 时间:2014-10-21 01:30:31.357 路径:/blog,/blog-page-2 IP地址:54.201.99.134
显然,这似乎是搜索引擎抓取,但问题是,我不确定是否是这种情况。
1) 为什么会这样?
2) 我怎样才能获得准确的会话数以尽可能地匹配 Google 分析?
3) 如何排除机器人?或者如何检测是一个机器人触发了它?
编辑:很多人都在问“为什么” 对于那些问“为什么”的人,我们这样做而不是仅仅使用分析,长话短说,我们正在构建用户配置文件以从他们的配置文件中挖掘数据。我们正在查看他们正在查看的内容、查看时长、点击路径,我们还针对某些页面运行 A/B 测试,并且我们正在检测在整个用户查看周期中哪些页面正在触发,我们正在跟踪一些其他自定义信息,我们无法将其放入谷歌分析 API 并提取此信息。一旦他们浏览了网站,我们就会使用这些信息为网站上的每个会话建立用户配置文件。然后,我们基本上需要检测哪些会话实际上是真实的,并让网站所有者能够查看数据以及我们的数据挖掘应用程序以分析数据并就某些标准向网站所有者提供反馈,以帮助他们改善他们的网站从这些配置文件中。如果您有更好的方法来做到这一点,我们都会倾听。
【问题讨论】:
-
您的具体问题是什么?如果是如何排除机器人,那么您要么必须在客户端 (JS) 上进行跟踪,要么识别并排除特定的 IP 范围或用户代理。
-
你为什么还要这样做?可以从您的服务器日志中挖掘相同的信息,甚至更好的是,您可以使用 Google Analytics 之类的工具,它可以为您提供更详细和全面的统计信息。无论哪种方式都比您正在做的更准确,不需要任何额外的代码阻塞您的应用程序,并且不会受到会话超时等因素的影响。
-
您根本不会在任何地方更新您的
paths -
“您的具体问题是什么?如果是如何排除机器人,那么您要么必须在客户端 (JS) 上进行跟踪,要么识别并排除特定的 IP 范围或用户代理。”是的,这本质上是一个问题,如果这确实是由机器人引起的。
-
您为什么不为此使用分析包?它会更加可靠。 Session_End 不会被可靠地触发,并且永远不会。有很多情况会导致它无法触发,例如应用程序池回收。此外,它还会触发您不想要的机器人和其他流量。只需使用客户端分析工具,如谷歌分析或商业产品。如果您担心禁用 JavaScript 的人,请不要担心.. 现在几乎不可能在没有 javascript 的情况下运行。
标签: c# asp.net .net asp.net-mvc session