LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5622|回复: 25

今天写了个从腾讯网站抓取天气信息的脚本

[复制链接]
发表于 2005-12-8 18:05:05 | 显示全部楼层 |阅读模式
用roottail可以输出到桌面。
使用方法
[color="Red"]./getweather.sh  <城市代码>
不加任何参数查询的是深圳的天气(默认)。
[color="Red"]./getweather.sh 125   查询得到北京的天气

  1. ________________________________
  2. 天气            晴
  3. 温度            -7℃~1℃
  4. 风力            小于3级
  5. 紫外线          中等
  6. 空气            良
  7. ________________________________
复制代码

./getweather.sh [-V/--verison]显示版本信息
./getweather.sh [-h/--help/其他非法参数]显示帮助信息

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2005-12-8 21:17:28 | 显示全部楼层
好贴,等我做成desklet哈哈
回复 支持 反对

使用道具 举报

发表于 2005-12-9 09:48:29 | 显示全部楼层
不错,学习ING。。。。
回复 支持 反对

使用道具 举报

发表于 2005-12-9 10:01:49 | 显示全部楼层
明显是给我这个死不要脸的机会麽.
代码在这里!
系统要求:
1:wget(估计大家都有)
2:perl(应该也有)说的都是废话


  1. ctcode=${1}

  2. showversion()
  3. {
  4.     echo "Version 1.0 by Sipingal."
  5. }
  6. usage()
  7. {
  8.     echo "usage:getweather [citycode]    the default citycode is 296(深圳)"
  9.     echo "                               -h --help  is for this screen."
  10.     echo "The citycode:"
  11.     cat << sipingal
  12. 125________北京
  13. 292________广州
  14. 252________上海
  15. 127________天津
  16. 212________重庆
  17. 115________沈阳
  18. 244________南京
  19. 211________武汉
  20. 166________成都
  21. 186________西安
  22. 82________石家庄
  23. 84________太原
  24. 189________郑州
  25. 103________长春
  26. 17________哈尔滨
  27. 69________呼和浩特
  28. 140________济南
  29. 248________合肥
  30. 287________厦门
  31. 255________杭州
  32. 276________福州
  33. 218________长沙
  34. 296________深圳
  35. 295________南宁
  36. 232________桂林
  37. 264________南昌
  38. 227________贵阳
  39. 1________香港
  40. 2________澳门
  41. 179________昆明
  42. 280________台北
  43. 150________拉萨
  44. 303________海口
  45. 57________兰州
  46. 56________西宁
  47. 78________银川
  48. 28________乌鲁木齐
  49. sipingal
  50. }

  51. getcitycode()
  52. {
  53.     true=0
  54.     for num in 125 292 252 127 212 115 244 211 166 186 82 84 189 103 17 69 140 248 287 255 276 218 296 295 232 264 227 1 2 179 280 150 303 57 56 78 28
  55.     do
  56.     {
  57.         if [ "${ctcode}" = "${num}" ]
  58.         then
  59.             true=`echo ${true} + 1 |bc`
  60.         else
  61.             continue
  62.         fi
  63.     }
  64.     done

  65.     if [ "${true}" = "1" ]
  66.     then
  67.     {
  68.         citycode=${ctcode}
  69.         getweather
  70.         printweather
  71.     }
  72.     else
  73.     {
  74.         usage
  75.     }
  76.     fi
  77. }

  78. printweather()
  79. {
  80.     echo -e "天气\t\t$wheater"
  81.     echo -e "温度\t\t$temp1"
  82.     echo -e "风力\t\t$temp2"
  83.     echo -e "紫外线\t\t$temp3"
  84.     echo -e "空气\t\t$temp5"
  85. }

  86. getweather()
  87. {

  88.     #http://weather.qq.com/inc/ss${citycode}.htm
  89.     wheater="`wget http://weather.qq.com/inc/ss${citycode}.htm -O /dev/stdout 2> /dev/null | tr '\t' ' ' |grep -v '^ $'  |grep -v '^  $' | grep -v '^   $'| grep r_tembg5.gif | sed s'/.*"center">//'g |sed s'/<\/td>//'g`"
  90.     temp1="`wget http://weather.qq.com/inc/ss${citycode}.htm -O /dev/stdout 2> /dev/null | tr '\t' ' ' |grep -v '^ $'  |grep -v '^  $' | grep -v '^   $'  | perl -0 -ne 's/(tem1.gif.*)\n/$1/,print' | grep tem1.gif | sed s'/.*"center">//'g | sed s'/.*"center">//'g | sed s'/.*"center">//'g |sed s'/<\/td>//'g`"
  91.     temp2=`wget http://weather.qq.com/inc/ss${citycode}.htm -O /dev/stdout 2> /dev/null | tr '\t' ' ' |grep -v '^ $'  |grep -v '^  $' | grep -v '^   $'  | perl -0 -ne 's/(tem2.gif.*)\n/$1/,print' | grep tem2.gif | sed s'/.*"center">//'g | sed s'/.*"center">//'g | sed s'/.*"center">//'g |sed s'/<\/td>//'g`
  92.     temp2="`wget http://weather.qq.com/inc/ss${citycode}.htm -O /dev/stdout 2> /dev/null | tr '\t' ' ' |grep -v '^ $'  |grep -v '^  $' | grep -v '^   $' | perl -0 -ne 's/(tem2.gif.*)\n/$1/,print' | grep tem2.gif | sed s'/.*"center">//'g | sed s'/.*"center">//'g | sed s'/.*"center">//'g |sed s'/<\/td>//'g`"
  93.     temp3="`wget http://weather.qq.com/inc/ss${citycode}.htm -O /dev/stdout 2> /dev/null | tr '\t' ' ' |grep -v '^ $'  |grep -v '^  $' | grep -v '^   $'  | perl -0 -ne 's/(tem3.gif.*)\n/$1/,print' | grep tem3.gif | sed s'/.*"center">//'g | sed s'/.*"center">//'g | sed s'/.*"center">//'g |sed s'/<\/td>//'g`"
  94.     temp5="`wget http://weather.qq.com/inc/ss${citycode}.htm -O /dev/stdout 2> /dev/null | tr '\t' ' ' |grep -v '^ $'  |grep -v '^  $' | grep -v '^   $'  | perl -0 -ne 's/(tem5.gif.*)\n/$1/,print' | grep tem5.gif | sed s'/.*"center">//'g | sed s'/.*"center">//'g | sed s'/.*"center">//'g |sed s'/<\/td>//'g`"
  95.     #perl -0 -ne 's/(tem1.gif.*)\n/$1/,print'

  96. }

  97. # main

  98. if [ "${ctcode}" = "" ]
  99. then
  100. {
  101.     citycode=296
  102.     getweather
  103.     printweather
  104. }
  105. elif [ "${ctcode}" = "-H" ]
  106. then
  107. {
  108.     usage
  109. }
  110. elif [ "${ctcode}" = "--help" ]
  111. then
  112. {
  113.     usage
  114. }
  115. elif [ "${ctcode}" = "-V" ]
  116. then
  117. {
  118.     showversion
  119. }
  120. elif [ "${ctcode}" = "--version" ]
  121. then
  122. {
  123.     showversion
  124. }
  125. else
  126. {   
  127.     getcitycode
  128. }
  129. fi

