作者 主題: 出個練習給大家  (閱讀 3341 次)

0 會員 與 1 訪客 正在閱讀本文。

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
出個練習給大家
« 於: 2004-06-28 14:07 »
http://www.cwb.gov.tw/V4/weather/ob/index-ob.htm
這是 CWB 的現在天氣...

請以 mrtg 或 rrdtool 或其他網頁工具,
畫成
某地 之 ==> 氣溫圖/相對溼度/氣壓  圖等資訊

請多注意網頁說明文字...

這個練習著重在 ` ` , $(expr) , sed , 及對 tool 的了解程度
(當然,也不是只用 shell script,可用任何 language )

無聊...僅供大家練習參考

做好的別忘讓大家參考...互相學習

wilson

  • 俺是博士!
  • *****
  • 文章數: 1821
  • 帥氣柴老大
    • 檢視個人資料
出個練習給大家
« 回覆 #1 於: 2004-06-28 14:13 »
嘻~~abelyang學長真有心阿~~

(哈~~灌了這篇就800了~~ :o

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
出個練習給大家
« 回覆 #2 於: 2004-06-28 14:39 »
哈~其實這個問題在於 sed 用的好不好,
mrtg/rrdtool 或使用的繪圖工具了不了解
另外,就是資料分析而以

可以看看別人的 sample
http://home.surewest.net/twitham/wx200d/Temp.html#Temp_Day

Jishon

  • 榮譽博士
  • 活潑的大學生
  • ***
  • 文章數: 321
    • 檢視個人資料
出個練習給大家
« 回覆 #3 於: 2004-06-29 14:44 »
剛好在學習perl,弟先試試好了
程式部分使用perl取溫度及溼度兩個值
代碼: [選擇]

#!/usr/bin/perl
# example: weather.pl 台北
$location = shift;
$url = "http://www.cwb.gov.tw/V4/weather/ob/index-ob.htm";
$temperature = `lynx -dump $url | grep -A 7 $location | grep header7`;
$temperature =~ s/.*">(\d+\.\d+)<\/td>/$1/;
chop($temperature);
$moisture = `lynx -dump $url | grep -A 8 $location |grep header8`;
$moisture =~ s/.*">(\d+)<\/td>/$1/;
chop($moisture);
print "$temperature\n";
print "$moisture\n";
print "\n";
print "\n";


繪圖部分使用mrtg(這部分弟未測試)
mrtg.cfg
代碼: [選擇]

Target[weather]: `/usr/local/bin/weather.pl location`
Options[weather]: nopercent,gauge
Directory[weather]: ms
Title[weather]: Temperature Vs. Mositure
MaxBytes[weather]: 100
LegendI[weather]: Temperature
LegendO[weather]: Mositure
Legend1[weather]: Temperature (Degree)
Legend2[weather]: Mositure (%)
Sendmail, BIND 惡補中.....

Higojump

  • 憂鬱的高中生
  • ***
  • 文章數: 103
    • 檢視個人資料
出個練習給大家
« 回覆 #4 於: 2004-06-29 15:20 »
perl還真好用,這麼幾行就寫出來了
php版本:
<?
$fp=file("http://www.cwb.gov.tw/V4/weather/ob/index-ob.htm");
$fp=join("",$fp);
$fp=ereg_replace("\n","",$fp);
$fp=split("<tr>",$fp);
$fp=array_filter($fp,"filter");
$fp=get_field(7,$fp);
print_r($fp);
function filter($value)
{
return ereg("^<td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td></tr>$",$value);
}
function get_field($num,$fp)
{
return preg_replace("/^<td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><\\/tr>$/"
,"\\".$num,$fp);
}
?>

抓溫度就get_field(7,$fp);抓其它欄位就依此類推
用這招也可以抓其它網頁 8)
------------------------------
大雄這一生中只愛過兩個男人
胖虎跟小夫
-------------------------------

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
出個練習給大家
« 回覆 #5 於: 2004-06-29 16:35 »
小弟我也來獻醜一下....不過我也是習慣使用 php ...所以用 php 寫...
中間動了點手腳在空值得處理....
代碼: [選擇]

<?
$fp=file("index-ob.htm");
$fp=join("",$fp);

$fp = ereg_replace("height=\"10\"></td>","height=\"10\">0</td>",$fp);
$fp = strip_tags($fp);
$fp = ereg_replace("\n\n","",$fp);
$fp = explode("\n",$fp);

