java爬取航班实时数据 -- 逼格提升之路
之前的代码由于时间有限 怎么快怎么开发 不利于后期扩展 今天闲来无事 优化代码 提升逼格 直接上代码
1.抽取出航班实体 请忽略getFlightJsonobject()方法
import org.apache.commons.lang.StringUtils; import net.minidev.json.JSONObject; /** * 航班实体类 * @Description: * @author:haoqingshuang * @CreatTime:2017年10月13日 */ public class Flight { //航空公司 private String flightCompay; //航班号 private String flightCode; //预计起飞时间 private String planFlyTime; //实际起飞时间 private String actualFlyTime; //出发地 private String setoutAddress; //航班状态 private String flightStatus; //预计到达时间 private String playArriveTime; //实际到达时间 private String actualArriveTime; //目的地 private String arriveAddres; //准点率 private String punctualityRate; //飞行数据 飞行时长、飞行里程 private String flyData; //飞行附加信息 行李转盘、值机柜台、行李转盘等 private String flyAdditional; //携返回json格式数据 app使用 携程 public JSONObject getFlightJsonobject(){ JSONObject jobject = new JSONObject(); jobject.put("实际起飞",this.actualFlyTime); jobject.put("计划起飞",StringUtils.isNotEmpty(this.planFlyTime)==false?"":this.planFlyTime.replaceAll("计划起飞","")); jobject.put("当前飞机状态",this.flightStatus); jobject.put("实际到达",this.actualArriveTime); jobject.put("计划到达",StringUtils.isNotEmpty(this.playArriveTime)==false?"":this.planFlyTime.replaceAll("计划到达","")); jobject.put("出发地",this.setoutAddress); jobject.put("目的地",this.arriveAddres); jobject.put("航空公司",this.flightCompay); jobject.put("航班号",this.flightCode); jobject.put("准点率",this.punctualityRate); return jobject; } public String getFlightCompay() { return flightCompay; } public void setFlightCompay(String flightCompay) { this.flightCompay = flightCompay; } public String getFlightCode() { return flightCode; } public void setFlightCode(String flightCode) { this.flightCode = flightCode; } public String getPlanFlyTime() { return planFlyTime; } public void setPlanFlyTime(String planFlyTime) { this.planFlyTime = planFlyTime; } public String getActualFlyTime() { return actualFlyTime; } public void setActualFlyTime(String actualFlyTime) { this.actualFlyTime = actualFlyTime; } public String getSetoutAddress() { return setoutAddress; } public void setSetoutAddress(String setoutAddress) { this.setoutAddress = setoutAddress; } public String getFlightStatus() { return flightStatus; } public void setFlightStatus(String flightStatus) { this.flightStatus = flightStatus; } public String getPlayArriveTime() { return playArriveTime; } public void setPlayArriveTime(String playArriveTime) { this.playArriveTime = playArriveTime; } public String getActualArriveTime() { return actualArriveTime; } public void setActualArriveTime(String actualArriveTime) { this.actualArriveTime = actualArriveTime; } public String getArriveAddres() { return arriveAddres; } public void setArriveAddres(String arriveAddres) { this.arriveAddres = arriveAddres; } public String getPunctualityRate() { return punctualityRate; } public void setPunctualityRate(String punctualityRate) { this.punctualityRate = punctualityRate; } public String getFlyData() { return flyData; } public void setFlyData(String flyData) { this.flyData = flyData; } public String getFlyAdditional() { return flyAdditional; } public void setFlyAdditional(String flyAdditional) { this.flyAdditional = flyAdditional; } }
2.优化获取航班信息工具类
1.使用缓存 将航班信息缓存下来 使用map集合 使用航班号作为主键 根据航班号获取航班信息前先去内存查询数据 如果内存map中存在该航班数据直接返回 否则查询相关网站 返回并放到缓存中
2.使用TimerTask 定时清理航班map
3.使用静态代码块 来启动清空任务 立刻执行 10分钟执行一次
代码如下:
import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Timer; import java.util.TimerTask; 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; import com.jdkeji.sdcx.common.model.Flight; import net.minidev.json.JSONObject; /** * 携程 航班爬取数据工具类 * @Description: * @author:haoqingshuang * @CreatTime:2017年9月28日 * */ public class XcFlightUtil { public static Map<String,Flight> cacheMap = new HashMap<String, Flight>(); public static Timer cacheFlightTimer; static{ clearCacheMap(); } public static synchronized Timer getFlightTimer(){ if(cacheFlightTimer == null){ return cacheFlightTimer = new Timer(); }else{ return cacheFlightTimer; } } //定时清空航班缓存数据 立即清空 10分钟 public static void clearCacheMap(){ TimerTask timertask = new java.util.TimerTask() { @Override public void run() { cacheMap.clear(); } }; Timer cacheFlightTimer = getFlightTimer(); cacheFlightTimer.schedule(timertask,0,600000); } 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 JSONObject findFlightByFlightCode(String FlightNumber) throws SdcxException{ Flight flightModel = new Flight(); if(StringUtils.isEmpty(FlightNumber)){ throw new SdcxException("请输入航班号!"); } for (String key : cacheMap.keySet()) { if(FlightNumber.equals(key)){ if(null != cacheMap.get(key)){ return cacheMap.get(key).getFlightJsonobject(); } } } String nowDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); Document doc = getDocument("http://flights.ctrip.com/actualtime/fno--"+FlightNumber.trim()+"-"+nowDate+".html"); if(null == doc){ throw new SdcxException("网络异常,请稍后再试!"); } // 航班详情 Elements flightDetail = doc.select("[class=detail-m]"); Elements detailfly = flightDetail.select("[class=detail-fly]"); Elements inldepartureTime = detailfly.select("[class=inl departure] [class=time]"); flightModel.setActualFlyTime(commonIsNull(inldepartureTime)); Elements inldeparturegray = detailfly.select("[class=inl departure] [class=gray]"); flightModel.setPlanFlyTime(commonIsNull(inldeparturegray)); Elements inlbetween = detailfly.select("[class=inl between]"); flightModel.setFlightStatus(commonIsNull(inlbetween)); Elements inlarriveTime = detailfly.select("[class=inl arrive] [class=time]"); flightModel.setActualArriveTime(commonIsNull(inlarriveTime)); Elements inlarrivegray = detailfly.select("[class=inl arrive] [class=gray]"); flightModel.setPlayArriveTime(commonIsNull(inlarrivegray)); Elements detailroute = flightDetail.select("[class=detail-fly detail-route]"); Elements routeinldeparture = detailroute.select("[class=inl departure] p"); flightModel.setSetoutAddress(commonIsNull(routeinldeparture)); Elements routeinlbetween = detailroute.select("[class=inl between]").select("p"); flightModel.setFlyData(commonIsNull(routeinlbetween)); Elements routeinlarrive = detailroute.select("[class=inl arrive] p"); flightModel.setArriveAddres(commonIsNull(routeinlarrive)); Elements additionalDetail = doc.select("[class=detail-info] [class=operation]"); Elements operation = additionalDetail.select("[class=item]"); flightModel.setFlyAdditional(commonIsNull(operation)); Elements flightT = doc.select("[class=detail-t]"); Elements flightCompany = flightT.select("[class=ml5]"); flightModel.setFlightCompay(commonIsNull(flightCompany)); Elements flightCode = flightT.select("strong"); flightModel.setFlightCode(commonIsNull(flightCode)); Elements flightPunctuality = doc.select("[class=f14 gray ml10]"); flightModel.setPunctualityRate(commonIsNull(flightPunctuality)); cacheMap.put(flightModel.getFlightCode(), flightModel); return flightModel.getFlightJsonobject(); } 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 ""; } } 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("HU7835"));; //System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date())); } catch (SdcxException e) { System.out.println(e.getMessage()); } } }

浙公网安备 33010602011771号