import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
* 厦门公交数据爬虫
*
* @author Administrator
*
*/
public class PaPA {
static List<String> stationList = new ArrayList<String>();
static int STAT_MOVING = 1;
static int STAT_READY = 2;
static int STAT_NON = 0;
/**
* 获取所有的公交站名
*
* @author Administrator
*
*/
public List<String> grabStation(String url) {
try {
Document doc = Jsoup.connect(url).get();
// 计算出一共有几站
Elements countStationElements = doc
.getElementsContainingOwnText("共");
Element countStationElement = countStationElements.get(0);
String countStationElementString = countStationElement.childNode(0)
.toString();
int countStation = Integer.parseInt(countStationElementString
.substring(3, 5));
// 计算出一共有几站
// 得到值为“反向”的节点,以此来得到后面的公交数据
Elements elements = doc.getElementsContainingOwnText("反向");
Element element = elements.get(0);
// 这时候还要退回去找爹,把爹找到之后爹的兄弟就是公交站的名字了
Element nextStation = element.parent().nextElementSibling();
for (int i = 0; i < countStation; i++) {
Element child = nextStation.child(0);
String value = child.childNode(0).toString();
stationList.add(value);
nextStation = nextStation.nextElementSibling();
}
} catch (IOException e) {
e.printStackTrace();
}
return stationList;
}
public static void main(String[] args) {
PaPA grab = new PaPA();
// // 显示所有公交站的地址
// String url =
// "http://mybus.xiamentd.com/LineDetailQuery?lineId=400&direction=1";
//
// // 抓取公交站
// grab.grabStation(url);
//
// for (Iterator iterator = stationList.iterator(); iterator.hasNext();)
// {
// String station = (String) iterator.next();
// System.out.println(station);
// }
// 设置起始的公交站
int lineId = 400;
int start = 12;
int end = 13;
int direction = 1; // 表示从观音山出发
// String urlNew =
// "http://mybus.xiamentd.com/RealtimeQuery?lineId="+lineId+"&direction="+direction+"&station=%E4%B8%8A%E6%9D%8E%E7%AB%99&ordinal="+start;
try {
System.out.println(grab.checkEachStation(lineId, start, end, direction));
} catch (IOException e) {
e.printStackTrace();
}
}
private long checkEachStation(int lineId, int start, int end, int direction)
throws IOException {
long sysTime1 = System.currentTimeMillis();
for (;;) {
// 都是为了得到车状态信息所做的准备
int state = PaPA.STAT_NON;
String url = generateUrl(lineId, start, end, direction);
Document doc = Jsoup.connect(url).get();
Element busNearBy = doc.getElementsContainingOwnText("最近公交").get(0);
String sss = busNearBy.toString();
// 出现暂无信息的时候,页面发生变化,要及时中止。
if (sss.contains("暂无信息")) {
System.out.println("暂无信息");
continue;
}
Element child = busNearBy.child(0);
String result = child.toString();
if (result.contains("到达") || result.contains("开往")) {
state = PaPA.STAT_MOVING;
} else if (result.contains("已经到站")) {
state = PaPA.STAT_READY;
}
// 两个分支,一个是到达,一个是等待
if (state == PaPA.STAT_READY) {
System.out.println("车已经到站");
start++;
if (start <= end)
continue;
// start==end就代表已经到达要的站了,可以记录时间了
else {
long sysTime2 = System.currentTimeMillis();
return sysTime2-sysTime1;
}
}
else {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println("车还没到站");
continue;
}
}
}
private String generateUrl(int lineId, int start, int end, int direction) {
return "http://mybus.xiamentd.com/RealtimeQuery?lineId=" + lineId
+ "&direction=" + direction
+ "&station=%E4%B8%8A%E6%9D%8E%E7%AB%99&ordinal=" + start;
}
}
分享到:
相关推荐
【迷你书】C%2B%2B程序设计原理与实践(C%2B%2B之父...
HLP2B的西门子PLC驱动程序(西门子S7-200程序)rar,HLP2B的西门子PLC驱动程序(西门子S7-200程序)
PE Explorer(程序资源编辑工具) v1.98 R2%2B%2B 绿色汉化版 ---可以反编译!!!
C%2B%2B程序设计谭浩强.pdf 学习C++入门书籍
关于Blake2b是由Jean-Philippe Aumasson , Samuel Neves , Zooko Wilcox-O'Hearn和Christian Winnerlein创建的BLAKE2b加密哈希函数的Java实现。 (有关摘要的详细信息和权威信息,请参见。) 密切注意Samuel Neves...
FlappyBird注释%2B开发文档版_java 实现 学习
arduino 2B37种传感器套件测试程序
第1章 Java Web开发简介 第2章 HTML、JavaScript简介 第3章 XML简介 第4章 Tomcat服务器的安装及配置 第2部分 Web基础开发 第5章 JSP基础语法 第6章 JSP内置对象 第7章 JavaBean 第8章 文件上传 第3部分 Web...
一般情况教师想出一份试卷,要么到庞大的题库里一道一道的把题找出来,或是从几本相关的书里把题一道一道挑出来。这样即费时又费力,而且很难保证试题的覆盖面和把握好试卷的难度。正是为了能够帮助教师轻松的出一份...
清华大学C%2B%2B程序设计教程(唐浩强)-上.pdf
典范英语2B.pdf
phpb2b程序是由网畅基于PHP+MYSQL开发,集B2B2C管理体系于一身,B2B电子商务平台具有完善的企业、信息、产品、文章发布和管理功能;灵活的会员权限控制和会员管理系统;多灵活的可视化模版引擎可满足企业信息网站...
本书是详细介绍java 2的完整而实用的参考书,本书试用于java新手和使用过以前版本java的程序员
API 2B中文版.pdf
java%2B进销存文档.docx
nob2b客户开发软件系统免费版,外贸客户搜索软件免费版
CYT2B7系列数据手册
第1章 Java Web开发简介 第2章 HTML、JavaScript简介 第3章 XML简介 第4章 Tomcat服务器的安装及配置 第2部分 Web基础开发 第5章 JSP基础语法 第6章 JSP内置对象 第7章 JavaBean 第8章 文件上传 第3部分 Web...
(完整版)新概念英语青少版2B期末测试卷.pdf
JSP2BSQL图书借阅管理系统源代码+可执行程序+论文+答辩PPT