用perl脚本获取天气

前言

说一下这个想法的由来。其实最初目的不是为了获取天气的,这只是一个练习而已。最初是想自动获取公司的出勤情况,提醒我前一天有没有忘记打卡的。公司打卡是由网站可以查询的,有时忘记了或者系统出错,可能当天打卡没有打上,不去查看的话就记为缺勤了(这可是关乎工资啊啊啊啊),于是想到了每天定时执行一次查询任务,要是差到有缺勤记录就在登录系统时发出提示。所以作为一个初学者我就自然想到怎么获取网站固定信息了。由于在公司是内网,无法在家测试,所以就写个查询天气的脚本来确定基本的脚本结构。

原理

原理呢,其实就是字符串的处理。我知道可以用网站的api发出请求,然后返回数据,这样更加方便快捷。但是,我不是学软件的不会这个,233333。当然 这不是理由,可以去学,只是有更简便的方式。我选择将网页源码下载下来然后分析字符获取字段,毕竟如果登录网页能看到信息,那么在网页的html里应该也有这个字段。那么现在大概的步骤就明确了:


  1. 下载网页源码。
  2. 查看源码,分析关键字段的特征,从而能够查找匹配。

这种方式只适合不需要网页交互的查询,假如查询时还要输入密码这些就不能查到了。只要在浏览器直接输入网址就能访问的网页可以用这种方法查询需要的信息。

详细分析

在这里我选取中国天气网上海天气来作为查询的网址。首先用浏览器将网页另存为html格式,然后查看文本内容(在这里推荐使用代码编辑器查看,浏览器有浏览网页源码功能的也可以查看。我将网页文件传到树莓派用vim查看了,后面perl也是在树莓派上写)。用vim查看代码,然后搜索日期,天气应该是按日期来排的。太幸运了,直接就搜到了:

天气信息所在行

实在是easy啊。那么我们来分析这一行。

<input type="hidden" id="hidden_title" value="10月27日20时 周五 晴转多云 16/22°C" />

这一行的分析思路有以下几点:

  • 这一句是通过搜索日期的到的,那么我们可以在代码中使用查找日期来定位这一行。
  • 我们需要的天气信息在value=关键词后面用双引号包起来的字段,我们可以在定位行后在行里定位字符串value=,相信这不难做到。最简单粗暴的方式就是用数组把每个字符保存起来,然后一个一个遍历。这一行的字符也不多,占用内存也不大。
  • 我还发现,我需要的字段被双引号"包起来,那么我联想到perl中的split函数。可以将这一行用split函数将字符分解为以"隔开的列表,这样我们只要访问列表元素就可以了。

代码实现

首先使用shell的curl命令下载网页。这里解释一下为什么不用perl的命令(当然是因为技术不好啊_)。perl对网络的操作好像需要一些模块,不知道这些模块是安装perl时自带的还是需要额外添加,也不确定公司的perl是不是带有这些模块。但是shell的curl命令是自带的,我就使用shell命令来下载网页了。在perl中调用shell命令表达如下:

    `curl -o wether.html http://www.weather.com.cn/weather/101020100.shtml`

注意两边的单引号!网址中的101020100.shtml指的是上海的天气页面,不清楚具体城市编码方式,可以一个一个去网站查询看。命令中的-o wether.html参数指的是将下载的网页另存为wether.html文件。
下载好网页后就可以以文本方式读取网页内容了。在处理文件字符之前,我们需要获得查询的关键字,也就是日期。获得关键字后去读取文件每一行,并判断当前行是否包含关键字,包含关键字则将当前行分解为列表,得到列表就可以输出天气信息了。
最后得到代码如下:

#!/usr/bin/perl -w
 `curl -o wether.html http://www.weather.com.cn/weather/101020100.shtml`;
 if ( ! open HTML,'<','wether.html' ) {
       die "cannot open:$!";   #文件打开失败提示
 }
 $date =`date`;  #获取当前时间
 chomp($date);
 @date_list = split /\s+/,$date; #将获取到的时间以空格分解,提取出日期。也可以通过控制
                                 #获取时间命令的参数来直接获得日期。比如  date "+%m月%d日"
                                 #这样就可以直接获取"x月x日"格式的时间
while (defined ($line = <HTML>)) {      #读取文件每一行到$line变量里
$gre=(grep /$date_list[2]/,$line) + (grep /value=/,$line);#如果有日期,又有value关键词,则认为找到了
if ($gre == 2){
      @val_list=split /"/,$line;      #将文本行以"为分隔符分解字段
      print $val_list[5]."\n";        #天气信息在列表元素5里
     last;

}
}

close HTML;

以上就是代码实现过程,很简单的几行就搞定了。方法很偏门啊,慎用。

运行结果

脚本运行结果

想要获取更准确更实时的数据也可以在网页中继续查找,主要是字符串的定位问题。更简单粗暴的方式是查看数据在哪一行,直接跳到那一行去分解字符串获取数据,这就免得去分析查找的关键字怎么获取了。但这种方法的前提是网页的内容变动不太大,需要的信息总是出现在那一行。就天气来说,网页内容还是比较固定的,可以采用这种方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,074评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 今天咱们来聊一聊“日月盈昃”这四个字。 昃是一个我们比较少用的字,读zè。先来解释一下这个字。 回到甲骨文创立之处...
    曹斐阅读 744评论 0 4
  • 这世界从来没有什么事情是容易做的,其实所有的事情都是很难的,也都是不难的。只看你如何对待罢了。天下事有难易乎?为之...
    我画家一枚阅读 359评论 0 0
  • ROSE 0406 我从不认为自己是一个坚定的人,对待很多事情都是三分钟热度,比如画画,跳拉丁,写日记,练字等等等...
    挤地铁去上班阅读 243评论 0 0