问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

XxlCrawler实战:从FlightAware抓取ICAO代码

创作时间:
2025-01-21 16:58:20
作者:
@小白创作中心

XxlCrawler实战:从FlightAware抓取ICAO代码

飞机出行是长距离旅行或出差的必备方式,登机牌上包含的重要信息之一就是航空公司的ICAO三字码。本文将介绍如何使用XxlCrawler抓取全球航空公司ICAO三字码,并提供两种不同的数据解析方式。

数据源介绍

目标网站

本文选择从航班追踪网站FlightAware获取实时航班对应的航空公司信息。在浏览器中打开目标网站,点击航空公司列表,可以看到包含航空公司ICAO码和英文名称的页面。

页面渲染结构

通过查看网页的调试信息,可以发现数据渲染的层次结构:从最顶层的pageContainer,到下级的prettyTable,再到表格中的tbody、tr和td。我们需要遍历td元素以获取所需数据。

XxlCrawler信息获取

创建XxlCrawler对象

在进行信息抓取前,需要定义抓取对象:

private static final String GET_ICAO_URL = "https://zh.flightaware.com/live/fleet/";
private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36";

XxlCrawler crawler = new XxlCrawler.Builder()
    .setUrls(GET_ICAO_URL)
    .setAllowSpread(false)
    .setThreadCount(3)
    .setPauseMillis(2000)
    .setUserAgent(USER_AGENT)
    .setIfPost(false)
    .setFailRetryCount(3)
    .setPageParser(new PageParser<PageVo>() {
        @Override
        public void parse(Document html, Element pageVoElement, PageVo pageVo) {
            printVo(pageVo);
        }
    }).build();

这里设置为只爬取目标页面一次,不进行扩散抓取。

定义PageVo对象

PageVo对象用于网页数据的解析:

@PageSelect(cssQuery = ".pageContainer .prettyTable >tbody")
@Data
public static class PageVo {
    @PageFieldSelect(cssQuery = ">tr >td:eq(0)")
    private List<String> flightsNum;
    
    @PageFieldSelect(cssQuery = ">tr >td:eq(1)")
    private List<String> icaoCode;
    
    @PageFieldSelect(cssQuery = ">tr >td:eq(2)")
    private List<String> airline;
}

这里定义了三个属性分别保存航班数、ICAO代码和航空公司英文名称。

直接PageVO解析

通过定义PageVO对象,可以实现属性的自助解析:

protected void printVo(PageVo pageVo) {
    System.out.println(pageVo);
    System.out.println(pageVo.getFlightsNum().size());
    System.out.println(pageVo.getFlightsNum());
    System.out.println(pageVo.getAirline().size());
    System.out.println(pageVo.getAirline());
    System.out.println(pageVo.getIcaoCode().size());
    System.out.println(pageVo.getIcaoCode());
    for (int i = 0; i < pageVo.getFlightsNum().size(); i++) {
        System.out.println("航班数:" + pageVo.getFlightsNum().get(i) + "\t ICAO代码:" + pageVo.getIcaoCode().get(i)
                + "\t 航空英文名称:" + pageVo.getAirline().get(i));
    }
}

运行代码可以看到相关信息已被成功爬取。

自定义解析

如果单元格较多,可以使用自定义解析模式:

protected void printElementVo(Element pageVoElement) {
    List<AirlineVo> airlineList = new ArrayList<>();
    for (int i = 0; i < pageVoElement.childrenSize(); i++) {
        Element childElement = pageVoElement.child(i);
        String flightsNum = childElement.child(0).text();
        String icao = childElement.child(1).text();
        String airline = childElement.child(2).text();
        System.out.println("航班数:" + flightsNum + "\t ICAO代码:" + icao + "\t 航空英文名称:" + airline);
        airlineList.add(new AirlineVo(flightsNum, icao, airline));
    }
    ExcelUtil<AirlineVo> util = new ExcelUtil<>(AirlineVo.class);
    util.exportExcel(airlineList, "全球航空公司ICAO代码表-20240514");
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AirlineVo {
    @Excel(name = "航班数")
    private String flightsNum;
    
    @Excel(name = "icao代码")
    private String icaoCode;
    
    @Excel(name = "航空公司英文名称")
    private String airlineEn;
}

最后将抓取的信息列表保存到Excel表格中。

总结

本文介绍了使用XxlCrawler抓取全球航空公司ICAO三字码的方法,提供了两种数据解析方式,并将结果保存为Excel文件。通过本文,读者可以掌握数据抓取和解析的基本技巧,为数据处理和信息获取提供实用的解决方案。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号