java爬取航班实时数据
使用jsoup获取航班实时数据
优先使用携程航班数据 如果携程航班数据返回为空 则使用去哪儿航班信息
pom.xml
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.6.1</version>
</dependency>
爬取携程航班信息代码
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import com.jdkeji.sdcx.common.exceptions.SdcxException; /**
* 携程 航班爬取数据工具类
* @Description:
* @author:haoqingshuang
* @CreatTime:2017年9月28日
*
*/
public class XcFlightUtil { // http://flights.ctrip.com/actualtime/fno--CZ6902-20170928-BJS-URC.html
public static Document getDocument(String url) throws SdcxException{
try {
return Jsoup.connect(url).get();
} catch (IOException e) {
throw new SdcxException("获取航班信息异常,请自行查询航班数据!");
}
} /**
* 根据航班号 爬取航班信息
* @description:
* @author:haoqingshuang
* @CreateDate:2017年9月28日
*/
public static String findFlightByFlightCode(String FlightNumber) throws SdcxException{
StringBuilder sBuffer = new StringBuilder();
if(StringUtils.isEmpty(FlightNumber)){
throw new SdcxException("请输入航班号!");
}
String nowDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
Document doc = getDocument("http://flights.ctrip.com/actualtime/fno--"+FlightNumber+"-"+nowDate+".html");
if(null == doc){
throw new SdcxException("网络异常,请稍后再试!");
} // 航班详情
Elements flightDetail = doc.select("[class=detail-m]"); //起飞详情
Elements detailfly = flightDetail.select("[class=detail-fly]");
//起飞地信息
Elements inldeparture = detailfly.select("[class=inl departure] p");//实际起飞--文字
sBuffer.append(commonIsNull(inldeparture)==""?"":commonIsNull(inldeparture)+":");
Elements inldepartureTime = detailfly.select("[class=inl departure] [class=time]");//实际起飞--时间
sBuffer.append(commonIsNull(inldepartureTime)+",");
Elements inldeparturegray = detailfly.select("[class=inl departure] [class=gray]");
sBuffer.append(commonIsNull(inldeparturegray)+",");
//当前飞机状态
Elements inlbetween = detailfly.select("[class=inl between]");
sBuffer.append(commonIsNull(inlbetween)==""?"":"当前飞机状态:"+commonIsNull(inlbetween)+",");
//目的地信息
Elements inlarrive = detailfly.select("[class=inl arrive] p");
sBuffer.append(commonIsNull(inlarrive)==""?"":commonIsNull(inlarrive)+":");//预计到达
Elements inlarriveTime = detailfly.select("[class=inl arrive] [class=time]");
sBuffer.append(commonIsNull(inlarriveTime)+",");//预计到达时间
Elements inlarrivegray = detailfly.select("[class=inl arrive] [class=gray]");
sBuffer.append(commonIsNull(inlarrivegray)+",");//计划到达 文字+时间 //路线详情
Elements detailroute = flightDetail.select("[class=detail-fly detail-route]");
Elements routeinldeparture = detailroute.select("[class=inl departure]");
sBuffer.append(commonIsNull(routeinldeparture)==""?"":"出发地信息:"+commonIsNull(routeinldeparture)+",");//出发地信息 机场、天气情况
//Elements routegray = routeinldeparture.select("[class=f12] [class=gray ml5]");
//sBuffer.append(commonIsNull(routegray)==""?"":"出发地天气:"+commonIsNull(routegray)+",");//出发地 天气
Elements routeinlbetween = detailroute.select("[class=inl between]").select("p");//飞行数据
sBuffer.append(commonDoubleIsNull(routeinlbetween)==""?"":"飞行数据:"+commonDoubleIsNull(routeinlbetween)+",");
Elements routeinlarrive = detailroute.select("[class=inl arrive]");//目的地信息 机场、天气情况
sBuffer.append(commonIsNull(routeinlarrive)==""?"":"目的地信息:"+commonIsNull(routeinlarrive)+","); //附加信息 值机柜台、登机口、行李转盘
Elements additionalDetail = doc.select("[class=detail-info] [class=operation]");
Elements operation = additionalDetail.select("[class=item]");
sBuffer.append(commonDoubleIsNull(operation)==""?"":"附加信息:"+commonDoubleIsNull(operation)); if(StringUtils.isNotEmpty(sBuffer.toString().replaceAll(",","").replaceAll(" ","").replaceAll("机场攻略","")
.replaceAll(":",""))){
//System.out.println(sBuffer.toString().replaceAll("机场攻略",""));
return sBuffer.toString().replaceAll("机场攻略","");
}else{
return null;
}
} //单个拼接
public static String commonIsNull(Elements elements) {
try {
if(null != elements){
if(null != elements.get(0)){
return elements.get(0).text();
}
}
return "";
} catch (Exception e) {
return "";
}
} //多个字符串拼接 适合 多个 class=aaa
public static String commonDoubleIsNull(Elements elements) {
try {
StringBuilder sBuilder = new StringBuilder();
if(null != elements){
for (int i = 0; i < elements.size(); i++) {
if(null != elements.get(i)){
sBuilder.append(elements.get(i).text());
}
}
}
return sBuilder.toString();
} catch (Exception e) {
return "";
}
} public static void main(String[] args) {
try {
//System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
System.out.println(findFlightByFlightCode("CA1815"));;
//System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
} catch (SdcxException e) {
System.out.println(e.getMessage());
}
}
爬取去哪儿航班信息代码
import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import com.jdkeji.sdcx.common.exceptions.SdcxException; /**
* 去哪儿 爬取航班动态工具类 只能查询今日数据
* @Description:
* @author:haoqingshuang
* @CreatTime:2017年10月10日
*
*/
public class QnFlightUtil { public static Document getDocument(String url) throws SdcxException{
try {
return Jsoup.connect(url).get();
} catch (IOException e) {
throw new SdcxException("获取航班信息异常,请自行查询航班数据!");
}
} //单个拼接
public static String commonIsNull(Elements elements) {
try {
if(null != elements){
if(null != elements.get(0)){
return elements.get(0).text();
}
}
return "";
} catch (Exception e) {
return "";
}
} //多个字符串拼接 适合 多个 class=aaa
public static String commonDoubleIsNull(Elements elements) {
try {
StringBuilder sBuilder = new StringBuilder();
if(null != elements){
for (int i = 0; i < elements.size(); i++) {
if(null != elements.get(i)){
sBuilder.append(elements.get(i).text());
}
}
}
return sBuilder.toString();
} catch (Exception e) {
return "";
}
} public static String findFlightByFlightCode(String FlightNumber) throws SdcxException{
StringBuilder sBuffer = new StringBuilder();
if(StringUtils.isEmpty(FlightNumber)){
throw new SdcxException("请输入航班号!");
}
Document doc = getDocument("http://flight.qunar.com/status/fquery.jsp?flightCode="+FlightNumber.trim());
if(null == doc){
throw new SdcxException("网络异常,请稍后再试!");
}
Elements flightDetail = doc.select("[class=state_detail]"); sBuffer.append(commonDoubleIsNull(flightDetail)==""?"":commonDoubleIsNull(flightDetail)); if(StringUtils.isNotEmpty(sBuffer.toString().replaceAll(",","").replaceAll(" ","").replaceAll("相关航班","")
.replaceAll(":",""))){
return sBuffer.toString().replaceAll("相关航班","");
}else{
return null;
}
} public static void main(String[] args) {
try {
//System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
System.out.println(findFlightByFlightCode("HU7835"));;
//System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
} catch (SdcxException e) {
System.out.println(e.getMessage());
}
}
}
测试例子
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements; public class TestJsoup { public Document getDocument (String url){
try {
return Jsoup.connect(url).get();
} catch (IOException e) {
e.printStackTrace();
}
return null;
} public static void main(String[] args) {
TestJsoup t = new TestJsoup();
Document doc = t.getDocument("http://www.weather.com.cn/html/weather/101280101.shtml");
// 获取目标HTML代码
Elements elements1 = doc.select("[class=sky skyid lv2 on]");
// 今天
Elements elements2 = elements1.select("h1");
String today = elements2.get(0).text();
System.out.println(today);
// 天气情况
Elements elements3 = elements1.select("[class=wea]");
String number = elements3.get(0).text();
System.out.println(number);
// 高的温度
Elements elements5 = elements1.select("[class=tem]");
Elements elements9 = elements5.select("span");
String highTemperature = elements9.get(0).text()+"°C";
System.out.println(highTemperature);
// 低的温度
Elements elements10 = elements5.select("i");
String lowTemperature = elements10.get(0).text()+"°C";
System.out.println(lowTemperature);
// 风力
Elements elements6 = elements1.select("[class=win] i");
String wind = elements6.get(0).text();
System.out.println(wind);
} }
例子网站
http://www.cnblogs.com/xiaoMzjm/p/3899366.html
java爬取航班实时数据的更多相关文章
- Java爬取同花顺股票数据(附源码)
最近有小伙伴问我能不能抓取同花顺的数据,最近股票行情还不错,想把数据抓下来自己分析分析.我大A股,大家都知道的,一个概念火了,相应的股票就都大涨. 如果能及时获取股票涨跌信息,那就能在刚开始火起来的时 ...
- Java 爬取 51job 数据 WebMagic实现
Java 爬取 51job 数据 一.项目Maven环境配置 相关依赖 jar 包配置 <parent> <groupId>org.springframework.boot&l ...
- Java实现爬取京东手机数据
Java实现爬取京东手机数据 最近看了某马的Java爬虫视频,看完后自己上手操作了下,基本达到了爬数据的要求,HTML页面源码也刚好复习了下,之前发布两篇关于简单爬虫的文章,也刚好用得上.项目没什么太 ...
- Java爬取校内论坛新帖
Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...
- Python爬取招聘网站数据,给学习、求职一点参考
1.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于“数据”方面的人才需求也在不断增大.因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于 ...
- Scrapy 通过登录的方式爬取豆瓣影评数据
Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...
- MinerHtmlThread.java 爬取页面线程
MinerHtmlThread.java 爬取页面线程 package com.iteye.injavawetrust.miner; import org.apache.commons.logging ...
- MinerConfig.java 爬取配置类
MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner; import java.util.List; /** * 爬取配置类 * @ ...
- selenium跳过webdriver检测并爬取天猫商品数据
目录 简介 编写思路 使用教程 演示图片 源代码 @(文章目录) 简介 现在爬取淘宝,天猫商品数据都是需要首先进行登录的.上一节我们已经完成了模拟登录淘宝的步骤,所以在此不详细讲如何模拟登录淘宝.把关 ...
- Java爬取网络博客文章
前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...
随机推荐
- centos7 最小化安装yum不能安装软件解决方案
慕课网神思者老师课常资料带的布署工具中,自带的liunx 系统centos7 yum发现不能安装软件,比如docker 解决方案 首先我们安装好虚拟机启动系统centos7 尝试安装任何软件都会报 ...
- 我用Awesome-Graphs看论文:解读X-Stream
X-Stream论文:<X-Stream: Edge-centric Graph Processing using Streaming Partitions> 前面通过文章<论文图谱 ...
- 使用PasteSpider实现类似Jenkins的功能,让你的2G服务器也可以飞起
或许你接触过Jenkins, 在我理解就是拉取源码,然后构建成镜像,最后启动容器! 但是这个功能对于小内存的服务器来说就是奢望了! 今天介绍一个新版本,把你这个遗憾弥补下! 在PasteSpider中 ...
- PVE linux_VM 扩容分区
页面 调整磁盘大小 手动分区 fdisk -l fdisk /dev/sda 对该磁盘进行分区, 输入n并回车,n是"new"新建分区 [root@localhost ~]# fd ...
- python报错:`visualize_sharding` requires `rich` to be installed.
Rich是python的一个绘图library,需要手动安装. 解决方法: pip install Rich
- 强化学习:连续控制问题中Actor-Critic算法的linear baseline
最近在看连续控制问题,看到了一个Actor-Critic算法中手动扩展features和设置linear baseline的方法,这些方法源自论文:<Benchmarking Deep Rein ...
- 代码随想录Day8
344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 \(O(1)\) 的额外空间解决 ...
- 亚信科技基于 Apache SeaTunnel 的二次开发应用实践
亚信科技在Apache SeaTunnel的实践分享 自我介绍 各位同学好,很荣幸通过Apache SeaTunnel社区和大家进行分享交流.我是来自亚信科技的潘志宏,主要负责公司内部数据中台产品的开 ...
- Sy.ExpressionBuilder 动态查询新体验
省流模式,看下对比 //常规查询 var query = users .WhereIf(m => m.UserName.Contains(input.UserName), !string.IsN ...
- SMU Autumn 2023 Round 5
SMU Autumn 2023 Round 5 A. Everyone Loves to Sleep 把时间都转成分钟,然后存起来,二分找到离他睡觉点最近的一个时间段,减去他的睡觉点,如果最近的在第二 ...