当前位置: 首页 > news >正文

使用XxlCrawler抓取全球航空公司ICAO三字码

目录

前言

一、数据源介绍

1、目标网站

2、页面渲染结构

二、XxlCrawler信息获取

1、创建XxlCrawler对象

2、定义PageVo对象

3、直接PageVO解析

4、自定义解析

总结


前言

        长距离旅行或者出差,飞机一定是出行的必备方式。对于旅行达人或者出差人员而言,登机牌也是随身之物。还记得我第一次坐飞机出行的时候,相当激动,第一次在飞机上看祖国的大好河山,有一种豪迈的既视感。有点扯远了,不知道大家出行的时候有没有认真的研究一下登机牌。登机牌上都有什么信息呢。这里从网上贴一张别人的登机牌,我们来看一下。

        在上面这张机票包含了一些重要的信息,以大木航为例,承运人:MU,航班:MU。这个MU表示的是什么呢?MU是航空公司的二字码,官方名字IATA,国际航空运输协会 (International Air Transport Association,IATA) 是一个由世界各国航空公司所组成的大型国际组织,其前身是1919年在海牙成立并在二战时解体的国际航空业务协会。MU是这个协会给中国东方航空的一个唯一身份码。

        就像我们的身份证一样,与IATA码有一点区别的是ICAO码。相对于IATA码,ICAO一般老百姓接触的比较少。因为ICAO是国际民航组织(International Civil Aviation Organization,缩写为ICAO,是协调世界各国政府在民用航空领域内各种经济和法律事务、制定航空技术国际标准的重要组织。ICAO主要用于安全保卫或空防安全活动,实施国际民航组织通信、导航、监视/空中交通管制系统,简化手续、统计、技术合作、培训等。简单一点说,就是航空管控、导航方面,一般通用的是ICAO码。而MU对应的ICAO码是CES。这个信息可以从东航官网上可以查到。

         那么全球有哪些航空公司,他们的ICAO码又是什么呢?本文通过从航班追踪网站flightaware,获取实时的航班对应的航空公司信息。本文介绍一种基于XxlCrawler的信息抓取技术,自动从网站上获取全球的航空公司信息,同时分享两种不同的数据解析方式,最后将获取的信息保存为Excel,通过本文不仅可以获取ICAO的数据,同时掌握两种数据解决方法。如果您当前对数据处理有需求,可以看看本文是否有帮助。

一、数据源介绍

        当然,想获取ICAO数据不一定要从飞行跟踪网站上获取,这里只提供一种数据源。某度和某哥都可以拿到完整的ICAO数据。本节将对飞行网站上的数据进行简单说明,为下一步我们来进行数据抓取奠定基础。

1、目标网站

        在个人浏览器中打开目标网站的地址,查看实时航班。然后点击航空公司列表,可以看到下面的页面:

        在上面的页面中其实就包含了我们需要的航空公司ICAO码,以及对应航空公司的英文名称。比如CES China Eastern "China Eastern" (China) 就表示中国东方航空。

2、页面渲染结构

        在获取了网站展示页面之后,我们可以来看看具体的数据,打开网页的调试功能,可以看到如下的信息:

        请注意图中红色框标记的地方,从最顶层的pageContainer,到下级prettyTable,然后是表格中的tbody再到tr,最后是td没一行。通过遍历td即是我们需要的数据。因此我们要解析的就是获取tr的集合,然后遍历下面的td,第一个td的文本值是航班数,第二个就是ICAO代码,第三个是航空公司的英文名称。 

        上面的知识一定要了解,这是下面章节的前提条件。

二、XxlCrawler信息获取

        在了解了信息渲染的对象和网页层次之后,我们就可以采用熟悉的XxlCrawler来进行全球航空公司列表及ICAO代码获取实战。本节主要讲述如何进行代码开发,同时讲述两种页面解析模式,实际生产中,可以按照自己的需要进行灵活处理。

1、创建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)// 允许扩散爬取,将会以现有URL为起点扩散爬取整站,这里爬一个页面,不允许扩散.setAllowSpread(false).setThreadCount(3).setPauseMillis(2000).setUserAgent(USER_AGENT)//设置user_agent.setIfPost(false).setFailRetryCount(3)// 重试三次.setPageParser(new PageParser<PageVo>() {@Overridepublic void parse(Document html, Element pageVoElement, PageVo pageVo) {// 解析封装 PageVo 对象// String pageUrl = html.baseUri();//第一种方式:使用自助解析,实现更加灵活的模式// printElementVo(pageVoElement);//第二种方式:使用pageVO的方式解析printVo(pageVo);// System.out.println(pageUrl + ":" + pageVo.toString());}
}).build();

          需要说明的是,这里只需要对目标页面爬取一次,因此不需要进行扩散抓起,否则速度会很慢,相当于自我发现地址,同时还要实现抓取。这里通过.setAllowSpread(false) 就可以防止这种操作。

