使用Kettle下载气象局各城市最新天气数据

1、问题背景html

天气数据,在诸多数据分析利用场景中属于经常使用信息资源。本文为探讨Kettle应用技术,采用中国天气网(网址:http://www.weather.com.cn)为主要数据来源,利用Kettle的转换能力,解析各城市七每天气数据,导出到本地的Excel文件中。读者能够根据本例思路,将最终的数据加载改成DBMS等其余永久性存储介质,再加上天天执行的定时任务,能够下载到各城市每一天的天气以及七天预报数据,沉淀历史天气数据资源。特别声明,本文仅为技术探讨,读者采集互联网信息资源时务必遵照网站版权相关规定,违规责任自负。web

 

2、输入输出正则表达式

中国天气网对每一个城市都设置有一个内部编号(设为{BH}),每一个城市对应天气信息能够经过网址http://www.weather.com.cn/weather/{BH}.shtml得到。例如湖南省张家界市的编号为101251101,每日天气数据发布在网址http://www.weather.com.cn/weather/101251101.shtml。下图1为本例转换输入数据来源的网站截图:微信

图1网站

所以,若是只须要某一个城市的天气数据,能够找到该城市天气对应连接,天天下载解析保存便可。如须要全部城市的天气数据,则首先须要获得全部城市的名称和内部编号。为控制篇幅,假设已经拿到须要城市集合的编号与名称,并保存到本地文件中,以下图2所示。spa

图2.net

最终的输出目标是一个Excel文档,内含各城市当日以及将来七每天气数据,包括天气、最高最低气温、风向、风力(以下图3)等信息单元。其中,次日天气信息单元名称为天气2,第三每天气信息单元名称为天气3,以此类推。3d

图3htm

3、关键步骤对象

具体解决思路是,首先动态生成各城市的连接地址,而后依次下载各个连接,解析出感兴趣的数据块,而后将数据块中数据解析到具体信息单元中,保存到Excel文件。关键步骤阐述以下:

一、动态构造城市连接地址

比较简单的办法是新建一个常量字段,而后用内部编号(假设字段名为dqdm)替换其中固定部分,这样增长一个字符串替换步骤便可实现。本例为了演示技术运用,采用核心对象/转换类别中的计算器步骤。首先设置一个常量名为wUrlC,值为http://www.weather.com.cn/weather/;而后再设置一个常量名为wUrlTail,值为.shtml;最后增长一个新字段wUrl,计算公式为A+B+C,即wUrlC+dqdm+wUrlTail。这样,若是dqdm为101010300,那么wUrl的值就为http://www.weather.com.cn/weather/101010300.shtml,恰好符合网站地址规则。计算器步骤设置以下图4:

图4

二、下载网页数据

有了连接地址,下载网页只需新建一个核心对象/查询类别中的HTTPclient步骤便可,其中地址来自上一步构造的wUrl字段,具体设置以下图5所示:

图5

三、解析数据块

上一步获得的网站原始数据(字段名webResult)很是冗长,可是很容易捕获到数据区域的规律。以下图6所示,数据块部分以<div id=”7d” class=”c7d”>开头,以<div class=”btn”>结束。

图6

所以,能够增长一个核心对象/脚本类别中的正则表达式步骤,解析到数据块部分。按照前述规律分析结论,设置表达式以下:

[\s\S]*<div id="7d"class="c7d">([\s\S]*?)<div>[\s\S]*

其余配置以下图7所示。

图7

经过上述步骤,数据块就解析到一个名为sevenDays的String类型字段中。

四、解析七天数据

若是只须要今天、明天、后天三天的天气,经过分析图6中的数据块,比较容易找到规律,由于其中有明显的标志性字符串:xx日(今天)、xx日(明天)、xx日(后天),那么经过一个正则表达式步骤,不可贵到此三天的数据。可是,网站后几天的数据均按照日期和星期标示,例如图6中依次为19日(周日)、20日(周一)、21日(周二)、22日(周三),这样若是到了明天访问此页面,后几天依次是20日(周一)、21日(周二)、22日(周三)、23日(周四)。能够看出,最后四天的标示是动态的。所以,一种思路是利用今天日期,自动计算3天后的4个周几,并构造出动态的正则表达式;另一种思路是,直接拆分为7个部分,依次解析。本例采用后者,增长一个核心对象/转换类别中的拆分字段步骤。经过对图6中数据块的分析,采用<li做为拆分分隔符,依次从sevenDays字段中拆分出f1~f8共八个新字段。具体配置以下图8所示:

图8

部分字段拆分效果参见Kettle预览图9:

图9

五、信息单元解析

有了每一天的数据子块,后续思路都相似。只需经过增长一个核心对象/脚本类别中的正则表达式步骤,就能够解析出某一天的一部分信息单元数据。如下简要举例:

  • 解析今日天气,表达式为:

[\s\S]*? id="hidden_title"value="(.*?)°C"[\s\S]*

  • 解析当天的风向与风力,表达式为:

[\s\S]*?<spantitle="(.*?)"[\s\S]*?<i>(.*?)</i>[\s\S]*

  • 解析次日到第七天的天气、最高气温、最低气温、风向、风力,表达式为:

[\s\S]*?<p.*?class="wea".*?>(.*?)</p>[\s\S]*?<pclass="tem">[\s\S]*?<span>(.*?)</span>[\s\S]*?<i>(.*?)</i>[\s\S]*?<spantitle="(.*?)"[\s\S]*?<i>(.*?)</i>[\s\S]*

其中,第七天解析步骤的设置以下图10所示:

图10

因为后面的步骤,大部分都是正则表达式,因此本文再也不一一赘述。

六、字段更名

在最后一步Excel输出前,须要加入一个核心对象/转换类别中的字段选择步骤,将须要字段重命名为中文,方便生成Excel文档的表头。具体配置以下图11所示:

图11

因为大量临时信息单元数据对最终输出结果无心义,因此也能够根据状况,适当增长此步骤,删除一些没必要要的字段,这样能够极大节省内存消耗。

整个转换步骤较多,整体截图以下图12:

图12

4、总结

本文经过计算器、正则表达式、拆分字段等步骤操做的演示,实现了一个从原始网页下载数据的过程。全部网页数据解析需求,都可参考。

如需原始转换及演示数据文件,请联系微信号carol_sxh获取,添加好友时请注明所需文件名(KettleSample003.7z)。

 

【注意】本公众号所发文章皆为原创,如需转载请注明出处及做者。


本文分享自微信公众号 - Kettle博士(gh_f656c3d7ba54)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索