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;
    }
}
View Code

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());
        }
    }

}
View Code

 

posted @ 2017-10-13 17:03  不再_单纯  阅读(621)  评论(0)    收藏  举报