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;
}
}
分享到:
相关推荐
HLP2B的西门子PLC驱动程序是专门为该系列PLC设计的通信软件,用于连接计算机与S7-200 PLC进行数据交换和程序下载。在本压缩包中,包含了两个关键文件:"显示驱动模块(子程序).mwp" 和 "hlp2b驱动.mwp"。 "显示...
《21天学通Java%2B2第二版(含源代码)英文版》是一本专为初学者和有一定基础的Java程序员设计的教程。它深入浅出地讲解了Java 2的重要概念和技术,旨在帮助读者在短短21天内掌握Java编程的核心知识。 Java作为一种...
根据给定的信息,我们可以提取和总结...通过上述分析,我们可以看出,《C++程序设计原理与实践》不仅在C++语言领域内具有极高的权威性和实用性,同时也涉及到了数据库系统实现的关键技术,是一本非常有价值的专业书籍。
ISTA 2B-2011(2012) 是一个测试程序,旨在评估包装产品的性能和耐用性。该程序是 ISTA 2 Series 的一部分,结合了 ISTA 1 Series 的基本测试元素和 ISTA 3 Series 的高级测试元素。ISTA 2B-2011(2012) 测试程序旨在...
存储方面,CYT2B7提供1088KB的代码闪存和额外96KB的工作闪存,支持读写同时进行(Read-While-Write,RWW),允许在执行程序的同时更新闪存。此外,还提供了单双银行模式,专门用于固件空中更新(FOTA)。通过SWD/...
PE Explorer是一款强大的程序资源编辑工具,专用于探索和分析可执行文件(PE,即Portable Executable)的结构和内容。这个v1.98 R2++绿色汉化版是经过汉化处理的版本,使得中国用户能够更加方便地理解和使用这款软件...
【Nob2b外贸客户开发软件免费版1.3】是一款专为外贸从业者设计的高效客户搜索工具。这款软件的核心功能在于帮助用户精准地定位和挖掘潜在的外贸客户信息,从而提升业务开发效率。 在外贸行业中,寻找合适的客户是...
关于Blake2b是由Jean-Philippe Aumasson , Samuel Neves , Zooko Wilcox-O'Hearn和Christian Winnerlein创建的BLAKE2b加密哈希函数的Java实现。 (有关摘要的详细信息和权威信息,请参见。) 密切注意Samuel Neves...
该项目是一个基于Java的2b3e数据格式记事本与网站首页脚本设计源码集合,包含85个文件,涵盖50个txt文件、16个Java源文件、5个C源文件、3个2b3e数据文件、2个png图片文件、2个zip压缩文件、1个md文件、1个mdb文件和1...
第1章 Java Web开发简介 第2章 HTML、JavaScript简介 第3章 XML简介 第4章 Tomcat服务器的安装及配置 第2部分 Web基础开发 第5章 JSP基础语法 第6章 JSP内置对象 第7章 JavaBean 第8章 文件上传 第3部分 Web...
一般情况教师想出一份试卷,要么到庞大的题库里一道一道的把题找出来,或是从几本相关的书里把题一道一道挑出来。这样即费时又费力,而且很难保证试题的覆盖面和把握好试卷的难度。正是为了能够帮助教师轻松的出一份...
- **起源与背景**:本书《C++程序设计》由谭浩强编著,作为中国高等院校计算机基础教育课程体系规划教材之一,旨在为学生提供C++编程的基础知识与实践经验。C++语言起源于1972年,由美国贝尔实验室的Dennis M. ...
API 2B中文版.pdf
Arduino 2B37种传感器套件是一款专为Arduino爱好者和开发者设计的全面性学习工具,包含各种类型的传感器,能够帮助用户深入理解物联网(IoT)、自动化和电子工程的基本原理。这个压缩包包含了用于测试这些传感器的程序...
phpb2b程序是由网畅基于PHP+MYSQL开发,集B2B2C管理体系于一身,B2B电子商务平台具有完善的企业、信息、产品、文章发布和管理功能;灵活的会员权限控制和会员管理系统;多灵活的可视化模版引擎可满足企业信息网站...
总结,FlappyBird的Java实现是一个极好的实践项目,它涵盖了基础的图形编程、物理模拟、碰撞检测等多个重要概念。通过学习并实现这个游戏,开发者不仅可以提升编程技能,还能锻炼解决问题和逻辑思维的能力。而注释版...
《JSP2BSQL图书借阅管理系统:源代码、可执行程序与学术资源解析》 在信息技术领域,图书借阅管理系统是常见的应用案例,它旨在高效管理图书馆的图书借阅流程,提供便捷的服务给读者。本系统基于JSP(Java Server ...
javaMITJava+spring boot3+vue3+element-plusuniappS2B2CB2B2CSaaSB2C/H5/APP/PC//////Java
SimpleBGC_GUI_2_2b2中文版是一款专为云台调试设计的软件,它提供了用户友好的界面和强大的功能,使得云台的设置和调整变得更加简单易行。这款软件是针对SimpleBGC控制器的,这是一个广泛应用于无人机、摄影设备和...
本项目“jingpingB2B”显然是一款针对B2B(Business to Business)场景定制的内容管理系统,其核心功能和特点体现在以下几个方面: 1. **二级栏目支持**:内容管理系统提供了二级目录结构,这意味着用户可以创建主...