2、定义PageVo对象

        pageVo对象用于网页数据的解析,这里我们可以将数据过滤到tbody,然后剩下的解析到属性中,这是一种防范,另一种方法是通过自定义解析。不管用那种解析,都需要对数据进行第一次解析,也就是pageVO的定义。下面来看一下PageVo对象怎么定义:

@PageSelect(cssQuery = ".pageContainer .prettyTable >tbody")
@Data
public static class PageVo {/*** 实时航班数*/@PageFieldSelect(cssQuery = ">tr >td:eq(0)")private List<String> flightsNum;/*** ICAO代号*/@PageFieldSelect(cssQuery = ">tr >td:eq(1)")private List<String> icaoCode;/*** 航空公司(英文)*/@PageFieldSelect(cssQuery = ">tr >td:eq(2)")private List<String> airline;
}

        这里为了解析方便,同时在解析时,自动创建三个数组,分别用来保存第一个到最后一个td中的值。前文提过,三个值分别代表航班数、icao代码、航空公司英文名称。使用这种直接解析成数组的方式呢,优缺点都有。优点就是不需要再进行第二次解析,缺点就是,如果有多个td就得定义多个数组去接收,比较繁琐。这里暂时不提自定义解析,先把这种固定模板的解析模式讲解完。

3、直接PageVO解析

        通过定义PageVO对象,同时给VO对象配置@PageFieldSelect(cssQuery = ">tr >td:eq(1)"),就可以实现属性的自助解析。这里新增一个方法,把解析之后的数据打印输出,方便观察调试结果。

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

        运行以上代码可以看到以下结果:

        通过观察控制台输出可以看到,相关信息已经被成功爬取了。 

4、自定义解析

        如果要解析的网页信息量不是很大,以表格为例,其单元格也不是很多,可以使用上面的这种注解式的解析模式,但是如果单元格比较多,我们在pageVo中需要定义多个list,这样也是比较麻烦的。这里分享一种自定义解析模式,自己根据xpath去解析网页,获取数据。

        与注解解析模式原理差不多,自定义解析是根据网页的变化,自动根据网页结构解析内容,保存到相关集合中。

