想爬取一个投票网站的实时数据
获取姓名和票数
查看网站源码(这里只展示一部分)
<table border="0" cellpadding="0" cellspacing="0" class="main"
width="100%">
<tbody>
<tr>
<td height="87" width="30"></td>
<td class="ttl2_1">
<p class="att" style="font-size:14px">1、登陆才可投票,可最多选择10名老师,投票可分多次。 <br />
2、用户名为学号,不区分大小写(ex.b20090001)。 <br />
3、密码默认为身份证出生年月日(ex.19900101)。<br/>
4、本次网络投票时间为2019年11月29日12时至2019年12月10日24时。<br>
<!-- 4、导师排序为拼音顺序。 --></p>
</td>
<td width="16"></td>
</tr>
<tr>
<td></td>
<td valign="top">
<hr />
<center><br />
<center><h1>总参与投票人数:1309</h1></center>
<br />
<br />
<table border="0" cellpadding="10" cellspacing="0"><tbody>
<tr>
<td class = "md" style="width:232px">
<div class="text_box" style="width:232px;height:500px;overflow:hidden; text-align:center;">
<a href="#" target="_blank"><img src="/img/1.jpg" style="height:170px;max-width:100%" /></a>
<h3><span class="r">得票:95</span><span class="l">许镇</span></h3>
<div class="clear dot_line"></div>
<p class="comments">许镇,北京科技大学副教授,清华大学博士,《工程力学》期刊主编助理,主要研究方向为:城市和重大工程的灾变过程情景仿真。发表论文共30余篇,以第一作者身份发表SCI论文6篇,EI论文4篇,包括2篇JCR工程土木类2区论文,2篇3区论文,1篇美国土木工程学会ASCE下属SCI期刊论文。获得实用新型专利1项,软件著作权5项。曾获得北京市科技新星、北京市科学技术二等奖、校“先进工作者”、校“就业工作贡献教师”、中国建筑学会科技进步奖一等奖、中国公路学会科学技术奖一等奖、中国电力科学技术奖三等奖、全国优秀城乡规划奖三等奖等。</p>
<!--<div class="scrollDiv">
<ul id="teach_1">
</ul>
</div>-->
</div>
</td>
<td width="25"></td>
<td class = "md" style="width:232px">
<div class="text_box" style="width:232px;height:500px;overflow:hidden; text-align:center;">
<a href="#" target="_blank"><img src="/img/2.jpg" style="height:170px;max-width:100%" /></a>
<h3><span class="r">得票:81</span><span class="l">刘娟红</span></h3>
<div class="clear dot_line"></div>
<p class="comments">刘娟红,女,1966年出生,江苏苏州人,博士学历,北京科技大学土木与资源工程学院教授、博士生导师,兼任中国建筑学会建材分会理事、中国混凝土与水泥制品协会教育与人力资源委员会理事、中国砂石学会专家委员会委员、中国硅酸盐学会固废分会专家委员会委员。长期从事现代混凝土技术教学与研究工作。承担国家自然科学基金、国家重点基础研究发展计划、国家“十二五”科技支撑项目、省部级科技计划项目和横向科研课题等50余项。获省部级科技进步一等奖1项、二等奖1项、三等奖3项。获国家发明专利6项。在公开刊物上发表文章150余篇,被SCI、EI收录50余篇。出版学术专著《绿色高性能混凝土技术与工程应用》、《活性粉末混凝土》和《固体废弃物与低碳混凝土》,主编教材《土木工程材料》。主要科研成果应用于北京市奥运工程与地铁工程混凝土裂缝控制,广东、新疆等省市重点工程等方面。</p>
<!--<div class="scrollDiv">
<ul id="teach_2">
</ul>
可以看到,网站中一共有两个table,需要从后一个table中读取数据,获取姓名和票数
1.创建java项目,导入jsoup的jar包
下载网站,https://jsoup.org/download,其中也有源码。
2.创建爬虫类
Robot.java
package com.getRoot;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Robot {
public static void main(String[] args)
{
Robot robot=new Robot();
robot.getList();
}
public void getList()
{
String url = "http://ysyy.ibeike.com/index.php?p=result";
List<Teacher> lists=new ArrayList<>();
try {
Document doc = Jsoup.connect(url).get();
// 获取最后一个表格中的所有td(因为每一个人都是在td中的)
Elements els = doc.select("table").last().select("td");
for (Element el : els) {
Elements el2=el.select("h3");//从td中找到h3项
//System.out.println("=="+el2);
//el2: <h3><span class="r">得票:81</span><span class="l">刘娟红</span></h3>
for(Element e:el2)
{
//分别获取第一个span和第二个span中的内容,然后赋值到一个类中
String s1=e.select("span").get(0).text();
int n=Integer.parseInt(s1.substring(s1.indexOf(':')+1));
Teacher teacher=new Teacher();
teacher.setNumber(n);
teacher.setName(e.select("span").get(1).text());
lists.add(teacher);
}
}
} catch (Exception e) {
e.printStackTrace();
}
//根据票数进行排序
Collections.sort(lists, new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
if (o1.getNumber() - o2.getNumber() <= 0) { //变成 < 可以变成递减排序
return 1;
} else {
return -1;
}
}
});
// lists.sort(Comparator.naturalOrder());
for(int i=0;i<lists.size();i++)
{
if(i<9)
System.out.println(i+1+" "+lists.get(i));
else
System.out.println(i+1+" "+lists.get(i));
}
}
}
Teacher.java
package com.getRoot;
public class Teacher
{
private String name;
private int number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public String toString() {
if(number>=100)
return "票数:"+number+" 姓名:"+name;
else
return "票数:"+number+" 姓名:"+name;
}
}
执行结果: