作者 | bisal
责编 | 张红月
技术解析来自bisal的个人杂货铺,博客之星6号博主
快过年了,有人欢喜有人忧。喜的是放假了,忧的是又要被(找)相(对)亲(象)。程序员们,Are you ready?
来来来,放松一下!
如今人人都是自媒体,通过写博客、分享学习笔记聚集粉丝已是很多人屡试不爽的方法。作为日PV过千万,仅次于Github的程序员社区,CSDN博客原创文章发布量平均为7300篇/天,同比2017年,每天新增了2000多篇文章。在这些数字的背后,是那些长年在键盘后面辛勤努力的技术英雄们,他们笔耕不辍、乐于分享,布道知识,共同精进。
分享知识的同时,还获得大量粉丝关注,例如知名的CSDN博主任玉刚、刘望舒等。同时,CSDN社区为感谢辛勤创作的博主们,还举办了博客之星活动。
肉眼数名次,你晕了吗?程序员Say No!
乍一看,这个页面很清晰,但有个问题,就是无法知道每个人的排名,只能肉眼数名次。
作为程序员,是不能容忍耗费体力的事,因此需要考虑,如何自动排名。
既然是网页,就存在解析内容的可能,看了下网页源码,都是普通的HTML标签,如下所示,因此,可以通过技术的手段,解析网页:
006
bisal
原创博文:354
当前票数:337
投票
为TA拉票
程序员助力老婆项目分析
网页解析,有很多开源的工具可用,我的本硕毕设,做的就是专利网页抓取解析,而且曾经帮老婆的一个项目,抓取、解析过当当网这些电商网站,用的就是神器-Jsoup,可谓屡试不爽。
Jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。他提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。Jsoup是基于MIT协议发布的,可放心使用于商业项目。
他的主要功能,包括如下这些:
1. 从一个URL,文件或字符串中解析HTML;
2. 使用DOM或CSS选择器来查找、取出数据;
3. 可操作HTML元素、属性、文本;
Jsoup的官网是https://jsoup.org/
排名分析
首先,明确下,需要从网页中,解析到的内容,包括编号、博主名称、原创博文数量、票数:
Document doc = Jsoup.parse(url, Constants.TIME_OUT);
Elements elements = doc.getElementsByClass("user-info");
List list =newArrayList();
for(Element element : elements) {
if(!element.text().trim().equals("")) {
Blogger blogger =newBlogger();
blogger = getBlogger(element.text());
list.add(blogger);
}
}
定义一个实体类Blogger,包含了编号、博主名称、原创博文数量、票数。
privateString no;
privateString name;
privateString articleNo;
privateinttickerNo;
从网页中看,每个博主信息,都在
标签内,首先实例化Document对象,使用getElementsByClass()方法,定位class是user-info的标签,由于需要循环处理所有博主,因此使用List,成员类型是Blogger,element.text()就是从
解析出的各部分内容,注意此处需要判断是否为空,因为要得出编号、博主名称、原创博文数量、票数这些信息,所以还要对内容,进行字符串分割,此处自定义getBlogger()方法,用于拆解字符串。
Document doc = Jsoup.parse(url, Constants.TIME_OUT);
Elements elements = doc.getElementsByClass("user-info");
List list =newArrayList();
for(Element element : elements) {
if(!element.text().trim().equals("")) {
Blogger blogger =newBlogger();
blogger = getBlogger(element.text());
list.add(blogger);
}
}
getBlogger()方法,会根据element.text()的返回值,做字符串分割,再存储进Blogger对象。
Blogger blogger =newBlogger();
String no = line.substring(, line.indexOf(" "));
String name = line.substring(line.indexOf(" ") +1, line.indexOf(" 原创"));
String articleNo = line.substring(line.indexOf(":") +1, line.indexOf("当前") -1);
intticketNo = Integer.valueOf(line.substring(line.indexOf("当前票数:") +5, line.length()));
blogger.setNo(no);
blogger.setName(name);
blogger.setArticleNo(articleNo);
blogger.setTicketNo(ticketNo);
returnblogger;
得到了编号、博主名称、原创博文数量、票数,现在需要做的,就是排序,准确地说,是用票数排序,由于是整型,因此只要按照>、=、
Collections.sort(list,newComparator(){
/*
* int compare(Person p1, Person p2) 返回一个基本类型的整型,
* 返回负数表示:p1大于p2,
* 返回0 表示:p1和p2相等,
* 返回正数表示:p1小于p2
*/
publicintcompare(Blogger p1, Blogger p2){
//按照Person的年龄进行升序排列
if(p1.getTicketNo()
return1;
}
if(p1.getTicketNo() == p2.getTicketNo()){
return;
}
return-1;
}
});
将List成员打印出来。
此时,就是按照票数,进行的展示:
写文章赢大奖
知道你们想问奖品好久了,开年会的时候,大家首先会问奖品有什么?博客之星活动也不例外,奖品超酷炫:
投票有机会赢超跑免费驾驶
本次王子出行(王子车库科技有限公司)
秉承“让租车比买车更划算!”的商业理念,专注于为广大出行需求用户提供高端车型订制出行服务;
如何参与投票
领取专属 10元无门槛券
私享最新 技术干货