使用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>() {
			@Override
			public 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数据可以在评论区留言获取哦。以后有机会可以把航空公司跟国家等关联起来,就可以知道哪个是航空大国。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,万分感谢。

  • 60
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 69
    评论
### 回答1: 航空公司代码 JSON(JavaScript Object Notation)是一种用于存储和交换数据的轻量级数据格式。它使用易于阅读和编写的文本格式,并且在不同编程语言和平台之间具有很好的互操作性。 在航空业中,航空公司代码是用于唯一标识不同航空公司的字母或数字组合。每个航空公司都有一个独特的代码,这有助于航空公司在各个系统和平台上进行唯一识别和标识。 航空公司代码 JSON可以通过以下格式进行表示: { "airlines": [ { "code": "AA", "name": "American Airlines" }, { "code": "DL", "name": "Delta Air Lines" }, { "code": "UA", "name": "United Airlines" }, ... ] } 上述JSON示例中,"airlines"是一个数组,每个元素都代表一个航空公司。每个航空公司包含两个属性:"code"表示航空公司的代码,"name"表示航空公司的名称。 通过使用航空公司代码JSON,航空公司的相关信息可以被方便地存储和读取。这对于机票预订系统、航班查询系统和航空公司合作伙伴之间的数据交换等领域非常有用。 总之,航空公司代码JSON提供了一种方便的数据交换格式,可用于存储和传输航空公司代码和相关信息。它具有易用性和广泛的兼容性,为航空业的数据管理和信息交流带来了便利。 ### 回答2: 航空公司代码 JSON是一种用于存储和传输航空公司代码信息的数据格式。JSON是JavaScript Object Notation的缩写,它通过键值对的方式来表示数据。 在航空领域,航空公司代码是为了方便识别和区分不同的航空公司而定义的一种标识符。每个航空公司都有一个唯一的代码,通常由两个字母组成。这些代码在机票预订、机场操作、航班运行等方面都有广泛的应用。 使用JSON格式来存储航空公司代码的信息可以提供灵活的数据交换和解析方式。JSON的语法简单易懂,具有良好的扩展性,非常适合用于描述航空公司代码的信息。 一个典型的航空公司代码JSON文件可能如下所示: ``` { "airlines": [ { "name": "中国国际航空", "code": "CA" }, { "name": "美国联合航空", "code": "UA" }, { "name": "新加坡航空", "code": "SQ" }, ... ] } ``` 在这个JSON文件中,我们使用了一个名为"airlines"的数组来存储多个航空公司的信息。每个航空公司由"name"和"code"两个键值对组成,分别表示航空公司的名称和代码。 通过使用JSON格式,我们可以轻松地读取和解析航空公司代码的信息。例如,我们可以使用JavaScript或其他编程语言来读取JSON文件,并获取特定航空公司的代码。 总之,航空公司代码JSON提供了一种方便、可扩展和易于解析的数据格式,方便存储和传输航空公司代码信息。它在航空领域中具有广泛的应用,为机票预订、航班运行等方面的操作提供了便利。 ### 回答3: 航空公司代码 json 是一个存储航空公司代码信息的数据文件,它使用 JSON 格式进行存储和交互。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人们阅读和编写,也易于机器解析和生成。航空公司代码 json 文件中通常包含航空公司的名称、IATA代码(国际航空运输协会代码)和ICAO代码(国际民航组织代码)。 航空公司代码 json经常被航空业务相关的软件和网站使用,例如旅行预订系统、机票查询网站等。开发这些软件和网站时,可以使用航空公司代码 json 来获取航空公司的详细信息,如名称和代码。这些信息对于预订机票、确认航班和行李规定等操作非常有用。 在航空公司代码 json 文件中,每个航空公司的信息通常以一个对象表示。对象中的键值对定义了航空公司的属性,例如"name"表示航空公司的名称,"iataCode"表示其IATA代码,"icaoCode"表示其ICAO代码。通过解析航空公司代码 json,我们可以获得所有航空公司的名称和代码,方便在航空业务中使用。 总之,航空公司代码 json 是一个用于存储和交换航空公司代码信息的数据文件,它使用 JSON 格式,并包含航空公司的名称、IATA代码和ICAO代码。它在航空业务相关的软件和网站中被广泛应用,用于获取航空公司的详细信息和进行相应操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜郎king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值