function getVal($serial){
    global $fp;
    $index = (($serial - 1) * 11) + 1;
    echo $index;
    $ret = array(
        $fp[$index],    $fp[$index+1],
        $fp[$index+2],  $fp[$index+3],
        $fp[$index+4],  $fp[$index+5],
        $fp[$index+6],  $fp[$index+7],
        $fp[$index+8],  $fp[$index+9],
        $fp[$index+10]
    );
    return $ret;
}

print_r(getVal(3));
?>


funtcion 回來的是 一個 array .
範例輸出
代碼: [選擇]

Array
(
    [0] => 地區
    [1] => 資料時間
    [2] => 風向
    [3] => 風力(級)
    [4] => 陣風(級)
    [5] => 能見度(公里)
    [6] => 氣溫(度C)
    [7] =>  相對溼度(%)
    [8] =>  海平面氣壓(百帕)
    [9] => 天氣
    [10] => 累積雨量(毫米)
)
Array
(
    [0] => 基隆
    [1] => 2004-06-29 15:00:00
    [2] => 東北
    [3] => 4
    [4] => 0
    [5] => 0
    [6] => 28.2
    [7] => 89
    [8] => 999.5
    [9] => 陰有陣雨
    [10] => .2
)
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

Higojump

  • 憂鬱的高中生
  • ***
  • 文章數: 103
    • 檢視個人資料
出個練習給大家
« 回覆 #6 於: 2004-06-30 09:10 »
代碼: [選擇]

<?
$area="台北|基隆";
$row=get_fields(array(1,7,8));

print_r($row);
function filter1($value)
{
return ereg("^<td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td><td.*>.*</td></tr>$",$value);
}
function filter2($value)
{
global $area;
return ereg($area,$value);
}
function get_fields($fields=array(1,2,3,4,5,6,7,8,9,10,11))
{
global $area;
$fp=file("http://www.cwb.gov.tw/V4/weather/ob/index-ob.htm");
$fp=join("",$fp);
$fp=ereg_replace("\n","",$fp);
$fp=split("<tr>",$fp);
$fp=array_filter($fp,"filter1");
if($area)
{
$fp=array_filter($fp,"filter2");
}
$fp=array_values($fp);
for($i=0;$i<count($fp);$i++)
{ $fp[$i]=preg_replace("/^<td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><td.*>(.*)<\\/td><\\/tr>$/","\\".join("::\\",$fields),$fp[$i]);
$fp[$i]=split("::",$fp[$i]);
}
return $fp;
}
?>
------------------------------
大雄這一生中只愛過兩個男人
胖虎跟小夫
-------------------------------

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
出個練習給大家
« 回覆 #7 於: 2004-06-30 19:22 »
哇~大家很好哦.....
如果再多一個 shell 派的...就更完美了

 :D

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
出個練習給大家
« 回覆 #8 於: 2004-07-01 16:19 »
我貢獻一個 shell script 的好了...

filenmae=cwb.sh
代碼: [選擇]

#!/bin/sh
AREA=$1
ITEM=$2
#取得網頁
wget http://www.cwb.gov.tw/V4/weather/ob/index-ob.htm -O cwb.html 2>/dev/null

#將網頁中的 地區 資料時間 風向 風力(級) 陣風(級) , 轉成 header[1]=地區, [2]=資料時間....
eval $(cat cwb.html | sed  -e '/<th.*\/th>/!d' |  sed -e  's/.*"\(.*\)er\(.*\)" width.*>\(.*\)<\/th>/\1er\[\2\]="\3";/g' | sed -e 's/(.*)//g' -e 's/ //g')

# 找出 $2 (ITEM) 的 index
i=1
while [ ${#header[$i]} -ne 0 ]; do
test "${header[$i]}" = "$ITEM" && break
i=`expr $i + 1`
done

# 計算地區那一段,如果寫 台北 氣溫, 則會取出台北那一段 html
# 再 parser 出 index 那一行
cat cwb.html |sed -e 's/<tr>//g' -e '/./{H;$!d;}' -e "x;/$AREA/!d;" | grep 'td'| sed  -e 's/<td.*>\(.*\)<.*>/\1/g' -e 's/ //g' | head -$i | tail -1


用法則是
./cwb.sh 台北  氣溫
./cwb.sh 台中  海平面氣壓
./cwb.sh 台中 相對溼度

原來有 海平面氣壓(百帕) 這種描述的, () 都東西不用打
欄名/地區 有增加也可以不用管....

方法有 N 種與好壞,我的做法
重點則在於 eval , $() , RE/Replacement 觀念, sed 取段落技巧