用perl腳本獲取天氣

前言

說一下這個想法的由來。其實最初目的不是為了獲取天氣的,這只是一個練習而已。最初是想自動獲取公司的出勤情況,提醒我前一天有沒有忘記打卡的。公司打卡是由網站可以查詢的,有時忘記了或者系統(tǒng)出錯,可能當天打卡沒有打上,不去查看的話就記為缺勤了(這可是關乎工資啊啊啊啊),于是想到了每天定時執(zhí)行一次查詢任務,要是差到有缺勤記錄就在登錄系統(tǒng)時發(fā)出提示。所以作為一個初學者我就自然想到怎么獲取網站固定信息了。由于在公司是內網,無法在家測試,所以就寫個查詢天氣的腳本來確定基本的腳本結構。

原理

原理呢,其實就是字符串的處理。我知道可以用網站的api發(fā)出請求,然后返回數(shù)據(jù),這樣更加方便快捷。但是,我不是學軟件的不會這個,233333。當然 這不是理由,可以去學,只是有更簡便的方式。我選擇將網頁源碼下載下來然后分析字符獲取字段,畢竟如果登錄網頁能看到信息,那么在網頁的html里應該也有這個字段。那么現(xiàn)在大概的步驟就明確了:


  1. 下載網頁源碼。
  2. 查看源碼,分析關鍵字段的特征,從而能夠查找匹配。

這種方式只適合不需要網頁交互的查詢,假如查詢時還要輸入密碼這些就不能查到了。只要在瀏覽器直接輸入網址就能訪問的網頁可以用這種方法查詢需要的信息。

詳細分析

在這里我選取中國天氣網上海天氣來作為查詢的網址。首先用瀏覽器將網頁另存為html格式,然后查看文本內容(在這里推薦使用代碼編輯器查看,瀏覽器有瀏覽網頁源碼功能的也可以查看。我將網頁文件傳到樹莓派用vim查看了,后面perl也是在樹莓派上寫)。用vim查看代碼,然后搜索日期,天氣應該是按日期來排的。太幸運了,直接就搜到了:

天氣信息所在行

實在是easy啊。那么我們來分析這一行。

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

這一行的分析思路有以下幾點:

  • 這一句是通過搜索日期的到的,那么我們可以在代碼中使用查找日期來定位這一行。
  • 我們需要的天氣信息在value=關鍵詞后面用雙引號包起來的字段,我們可以在定位行后在行里定位字符串value=,相信這不難做到。最簡單粗暴的方式就是用數(shù)組把每個字符保存起來,然后一個一個遍歷。這一行的字符也不多,占用內存也不大。
  • 我還發(fā)現(xiàn),我需要的字段被雙引號"包起來,那么我聯(lián)想到perl中的split函數(shù)。可以將這一行用split函數(shù)將字符分解為以"隔開的列表,這樣我們只要訪問列表元素就可以了。

代碼實現(xiàn)

首先使用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參數(shù)指的是將下載的網頁另存為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; #將獲取到的時間以空格分解,提取出日期。也可以通過控制
                                 #獲取時間命令的參數(shù)來直接獲得日期。比如  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;

以上就是代碼實現(xiàn)過程,很簡單的幾行就搞定了。方法很偏門啊,慎用。

運行結果

腳本運行結果

想要獲取更準確更實時的數(shù)據(jù)也可以在網頁中繼續(xù)查找,主要是字符串的定位問題。更簡單粗暴的方式是查看數(shù)據(jù)在哪一行,直接跳到那一行去分解字符串獲取數(shù)據(jù),這就免得去分析查找的關鍵字怎么獲取了。但這種方法的前提是網頁的內容變動不太大,需要的信息總是出現(xiàn)在那一行。就天氣來說,網頁內容還是比較固定的,可以采用這種方式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,659評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 今天咱們來聊一聊“日月盈昃”這四個字。 昃是一個我們比較少用的字,讀zè。先來解釋一下這個字。 回到甲骨文創(chuàng)立之處...
    曹斐閱讀 773評論 0 4
  • 這世界從來沒有什么事情是容易做的,其實所有的事情都是很難的,也都是不難的。只看你如何對待罷了。天下事有難易乎?為之...
    我畫家一枚閱讀 366評論 0 0
  • ROSE 0406 我從不認為自己是一個堅定的人,對待很多事情都是三分鐘熱度,比如畫畫,跳拉丁,寫日記,練字等等等...
    擠地鐵去上班閱讀 247評論 0 0