zoukankan      html  css  js  c++  java
  • 我背着CSDN偷偷记录了大半年我博客数据

    作为一个数据控+一个有追求的技术博主,总是希望自己能知道自己博客历史每日粉丝数量、阅读量、积分、评论……的数据,然而官方博客管理后台给展示的数据太少了,只有每日访问量、评论数、粉丝数、收藏数这几个数据,而且目前最多只能看最近一个月的数据。
    在这里插入图片描述
    如果想看更久的数据、想看自己积分的变化、想看总排名 周排名的变化……
    在这里插入图片描述
    没有这些数据,我作为技术博主年底的年终总结怎么办?没有这些数据,我怎么知道自己长期是否进步了,进步速度又是什么样的? 这当然难不住一个优秀的程序猿,本着没有困难创造困难也要上的态度,我用Jsoup写了个简单的爬虫,记录了我博客2019年年底到现在每天的博客数据(除个别几天因为博客改版导致数据记录异常)。没错,这个功能已经上线大半年了,来先给大家展示下我的数据。

    jsoup是一款Java的HTML解析器,可以从html中解析数想要的数据,是用java写爬虫必备的工具。

    每日增量、总量数据随意切换

    在这里插入图片描述

    阅读量、粉丝量、评论数、点赞数、总排名、周排名…… 任意选取

    在这里插入图片描述

    随意选取时间区间

    在这里插入图片描述

    自从有了这个工具后,我博客一切数据尽收眼底,每天看着这数据一点点的变化,还是蛮有成就感、蛮开心的呢 !!

    如何做?

    秀完该告诉大家如何做的,首先你得有台能执行定时任务的主机,云主机或者你卧室的主机都可以,然后得有个数据库,至于整体功能其实就是一个简单的增删改查。哦 不对,只有增查没有删改,数据展示的话我用了蚂蚁金服开源的可视化库antv g2,我用的3.8 bug很多不推荐,推荐使用highchart

    我认为其中比较复杂的部分应该是html数据解析的部分,这部分后面我会直接把我代码告诉你。其次就是数据库的存储和查询,我用spring-boot搭了个web服务,用了spring-boot-starter-quartz写了每天晚上11:55的定时任务,用mybatis-spring-boot-starter来读写数据库。

    html的解析代码,需要看懂csdn博客页的html布局,然后逐渐调试获取数据,当然csdn官方一改版,代码就执行不了了,所幸这种致命性改版频率不会特别高,这大半年我就遇到过2-3次,代码如下,可以直接拿来用,把url换成自己博客url就可以了。

    public class CommonUtils {
        private static Logger log = LoggerFactory.getLogger(CommonUtils.class);
    
        private static Map<String, String> headers;
    
        static {
            headers = new HashMap<>();
            headers.put("referer", "https://www.google.com/");
            headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0" +
                    ".4183.83 Safari/537.36");
        }
    
        public static BlogInfoDao getBlogInfo() {
            int retry = 3;
            while (--retry > 0) {
                try {
                    BlogInfoDao blogInfoDao = new BlogInfoDao();
                    blogInfoDao.setDate(new Date());
                    Document doc = Jsoup.connect("https://blog.csdn.net/xindoo").headers(headers).get();
                    Element blogElement = doc.getElementsByClass("data-info d-flex item-tiling").get(0);
                    // 文章数量
                    int articleCnt = Integer.parseInt(blogElement.getElementsByTag("dl").get(0).attr("title"));
                    blogInfoDao.setArticleCnt(articleCnt);
                    // 周排名
                    int wranking = Integer.parseInt(blogElement.getElementsByTag("dl").get(1).attr("title"));
                    blogInfoDao.setWranking(wranking);
                    // 总排名
                    int ranking = Integer.parseInt(blogElement.getElementsByTag("dl").get(2).attr("title"));
                    blogInfoDao.setRanking(ranking);
                    // 总阅读量
                    int viewCnt = Integer.parseInt(blogElement.getElementsByTag("dl").get(3).attr("title"));
                    blogInfoDao.setViewCnt(viewCnt);
    
                    blogElement = doc.getElementsByClass("data-info d-flex item-tiling").get(1);
                    // 总积分
                    int scoreCnt = Integer.parseInt(blogElement.getElementsByTag("dl").get(0).attr("title"));
                    blogInfoDao.setScore(scoreCnt);
                    // 粉丝数量
                    int fansCnt = Integer.parseInt(blogElement.getElementsByTag("dl").get(1).attr("title"));
                    blogInfoDao.setFansCnt(fansCnt);
                    // 点赞量
                    int likeCnt = Integer.parseInt(blogElement.getElementsByTag("dl").get(2).attr("title"));
                    blogInfoDao.setLikeCnt(likeCnt);
                    // 评论量
                    int commentCnt = Integer.parseInt(blogElement.getElementsByTag("dl").get(3).attr("title"));
                    blogInfoDao.setCommentCnt(commentCnt);
                    // 收藏量
                    int collectCnt = Integer.parseInt(blogElement.getElementsByTag("dl").get(4).attr("title"));
                    blogInfoDao.setCollectCnt(collectCnt);
    
                    return blogInfoDao;
                } catch (Exception e) {
                    log.error("get bloginfo error, {}", e);
                }
            }
            return null;
        }
    }
    

    blogInfoDao是我封装的用来和数据库交互的类,没啥内容这里就不再贴了。

    结语

    我数据目前是半公开状态,可以让大家看,https://xindoo.xyz/ 然后用github登陆后就可以看到数据了,有兴趣可以体验下。之前有人建议开源,不过这个源码是放在一个我个人项目中的,里面很多东西不适合公开,所以暂时不考虑了。

    本文来自https://blog.csdn.net/xindoo

  • 相关阅读:
    android
    需求分析
    请简述使用MediaRecorder实现录音的步骤
    AudioManager的详细内容
    ios 开发failed to chmod
    崩溃block
    图片不能切割成功 调了五个小时!!!!
    collectionView itemW宽度计算不对
    只用头文件
    ping 10.13.5.233
  • 原文地址:https://www.cnblogs.com/xindoo/p/13622478.html
Copyright © 2011-2022 走看看