如何统计网站访问量

 人参与 | 时间:2026-10-17 07:06:12

打开百度统计后台,何统看到昨天有382个独立访客,计网但服务器日志里却显示有1200多次页面请求。站访这两个数字差了3倍多,问量到底哪个才算“真实访问量”?何统这个问题我折腾了整整一周才搞明白。

最直接的计网办法是在页面里埋一段JavaScript代码。用户打开网页,站访代码就向统计服务器发个请求,问量记录下时间、何统IP、计网浏览器信息。站访Google Analytics、问量百度统计、何统Umami都是计网这个路子。简单,站访但有个致命漏洞——浏览器屏蔽。我自己的Chrome就装了uBlock Origin,默认拦截所有统计脚本。身边做技术的朋友,十个里有六个会屏蔽。这意味着JS统计天然会漏掉一部分人。

那用服务器日志呢?Nginx的access.log会记下每一次请求,包括那些屏蔽了JS的用户。但日志里混着大量非人类流量。上周我爬自己博客做测试,一个脚本就制造了200多条记录。还有各种搜索引擎爬虫、监控探针、恶意扫描器。把这些全算成“访问量”,数字能虚高好几倍。

我试过一个笨办法:在日志里过滤掉已知爬虫的User-Agent,再排除掉静态资源请求(图片、CSS、JS文件),剩下的HTML页面请求大概接近真实用户数。但移动端App里的WebView请求经常不带正常UA,有些还伪装成Chrome。漏判、误判都躲不掉。

后来发现一个折中方案:用JS统计做基准,再用日志做校准。比如JS统计显示100个UV,日志里同一时段有150个HTML请求,那多出来的50个大概率是屏蔽了JS的真实用户加上少量爬虫。你可以取个中间值,或者干脆两个数字都展示——就像GitHub那样,仓库页面同时显示“访问量”和“独立访客”。

具体到代码层面,如果不想用第三方服务,自己写个简易统计也不难。后端开一个/track接口,前端用navigator.sendBeacon()发数据。为什么用sendBeacon而不是fetch?因为页面关闭时fetch会被取消,sendBeacon能保证请求发出去。数据存SQLite就行,按天分表,查起来快。

// 前端埋点示例 window.addEventListener('load', () => {  const data = JSON.stringify({  path: location.pathname, referrer: document.referrer, screen: `${ screen.width}x${ screen.height}` }); navigator.sendBeacon('/track', data); }); 

后端收到后,别急着写库。先做两件事:一是用IP加User-Agent的哈希值做去重,同一个人半小时内只记一次;二是检查Referer,如果为空且UA可疑,直接丢弃。这两步能过滤掉至少三成噪音。

还有个坑:单页应用(SPA)的路由切换不会触发页面刷新,load事件只跑一次。得监听popstate或者用MutationObserver盯着DOM变化。我见过一个React项目,统计代码只写在index.html里,结果用户点遍所有子页面,后台只看到一条记录。

最后说个反直觉的观察:访问量本身没那么重要。我有个做独立开发的朋友,每天UV不到200,但转化率极高,一个月能赚几千美金。另一个站每天几万UV,全是东南亚的无效流量,广告点击率不到0.1%。统计数字只是参考,盯着它优化页面加载速度、调整内容方向,比纠结“为什么百度统计和日志对不上”有用得多。

真要较真,就在页面上放个隐形像素,同时记录JS事件和服务器日志,两边数据都存着。过一个月拉出来对比,你自然就知道自己网站的真实流量大概在什么区间了。别信任何单一来源的数字,包括我这篇。

顶: 22845踩: 6858