protected void printElementVo(Element pageVoElement) {System.out.println(pageVoElement);System.out.println(pageVoElement.childrenSize());List<AirlineVo> airlineList = new ArrayList<TestZhFlightawareCase.AirlineVo>();for (int i = 0; i < pageVoElement.childrenSize(); i++) {Element childElement = pageVoElement.child(i);// System.out.println(childElement.childrenSize());int childrenSize = childElement.childrenSize();System.out.println(childrenSize);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));}// excel工具包ExcelUtil<AirlineVo> util = new ExcelUtil<AirlineVo>(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表格中。当然,您也可以根据需要,把数据保存到业务数据库中,这里暂且不表。

        在数据解析之前,可以先拿到抓取的tbody信息,然后再来解析到具体的数据存储对象中。最后是解析的数据打印信息:

航班数:413	 ICAO代码:AAL	 航空英文名称:American Airlines "American"
航班数:409	 ICAO代码:DAL	 航空英文名称:Delta "Delta"
航班数:387	 ICAO代码:UAL	 航空英文名称:United "United"
航班数:309	 ICAO代码:SWA	 航空英文名称:Southwest "Southwest" (Dallas, TX)
航班数:290	 ICAO代码:CSN	 航空英文名称:China Southern Airlines "China Southern" (China)
航班数:272	 ICAO代码:RYR	 航空英文名称:Ryanair "Ryanair" (Ireland)
航班数:236	 ICAO代码:CES	 航空英文名称:China Eastern "China Eastern" (China)
航班数:213	 ICAO代码:CCA	 航空英文名称:Air China "Air China" (China)
航班数:156	 ICAO代码:IGO	 航空英文名称:IndiGO "IFLY" (New Delhi)

        最后到工程文件中看一下是否成功生成了excel文件,在工程目录下有一个download目录,在这个目录中可以看到已经生成了对应的excel文件。

        打开Excel看看是不是我们想要的数据, 

        通过上图可以看到,与我们的预期是一致的,已经成功的全球航空公司的名称、航班数、ICAO代码都保存到了Excel中。 

总结

        以上就是本文的主要内容,本文介绍一种基于XxlCrawler的信息抓取技术,自动从网站上获取全球的航空公司信息,同时分享两种不同的数据解析方式,最后将获取的信息保存为Excel,通过本文不仅可以获取ICAO的数据,同时掌握两种数据解决方法。如果您当前对数据处理有需求,可以看看本文是否有帮助。全球航空公司ICAO数据可以在评论区留言获取哦。以后有机会可以把航空公司跟国家等关联起来,就可以知道哪个是航空大国。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,万分感谢。

相关文章:

使用XxlCrawler抓取全球航空公司ICAO三字码

目录 前言 一、数据源介绍 1、目标网站 2、页面渲染结构 二、XxlCrawler信息获取 1、创建XxlCrawler对象 2、定义PageVo对象 3、直接PageVO解析 4、自定义解析 总结 前言 长距离旅行或者出差&#xff0c;飞机一定是出行的必备方式。对于旅行达人或者出差人员而言&…...

Java String转JSONObject时保持字段顺序不变

Java String转JSONObject时保持字段顺序不变 问题背景解决方案 问题背景 在业务接口开发过程中&#xff0c;有一个新增接口&#xff0c;需要支持批量新增数据&#xff0c;这时入参就需要用到 json 格式数据&#xff0c;且包含 list 集合&#xff0c;比如这样的数据格式&#x…...

Optional用法

说明&#xff1a;Optional和Stream一样&#xff0c;是Java8引入的特性&#xff0c;本文介绍Optional的几个实际用法。Steam流使用&#xff0c;参考下面这篇文章&#xff1a; Stream流使用 使用 1.保证值存在 // 1.保证值存在&#xff0c;pageNumber&#xff0c;pageSizeInte…...

【观成科技】加密C2框架Xiebro流量分析

一、工具介绍 Xiebro是由Golang和 .NET编写&#xff0c;提供支持的多人和多服务器 C2/后开发框架。它支持多种通信协议&#xff0c;包括TCP、websocket等&#xff0c;并且在客户端与Xiebro服务器之间的通信通常采用AES加密来保障安全性和隐蔽性。 二、工具原理分析 Xiebro C…...

【八大排序算法】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序

文章目录 一、排序的相关概念二、排序类型三、排序算法实现插入排序1.直接插入排序2.希尔排序 选择排序3.简单选择排序4.堆排序 交换排序5.冒泡排序6.快速排序递归实现非递归实现 7.归并排序递归实现非递归实现 8.计数排序 四、总结 一、排序的相关概念 排序&#xff1a;根据数…...

Flutter 中的 CupertinoActionSheet 小部件:全面指南

Flutter 中的 CupertinoActionSheet 小部件&#xff1a;全面指南 在Flutter中&#xff0c;CupertinoActionSheet是用于在iOS风格的应用中显示动作面板的组件。它提供了一个简洁的界面&#xff0c;让用户可以快速从一组选项中做出选择。CupertinoActionSheet通常伴随着一个或多…...

IDEA 好用的插件

图标插件&#xff1a;Atom Material Icons 此插件的作用就是更好的显示各种文件的类别&#xff0c;使之一目了然 汉化包 Chinese ​(Simplified)​ Language Pack / 中文语言包 作用就是 汉化 AI编码助手 GitHub Copilot AI编码助手&#xff1a;提示代码很好用 缺点&#xff1a…...

leetcode——链表的中间节点

876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 链表的中间节点是一个简单的链表OJ。我们要返回中间节点有两种情况&#xff1a;节点数为奇数和节点数是偶数。如果是奇数则直接返回中间节点&#xff0c;如果是偶数则返回第二个中间节点。 这道题的解题思路是&a…...

稳定网络的诀窍:静态住宅代理解决方案

在数字化时代&#xff0c;网络稳定性对于个人和企业都至关重要。然而&#xff0c;由于多种因素的影响&#xff0c;如地理位置、网络拥堵或网络安全问题等&#xff0c;网络稳定性常常受到挑战。为了应对这些挑战&#xff0c;静态住宅代理作为一种高效且可靠的网络解决方案&#…...

VACode 创建Vue项目完整过程

一、软件下载 VSCode官网下载地址&#xff1a;https://code.visualstudio.com/ 二、下载开发环境 1. 安装 [Node.js](https://nodejs.org/)&#xff1b; 2. 安装 [npm](https://www.npmjs.com/) 依赖管理工具&#xff1b; 注&#xff1a;node.js安装完后会同步安装npm,一般…...

【C++】详解C++的模板

目录 概念 ​编辑 语法 函数模板 类模板 非类型模板参数 模板的特化 函数模板特化 类模板特化 全特化 偏特化 分离编译 概念 模板是C中非常厉害的设计&#xff0c;模板把通用的逻辑剥离出来&#xff0c;让不同的数据类型可以复用同一种模板的逻辑&#xff0c;甚至可以…...

1146 -Table ‘performance schema.session variables‘ doesn‘t exist的错误解决

一、问题出现 今天在本地连数据库的时候&#xff0c;发现这个问题&#xff0c;哎呦我擦&#xff0c;差点吓死了 二、解决办法 1&#xff09;找文件 用everything搜一下MySQL Server 5.7 然后去Windows服务找一下MySQL配置文件的具体路径 如果知道那最好&#xff0c;不知道那…...

练习题(2024/5/13)

1移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; …...

LeetCode—设计循环队列(两种方法)

1.题目 2.思路一&#xff08;数组&#xff09; 通过数组进行模拟&#xff0c;通过操作数组的索引构建一个虚拟的首尾相连的环。再循环队列结构中&#xff0c;设置一个队首head和队尾tail&#xff0c;数组的大小固定为k。 初步分析&#xff1a;存在缺陷 改善假溢出问题&#…...

python “名称空间和作用域” 以及 “模块的导入和使用”

七、名称空间和作用域 可以简单理解为存放变量名和变量值之间绑定关系的地方。 1、名称空间 在 Python 中有各种各样的名称空间&#xff1a; 全局名称空间&#xff1a;每个程序的主要部分定义了全局的变量名和变量值的对应关系&#xff0c;这样就叫做全局名称空间 局部名称…...

Pycharm导入自定义模块报红

文章目录 Pycharm导入自定义模块报红1.问题描述2.解决办法 Pycharm导入自定义模块报红 1.问题描述 Pycharm 导入自定义模块报红&#xff0c;出现红色下划线。 2.解决办法 打开【File】->【Setting】->【Build,Execution,Deployment】->【Console】->【Python Con…...

LLMs之KG-RAG:KG-RAG(基于知识图谱的RAG系统)的简介(可以解决多跳问题/同时支持结构化和非结构化数据查询)、经验技巧、案例应用之详细攻略

LLMs之KG-RAG&#xff1a;KG-RAG(基于知识图谱的RAG系统)的简介(可以解决多跳问题/同时支持结构化和非结构化数据查询)、经验技巧、案例应用之详细攻略 背景痛点&#xff1a;传统的基于向量相似度检索的RAG模型回答多环(多步)问题的能力有限&#xff0c;无法同时处理来自多个文…...

综合模型及应用(图论学习总结部分内容)

文章目录 前言六、综合模型及应用(以题目总结为主)分层图思想(包括拆点建图) e g 1 : 通信线路 eg1:通信线路 eg1:通信线路​​​[A-Telephone Lines](https://ac.nowcoder.com/acm/contest/1055/A)(蓝书例题) e g 2 : 小雨坐地铁 eg2:小雨坐地铁 eg2:小雨坐地铁​ [1012-小雨坐…...

2025考研专业课、英语、数学、政治视频大全,整理全了!

考研季又到了&#xff0c;备考的小伙伴们&#xff0c;你们准备好了吗&#xff1f; 时间管理 考研是一场与时间的赛跑&#xff0c;合理安排时间&#xff0c;让复习更高效&#xff01; - 制定详细的学习计划&#xff0c;每天、每周、每月都有明确目标 - ‍♂️ 保持一定的学习…...

设计模式之策略模式(一)

背景: 下单时有很多情况,有的是用户下单,有的是卡密下单,有的是下游下单,有的是需要唤起支付,有的不需要支付,这样就需要写很多下单接口,下面使用策略模式优化这种情况 代码结构 com.example.order ├── controller │ └── OrderController.java ├── service │ …...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...