复制代码
回复 支持 反对

使用道具 举报

发表于 2005-12-9 10:06:22 | 显示全部楼层
  1. wget http://weather.qq.com/inc/ss${citycode}.htm -O - 2>/dev/null
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-12-11 22:24:40 | 显示全部楼层
分析这个页面用不着perl,直接用grep,sed等就已经够了,
而且不必下载五次这个页面,太浪费时间了,下面是我改写的函数,
把城市的citycode传给该函数即可:


  1. GetWeatherInfo()
  2. {
  3.   #如果已经存在该页面,先删除
  4.   if [  test -f ss$1.htm ]
  5.   then
  6.   rm  ss$1.htm
  7.   fi
  8.   
  9.   #下载页面
  10.   wget http://weather.qq.com/inc/ss$1.htm >/dev/null 2>&1
  11.   
  12.   #测试下载成功没有
  13.   if [  test -f ss$1.htm ]
  14.   then
  15.        echo "获取天气页面出错...可能该城市的天气报告页面不存在.."
  16.        exit 1
  17.   fi
  18.   
  19. #分析页面
  20.   weather= `cat ss${1}.htm |grep "/images/r_tembg5.gif"|sed 's/.*"center">//g' |sed 's/<\/td>//'`
  21.   temperature= `cat ss${1}.htm|sed -n '/tem1.gif/{N;p}'|sed '1d'|sed  's/.*center">//g'`
  22.   windforce=`cat ss${1}.htm|sed -n '/tem2.gif/{N;p}'|sed '1d'|sed 's/.*"center">//g' |sed 's/<\/td>//'`
  23.   ultraviolet=`cat ss${1}.htm|sed -n '/tem3.gif/{N;p}'|sed '1d'|sed 's/.*"center">//g' |sed 's/<\/td>//'`
  24.   air= `cat ss${1}.htm|sed -n '/tem5.gif/{N;p}'|sed '1d'|sed 's/.*"center">//g' |sed 's/<\/td>//'`

  25.   #打印相关信息
  26.    echo -e "天气\t\t$weather"
  27.    echo -e "温度\t\t$temperature"
  28.    echo -e "风力\t\t$windforce"
  29.    echo -e "紫外线\t\t$ultraviolet"
  30.    echo -e "空气\t\t$air"

  31.   #最后删除页面
  32.    rm ss$1.htm
  33. }
复制代码



另外,这种方法无法得到空气情况,不爽。。。但weather.qq.com主页是可以正确显示的。。
回复 支持 反对

使用道具 举报

