在博客园中,一篇博客的底部,通常有该篇博客的阅读量的统计。当浏览器端没发起一个请求的时候,它通过相应的逻辑判断,如果符合要求,则给阅读量加一。所以,有了如下代码:
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Url {
private final static String BLOGURL = "http://www.cnblogs.com/RunForLove/p/5439002.html";
public static void main(String args[]) {
try {
for (int i = 0; i > -1; i++) {
execute(BLOGURL);
System.err.println("cnblogs\t" + i);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void execute(String url) throws Exception {
// 创建URL链接
URL connURL = new URL(url);
// 打开链接
HttpURLConnection httpConn = (HttpURLConnection) connURL.openConnection();
String cookie = getCookie();
// 设置通用属性
httpConn.setRequestProperty("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
httpConn.setRequestProperty("Accept-Encoding", "gzip, deflate, sdch");
httpConn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");
httpConn.setRequestProperty("Cache-Control", "max-age=0");
httpConn.setRequestProperty("Connection", "Keep-Alive");
httpConn.setRequestProperty("Cookie", cookie);
httpConn.setRequestProperty("Host", "www.cnblogs.com");
httpConn.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36");
httpConn.setRequestProperty("If-Modified-Since", "Wed, 11 May 2016 09:24:05 GMT");
// 建立实际的链接
httpConn.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));
in.close();
}
private static String getCookie() {
return "CNZZDATA4324368=cnzz_eid%3D1585339881-1456207541-null%26ntime%3D1456207620; CNZZDATA1556060=cnzz_eid%3D412661198-1456450586-null%26ntime%3D1456450586; CNZZDATA5299104=cnzz_eid%3D1116436150-1456733240-null%26ntime%3D1456733240; __gads=ID=bd2ad73bc51c0d10:T=1456882812:S=ALNI_Mayf4iI2fnDbt6M7y9cprjSo8kzzQ; .CNBlogsCookie=900FD4817DFA0E06C5C5CB79015C39CC3C869C4324CBA33194A920C4639F2843E32BCA929484834CC0B1C653661BB1CF7AFC54E30A77E3F2B95BB160AEB17E0AC438B8C30CDD84DFC2455CE2D3F5B06B04881C61; AJSTAT_ok_times=3; CNZZDATA1121896=cnzz_eid%3D2087772282-1462859238-null%26ntime%3D1462859238; CNZZDATA943648=cnzz_eid%3D1056946870-1462854976-null%26ntime%3D1462859947; __utma=226521935.1056844361.1456278785.1462950083.1462950083.1; __utmc=226521935; __utmz=226521935.1462950083.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; _ga=GA1.2.1056844361.1456278785";
}
}
但是,通过测试,博客园中的阅读量并没有增加。我的思考如下:
1.它的后台做了时间戳的判断,如果相同的IP在很短的时间内访问,阅读数不加。(之所以这么设计,可能是需要将缓存写回数据库)但是,跑了好长是代码,依旧没有阅读量增加。
2.特别好奇博客园的后台是怎么统计阅读数的,有没有做过类似项目的,讲讲啊。
非常感谢~ 谢谢~~
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这个统计没有绝对的正确,只能尽量去接近正常的统计算法,且不被人恶意去刷!
所以他不是你说的相同的IP在很短的时间内不计算在内,而是做了一个IP最多只增加两次阅读类似的机制,或者还有更深一层次的,比如第二天IP清空,然后这个统计算法变成了每一天每一个IP都有两次阅读次数增加的机会
所以我觉得只要你认为这个符合你系统的业务设计就是合理的,没有标准答案!
不同的博客系统设计是不一样的。
最简单的是每请求一次增加一次阅读量。
稍微高级点用session记录用户,一段固定时间内(比如30分钟),不管你用同一个浏览器内核访问多少次只增加一次阅读量。
再高级点,一段固定时间内(比如30分钟),同一个ip访问不论多少次只增加一次阅读量。
再高级就是设计上的问题了,比如只有将文章从上读到下才算一次阅读量,只有登录用户浏览才算阅读量等等。
同一客户端一段时间内多次访问当成一次访问,说白了就是统计页面的 PV 嘛。
我的方法很简单,就是点进这个链接,在数据库里加一
我们以前做的是一小时内的同一个IP的只算一次
用session吧,简单好用。
例如我昨天就会用这个来统计:
有个东西叫缓存?
主要是看运营的小伙伴怎么定义。打个比方,如果是初创企业,要拿各种流量数据去忽悠风投,那么你懂的~如果是成熟的项目,为了进一步的数据分析/挖掘,那么对数据的严谨度会更高
一般会基于session, 其实session的本质就是个自定义的cookie,一般人不会闲得无聊去删cookie Java教程