目录
前言
随着现在航空业的发达以及人们物质生活水平的提升,乘坐飞机出行一定是很多朋友们出行的一种方式,不要说远距离的跨国航线,连我们的祖国的天南海北,乘坐飞机出行,也是相当便利出行的。不知道各位朋友在平时的出行过程当中有没有注意观察,或者说有没有留意自己乘坐的飞机到底是什么机型呢?更往大的范围来说,在当前世界上的商业飞行活动中,一共有多少种飞机机型呢?飞行航班数最多的机型是哪一种?而飞行航班数最少的又是哪一种呢?哪种飞机的机龄最年轻,哪种飞机是飞行器界的老人呢?想想这些问题,是不是很有意思。当下次您在出行的时候,在值机或者购买机票的时候,可以统计以下您乘坐的飞机的机型。也看看我们国家主要的商业飞机机型是什么?主要的飞行航线是哪几条。
带着上述的问题开启本篇的内容讲解。本文主要讲解如何采用Java语言和XxlCrawler进行flightaware网的所有商用飞机机型的信息爬取,首先介绍在flightaware网上的所有飞行器数据,然后使用Java语言结合XxlCrawler进行信息抓取,最后得到完整的飞行器数据表格。通过本文,您可以掌握如何获取全球执飞的商用飞机的机型信息,同时掌握在使用XxlCrawler进行信息爬取时,如何获取超链接中Href属性,掌握属性值的正确处理方式。最后对成果进行充分展示,本文的结果是Excel表格,但是我们为了可以在后续的分析中继续使用,我们可以将这些数据持久化到数据库中,本文暂且不表。
一、数据说明
本节将主要对数据的来源进行说明,文中涉及到的飞行轨迹及全球飞机机型数据均参考flightaware飞行网。以飞机机型为例,局限于数据采集时获取的是实时的在线航班的数据,因此导致可能会遗漏部分已经降落的飞行飞机,但对于常用航空器,应该是包含在里面了。如果您需要最准确的数据,可以设置一个频率高的采集周期,定时从网站上采集,通过覆盖24小时甚至72小时的采集,来实现全覆盖(当然这个频率也不一定,有的航线可能一周才开通一次)。当然,您也可以购买会员,这样可以得到一些官方提供的数据。
1、实时航班飞机机型数据
对飞行轨迹感兴趣的朋友可以在flightaware网站上看到飞机的轨迹,这里需要注意的是,这里的航班都是实时航班,就是正在飞行的。已经到达的航班则不在列表中展示。具体如下图所示:
当我们想搜索航班时,可以有多种搜索模式,这里就分享一种,同时引出本博客的信息来源,飞机的机型列表。
第一步点击导航条中的“航班跟踪”,然后点击“按机型浏览”的超链接。 然后在新的界面中就打开所有的机型选择页面,如下图所示:
没有,上面的页面就是我们的目标,我们需要将上面的数据进行抓取到本地来。
2、网页结构分析
上面的飞机机型访问地址如下:飞机机型列表。为了实现使用Java语言来进行页面信息爬取,我们首先要分析网页的结构,便于在后续的抓取脚本设置中设置好xpath配置。如果使用的是谷歌浏览器,那么我们直接按F12或者右键检查,即可打开网页监控,在监控页面查看网页结构,尤其是xpath的规则。
通过观察上述的网页,我们不难发现,它的网页结构非常有规律,因此特别使用进行循环批量爬取。其网页内容格式均如下所示:
<tr class="smallrow1"> <td>2084</td> <td><a href="/live/aircrafttype/A320">A320</a></td> <td>Airbus A320</td> </tr>
上面的每一行包含四个主要的信息,第一个是实时航班的数量,第二个单元格的超链接是访问当前机型的实时航航的连接,后面是飞行机器的code,第四个是当前飞机的具体类型名称。在了解以上的信息以后我们就可以编写xpath脚本来获取相关的信息。
二、使用Java进行信息抓取
本节将重点展示如何使用Java语言来爬取这些航空器的信息,通过本节的知识,可以掌握使用Java语言来爬取相关知识的内容。同时这里将重点讲解如何在XxlCrawler框架中爬取超链接的Href属性,如果您在平时的工作中也要涉及网页属性的爬取,可以看看这里的处理方式。
1、定义页面PageVO对象
在博主的个人博客当中,大多都是介绍XxlCralwer这个组件。这个组件非常好用,这里依然采用这个组件来进行信息的抓取。在信息抓取之前,我们需要先通过xpath来定义html页面上的元素与我们抓取对象的一个映射关系,这个映射关系的配置就是通过pageVo这个对象来实现的。在上一节的内容介绍中,我们讲解了网页的结构,这里仅将pageVo对象的代码贴出来,对重点部分进行讲解。
/** * 请注意合理Xpath的配置,一定要配置到tr,配置到tr,会自动循环获取并赋值,方便于集合操作 * @author 夜郎king * */ @PageSelect(cssQuery = ".indent .prettyTable >tbody >tr") @Data @AllArgsConstructor @NoArgsConstructor public static class PageVo { /** * 实时航班数 */ @Excel(name = "航班数") @PageFieldSelect(cssQuery = " >td:eq(0)") private String count; /** * 机型代号 */ @PageFieldSelect(cssQuery = " >td:eq(1)") @Excel(name = "机型代码") private String code; /** * 查询机型超链接 * 这里要特别注意,selectType 切记要选择SelectType.ATTR,表示从属性中获取值,selectVal 表示取具体哪个属性的值,这里表示取href这表属性的值, * 更详细的用法在写博客时,可以参考源码进行详细说明 */ @PageFieldSelect(cssQuery = " >td:eq(1) >a:eq(0)",selectType = SelectType.ATTR,selectVal = "href") @Excel(name = "查询机型超链接") private String aircraftTypeLink; /** * 详细机型 */ @Excel(name = "详细机型") @PageFieldSelect(cssQuery = " >td:eq(2)") private String aircraftType; }
在上述的代码中,需要注意的地方有:
(1)、@PageSelect(cssQuery = ".indent .prettyTable >tbody >tr"),在定义pageVO对象时,由于在表格中有多个tr,我们在配置pageVo时,希望会自动形成一个List<PageVo>的数组,因此在定义xpath时一定要定义到tr这一层。
(2)、在获取机型的超链接时,由于获取的是元素的href属性,因此不要使用下面的获取属性的方法。
/** * 查询机型超链接 * 这里要特别注意,selectType 切记要选择SelectType.ATTR,表示从属性中获取值,selectVal 表示取具体哪个属性的值,这里表示取href这表属性的值, * 更详细的用法在写博客时,可以参考源码进行详细说明 */ @PageFieldSelect(cssQuery = " >td:eq(1) >a:eq(0)",selectType = SelectType.ATTR,selectVal = "href")
默认情况下,selectType是SelectType.TEXT,详细的配置看源码中的代码定义:
/** * jquery data-extraction-type,like ".html()/.text()/.val()/.attr() ..." * * jquery 数据抽取方式,如 ".html()/.text()/.val()/.attr() ..."等 * * @see com.xuxueli.crawler.conf.XxlCrawlerConf.SelectType * * @return SelectType */ public XxlCrawlerConf.SelectType selectType() default XxlCrawlerConf.SelectType.TEXT; /** * jquery data-extraction-value, effect when SelectType=ATTR/HAS_CLASS, like ".attr("abs:src")" * * jquery 数据抽取参数,SelectType=ATTR/HAS_CLASS 时有效,如 ".attr("abs:src")" * * @return String */ public String selectVal() default "";
2、爬取属性定义
在定义信息获取对象时,除了要定义PageVO转换对象,同时还要定义抓取的地址、抓取信息后保存的集合对象等。这里将分享如何定义这些其它属性信息。
private static final String GET_URL = "https://zh.flightaware.com/live/aircrafttype/"; 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"; /** * 定义所有机型的接收集合 */ private List<PageVo> aircraftTypeList = new ArrayList<PageVo>();
3、启动信息抓取组件
启动信息抓取的代码比较简单,这里不再对详细过程进行赘述。将代码直接贴出来,有问题看不懂的朋友可以私信交流。
@Test public void testGetAllaircraftType() { // 构造爬虫 XxlCrawler crawler = new XxlCrawler.Builder() .setUrls(GET_URL) .setAllowSpread(false)// 允许扩散爬取,将会以现有URL为起点扩散爬取整站,这里只爬一个页面,设置为不允许扩散 .setThreadCount(3) .setPauseMillis(2000) .setUserAgent(USER_AGENT)//设置user_agent .setIfPost(false) .setFailRetryCount(3)// 重试三次 .setTimeoutMillis(10 * 1000)//超时时间定位10秒钟 .setPageParser(new PageParser<PageVo>() { @Override public void parse(Document html, Element pageVoElement, PageVo pageVo) { // 解析封装 PageVo 对象 // String pageUrl = html.baseUri(); // 使用pageVO的方式解析 // System.out.println(pageUrl + ":" + pageVo.toString()); printVo(pageVo); aircraftTypeList.add(pageVo); } }).build(); crawler.start(true);// 启动 // excel工具包 ExcelUtil<PageVo> util = new ExcelUtil<PageVo>(PageVo.class); util.exportExcel(aircraftTypeList, "全球实时执飞所有机型列表-20240707"); System.out.println("finished..."); }
这里的最后,我们将所有飞行器的信息保存到一个list集合中,然后通过list集合写出到excel表格中。这样就可以实现数据的共享了。在IDE中运行上述的程序,在控制台中我们可以看到以下的输出:
这里贴出几条抓取飞机机型的日志信息:
TestAllAircraftTypeCrawer.PageVo(count=2088, code=A320, aircraftTypeLink=/live/aircrafttype/A320, aircraftType=Airbus A320) TestAllAircraftTypeCrawer.PageVo(count=1833, code=B738, aircraftTypeLink=/live/aircrafttype/B738, aircraftType=Boeing 737-800) TestAllAircraftTypeCrawer.PageVo(count=777, code=A321, aircraftTypeLink=/live/aircrafttype/A321, aircraftType=Airbus A321) TestAllAircraftTypeCrawer.PageVo(count=515, code=B38M, aircraftTypeLink=/live/aircrafttype/B38M, aircraftType=Boeing 737 MAX 8) TestAllAircraftTypeCrawer.PageVo(count=462, code=A20N, aircraftTypeLink=/live/aircrafttype/A20N, aircraftType=Airbus A320neo) TestAllAircraftTypeCrawer.PageVo(count=445, code=A21N, aircraftTypeLink=/live/aircrafttype/A21N, aircraftType=Airbus A321neo)
在我们的下载目录,可以看到在目录中已经生成了如下文件,
打开任意一个机型文件后可以看到如下信息:
通过以上的代码和成果展示基本已经实现了我们预期目标,成功的将数据进行信息获取。下面我们来对数据进行一个简单的分析。
三、成果分析
本节将结合上面的数据来试图回答文章的开始时提出的那几个问题。数据会说话,我们来看看商业航班偏爱哪些飞机的机型。
1、商业飞行的飞机机型的种类
按照我们采集的数据来看,我们分两天不同的时间段来进行采集。以7月7日和7月8日两天采集的飞行航班的飞机种类数量为统计,其数量大致是在:301-352种之间,之所以有这种区别,是因为这是采集的实时航班数。因此数字仅供参考(7月7日是352种,7月8日是301种)。
2、飞机种类排名前十名
这里我们来看一下飞机航班数的前10名是哪些飞机(以7月8日的数据为例):
航班数 | 机型代码 | 查询机型超链接 | 详细机型 |
2088 | A320 | /live/aircrafttype/A320 | Airbus A320 |
1833 | B738 | /live/aircrafttype/B738 | Boeing 737-800 |
777 | A321 | /live/aircrafttype/A321 | Airbus A321 |
515 | B38M | /live/aircrafttype/B38M | Boeing 737 MAX 8 |
462 | A20N | /live/aircrafttype/A20N | Airbus A320neo |
445 | A21N | /live/aircrafttype/A21N | Airbus A321neo |
350 | B789 | /live/aircrafttype/B789 | Boeing 787-9 Dreamliner |
336 | A319 | /live/aircrafttype/A319 | Airbus A319 |
330 | B77W | /live/aircrafttype/B77W | BOEING 777-300ER |
326 | C172 | /live/aircrafttype/C172 | Cessna Skyhawk |
从上图不难看出,空客A320是绝对的空中数量王,稳居第一,排名第二是波音公司的738,第三名又是空客公司的A321。在排名前十的机型中,空客公司和波音公司基本霸榜了。
3、航班数排名后十名
上面我们看了排名前10名的航空器,接下来我们开看航班数少的航空器。依然以7月8日的数据为例进行说明:
数量 | 机型 | 详情链接 | 详细机型 |
1 | P32T | /live/aircrafttype/P32T | Piper Lance 2 |
1 | PA22 | /live/aircrafttype/PA22 | Piper PA-22 Tri-Pacer |
1 | PA38 | /live/aircrafttype/PA38 | Piper Tomahawk |
1 | PAT4 | /live/aircrafttype/PAT4 | Piper PA-31T3-500 T-1040 |
1 | PAY1 | /live/aircrafttype/PAY1 | Piper Cheyenne |
1 | PTS2 | /live/aircrafttype/PTS2 | PITTS Special (S-2) |
1 | R66 | /live/aircrafttype/R66 | Robinson R-66 |
1 | S61 | /live/aircrafttype/S61 | Sikorsky Sea King |
1 | SS2P | /live/aircrafttype/SS2P | North American Rockwell Thrush Commander |
1 | SW4 | /live/aircrafttype/SW4 | Fairchild Dornier SA-227DC Metro |
1 | T6 | /live/aircrafttype/T6 | North American T-6 Texan |
1 | TB0 | /live/aircrafttype/TB0 | |
1 | TB1 | /live/aircrafttype/TB1 | |
1 | ULAC | /live/aircrafttype/ULAC | Unknown/Generic Microlight aircraft |
4、看中国国产大飞机C919
众所周知,C919是我们国家设计建造的国产大飞机,这里我们也来看看C919的飞行航班。在表格中找了以下,C919的航班数较少。
2 | C919 | COMAC C-919 |
可以看到C919的航班还是比较少的,只有两个架次的商业航班。在系统中来看一下他的飞行计划。
当前C919是在中国东方航空公司进行服役,因此想要感受国产大飞机的可能乘坐东航的飞机的时候机会更大。
四、总结
以上就是本文的主要内容,本文主要讲解如何采用Java语言和XxlCrawler进行flightaware网的所有商用飞机机型的信息爬取,首先介绍在flightaware网上的所有飞行器数据,然后使用Java语言结合XxlCrawler进行信息抓取,最后得到完整的飞行器数据表格。通过本文,您可以掌握如何获取全球执飞的商用飞机的机型信息,同时掌握在使用XxlCrawler进行信息爬取时,如何获取超链接中Href属性,掌握属性值的正确处理方式。
文章行文仓促,定有不足支持,还恳请各位朋友专家批评指正,一定虚心接受。