发表于 2005-12-13 21:28:45 | 显示全部楼层

  1. [No.539 21:32:52 bash ]# cat myweather.sh
  2. #! /bin/bash

  3. # 修改了处理过程和优化了速度
  4. # 经过修改已经支持城市代码和城市名
  5. # 支持同时查询多个城市天气的查询

  6. city_code_file="/linux/xuexi/bash/code_city.db"
  7. cd /tmp

  8. usage()
  9. {
  10. echo "Usage: `basename $0` [codes/citys] "
  11. echo
  12. cat << CITY
  13. 1       香港    2       澳门            17      哈尔滨  28      乌鲁木齐        56      西宁
  14. 57      兰州    69      呼和浩特        78      银川    82      石家庄          84      太原
  15. 103     长春    115     沈阳            125     北京    127     天津            140     济南
  16. 150     拉萨    166     成都            179     昆明    186     西安            189     郑州
  17. 211     武汉    212     重庆            218     长沙    227     贵阳            232     桂林
  18. 244     南京    248     合肥            252     上海    255     杭州            264     南昌
  19. 276     福州    280     台北            287     厦门    292     广州            295     南宁
  20. 296     深圳    303     海口
  21. CITY
  22. echo

  23. exit 0
  24. }

  25. getweather()
  26. {
  27.         grep "<td height="23"" ss.html > ss.txt
  28.         city=$(grep "<td height="23"" ss.txt | sed -n '1p' | sed 's/[[:lower:][:digit:]\<\>="\/_\. ]//g')
  29.         weat=$(grep "<td height="23"" ss.txt | sed -n '2p' | sed 's/.*center">//' | sed 's/<.*//')
  30.         temp=$(grep "<td height="23"" ss.txt | sed -n '4p' | sed 's/.*>//')
  31.         wind=$(grep "<td height="23"" ss.txt | sed -n '6p' | sed 's/.*center">//' | sed 's/<.*//')
  32.         viol=$(grep "<td height="23"" ss.txt | sed -n '8p' | sed 's/.*center">//' | sed 's/<.*//')
  33.         aire=$(grep "<td height="23"" ss.txt | sed -n '10p' | sed 's/.*center">//' | sed 's/<.*//')
  34. }


  35. getall()
  36. {
  37.         wget  -O /tmp/ss.html  http://weather.qq.com/inc/ss${code}.htm > /dev/null 2>&1
  38.         getweather
  39.         showweather

  40.         rm -f ss.html  ss.txt > /dev/null 2>&1
  41. }

  42. showweather()
  43. {
  44.         echo
  45.         echo -e "\t城  市:      $city"
  46.         echo -e "\t天  气:      $weat"
  47.         echo -e "\t温  度:      $temp"
  48.         echo -e "\t风  力:      $wind"
  49.         echo -e "\t空  气:      $aire"
  50.         echo -e "\t紫外线:      $viol"
  51.         echo
  52. }

  53. ####### MAIN #########

  54. [[ $1 == "-h" ]] || [[ $1 == "--help" ]] && usage

  55. if [[ -z $1 ]];then
  56.         set 103 303
  57. fi

  58. for citycode in "$@";do
  59.         code=$(grep -w "$citycode"  $city_code_file | awk '{print $1}')
  60.         if [[ -n $code ]];then
  61.                 getall
  62.         else
  63.                 echo "$citycode not invalid."
  64.                 usage
  65.         fi
  66. done

  67. exit 0
复制代码


城市名和城市代码数据库

  1. [No.540 21:33:05 bash ]# cat code_city.db
  2. 1 香港
  3. 2 澳门
  4. 17 哈尔滨
  5. 28 乌鲁木齐
  6. 56 西宁
  7. 57 兰州
  8. 69 呼和浩特
  9. 78 银川
  10. 82 石家庄
  11. 84 太原
  12. 103 长春
  13. 115 沈阳
  14. 125 北京
  15. 127 天津
  16. 140 济南
  17. 150 拉萨
  18. 166 成都
  19. 179 昆明
  20. 186 西安
  21. 189 郑州
  22. 211 武汉
  23. 212 重庆
  24. 218 长沙
  25. 227 贵阳
  26. 232 桂林
  27. 244 南京
  28. 248 合肥
  29. 252 上海
  30. 255 杭州
  31. 264 南昌
  32. 276 福州
  33. 280 台北
  34. 287 厦门
  35. 292 广州
  36. 295 南宁
  37. 296 深圳
  38. 303 海口
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-12-14 08:48:28 | 显示全部楼层
楼主的桌面背景好PP,能否分享?
回复 支持 反对

使用道具 举报

发表于 2005-12-14 09:42:53 | 显示全部楼层
弱弱的问一下,怎样查询到自己城市的代码
回复 支持 反对

使用道具 举报

发表于 2005-12-14 13:29:33 | 显示全部楼层
弱弱的问一下,root-tail用哪个中文字体啊?我的不能显示中文
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表