Chinaunix

标题: perl 写的查询天气预报的脚本 [打印本页]

作者: skskevin    时间: 2010-06-09 11:14
标题: perl 写的查询天气预报的脚本
#! /usr/bin/perl -s
#查询天气预报的脚本,只取今天和明天的天气预报

use LWP::Simple;
use strict;
use Encode;
use HTML::TableExtract;
use DBI;
#binmode(STDOUT, ':encoding(gb2312)');
#消取输出缓冲
$| = 1;

my $html=get("http://www.weather.com.cn/html/weather/101010100.shtml");
my $tree = HTML::TableExtract->new( attribs => { class => 'yuBaoTable' } );
$tree->parse($html);
my $i=0;
my $msg="";
my $m="";
$| = 1;
foreach my $ts ($tree->tables) {
if ($i<2){
    print ".";
    print " Complete!\n" if ($i == 1);
    sleep(1);
    foreach my $row ($ts->rows) {
        $msg=join(',', @$row);
        
        $msg = encode("gb2312", $msg);
      #print "   ", join(' ', @$row),"\n";
       #print "$msg\n";
       my @aa=split(/,/,$msg);
       foreach my $item(@aa){
         if ($item){
                $m=$m.$item.";";
         
        $m=~s/\s//g;
      
                }
         
        }
     
       #print "$aa[0]\n$aa[1]\n$aa[2]\n$aa[3]\n";
   }
    $i++;
}
}
$m=~tr/;/\n/s;
print "$m\n";

还可以利用短信猫,将信息发到手机上。呵呵,我就是这么干的,免费的天气预报!
作者: liyangole    时间: 2010-06-09 11:16
回复 1# skskevin


    顶一下,一起战斗的兄弟
作者: gilet    时间: 2010-06-09 11:52
我以前也是用自己提取的天气预报,但是要挂到服务器上跑crontab,后来就用google的日历提醒来发天气预报了
作者: iamlimeng    时间: 2010-06-09 12:56
支持原创,顶一下!
作者: mouse.rice    时间: 2010-06-10 17:12
use DBI;
貌似多余吧,呵呵。
作者: chinalinuxer    时间: 2010-06-10 18:10
还是GOOGLE的好
作者: ykredrum    时间: 2010-06-10 20:10
谢谢楼主分享哈,
不过use DBI好像没有用到
作者: aef25u    时间: 2010-06-10 22:43
本帖最后由 aef25u 于 2010-06-10 22:52 编辑

回复 6# chinalinuxer
  1. #!/usr/bin/perl
  2. use utf8;
  3. use URI;
  4. use Web::Scraper;

  5. binmode( STDOUT, ':encoding(utf8)' );

  6. my $url   = "http://www.weather.com.cn/html/weather/101280101.shtml?";
  7. my $proce = scraper {
  8.     process '.yuBaoTable > tr', 'rows[]' =>scraper {
  9.         process 'td', 'cols[]' => 'TEXT';
  10.     };
  11. };

  12. my $res = $proce->scrape( URI->new($url) );
  13. for my $row ( @{ $res->{rows} } ) {

  14.     my @weather=@{ $row->{cols} };
  15.     print "@weather\n";

  16. }

复制代码
这个实现怎样,我觉得perl也不错
作者: 机器猫II    时间: 2010-06-11 11:41
哈哈谢了,高效廉价的天气预报,如果用在证券上,可以给不方便看盘的人提供个股即时报价
作者: 机器猫II    时间: 2010-06-11 11:43
楼主有空再介绍下短信猫,这个组合应用很爽
作者: skskevin    时间: 2010-06-11 13:17
回复 10# 机器猫II
我们公司用的短信猫带一个短信猫通信中间件(即基于数据库接口的短信猫通信服务器软件),只需要提交短信队列到数据库里即可。
代码很简单,只需要连接数据库写入数据即可。

sub SendsmsMysql{
        my($mobilenum,$msg) = @_;
        my $dbh = DBI->connect("DBI:mysql:database=数据库名称;host=服务器IP地址;","用户名", "密码");
  if($dbh){
      $dbh->do("set character_set_client='gbk'");  
      $dbh->do("set character_set_connection='gbk'");  
      my  $sql = qq { insert into T_SendTask (DestNumber,Content)values('$mobilenum','$msg') };
          print $sql,$/;
        my  $sth = $dbh->prepare($sql);
        $sth->execute();
        $sth->finish();
        sleep(2);
  }
}
作者: 机器猫II    时间: 2010-06-11 13:41
linux对短信猫的支持怎么样
作者: yaoliwei    时间: 2010-06-11 13:51
上面2个天气预报 我运行都是乱码 xp下面,
作者: skskevin    时间: 2010-06-11 17:08
回复 13# yaoliwei

去掉  “binmode(STDOUT, ':encoding(gb2312)');” 前面的注释符号,如果还不行,改成UTF8试试。
作者: skskevin    时间: 2010-06-11 17:09
回复 12# 机器猫II


    linux 对短信猫的支持,感觉还不错。至少目前还没出现什么问题。
作者: yaoliwei    时间: 2010-06-11 17:51
回复  yaoliwei

去掉  “binmode(STDOUT, ':encoding(gb2312)');” 前面的注释符号,如果还不行,改成U ...
skskevin 发表于 2010-06-11 17:08



试了还是不行 我本地cmd窗口中的字符集是936(简体中文)(chcp命令)
作者: iamlimeng    时间: 2010-06-12 10:17
use utf8;  #注释掉此行


binmode( STDOUT, ':encoding(utf' );
改为
binmode( STDOUT, ':encoding(gbk)' );

应该就能显示中文,我在我的XP上是可以的
作者: yaoliwei    时间: 2010-06-12 11:07
use utf8;  #注释掉此行


binmode( STDOUT, ':encoding(utf' );
改为
binmode( STDOUT, ':encodi ...
iamlimeng 发表于 2010-06-12 10:17



  我的还是不行 我也是这修改了encode成gbk 也还是不行 晕死。
请看我的code 就稍微改了一点点。 你能把你的code贴一下嘛 谢谢。
我的运行结果如下 开始几行有一些提示 貌似和我的936 codepage有关。
  1. C:\>perl test.pl
  2. .. Complete!
  3. "\x{00a1}" does not map to cp936 at test.pl line 51.
  4. "\x{00a1}" does not map to cp936 at test.pl line 51.
  5. "\x{00a1}" does not map to cp936 at test.pl line 51.
  6. "\x{00a1}" does not map to cp936 at test.pl line 51.
  7. "\x{00a1}" does not map to cp936 at test.pl line 51.
  8. "\x{00a1}" does not map to cp936 at test.pl line 51.
  9. "\x{00a1}" does not map to cp936 at test.pl line 51.
  10. 12????????????
  11. ????\x{00a1}è?
  12. ¨|??
  13. ¨|?????30???
  14. ?????????¨|?????
  15. ???¨|??
  16. ?\x{00a1}è?¨|??
  17. ?\x{00a1}è????
  18. ??????20???
  19. ?????????¨|?????
  20. ???¨|??
  21. 13????????????
  22. ????\x{00a1}è?
  23. ¨|??¨|??¨|?\x{00a1}§
  24. ¨|?????31???
  25. ?????????¨|?????
  26. ???¨|??
  27. ?\x{00a1}è?¨|??
  28. ¨|??¨|?\x{00a1}§
  29. ??????19???
  30. ?????????¨|?????
  31. ???¨|??
复制代码

作者: iamlimeng    时间: 2010-06-12 12:33
回复 18# yaoliwei

建议你重装一下PERL,在XP上,ActivePerl很稳定,我一直用。
作者: yaoliwei    时间: 2010-06-12 13:40
回复  yaoliwei

建议你重装一下PERL,在XP上,ActivePerl很稳定,我一直用。
iamlimeng 发表于 2010-06-12 12:33



我用的是strawberry perl  不是activestate perl。
很奇怪。。。。。
作者: aef25u    时间: 2010-06-12 15:11
回复 20# yaoliwei

我写的那个就是在strawberry-perl上写的,在padre输出。
作者: ykredrum    时间: 2010-06-12 20:59

这个怎么回事啊
这个模块没有new方法?
作者: iamlimeng    时间: 2010-06-13 08:40
看很多人中文显示不正常或用其他模块解析不正常,改了一个直接用正则提取天气信息的,供大家参考:
(XP,ActivePerl 5.10.1007运行正常,中文亦正常)
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use Encode;
  5. use LWP::Simple;

  6. my $html=get("http://www.weather.com.cn/html/weather/101250101.shtml");
  7. my @div = ($html =~ /<div class="weatherYubao.*?>(.*?)<\/div>/isg);
  8. my $data = encode("gbk",join('',@div));
  9. $data =~ s/\n|\r//g;

  10. my ($title) = ($data =~ /<h1 class="weatheH1">(.*?)<span>/i);
  11. $title =~ s#&nbsp;|\s+# #ig;
  12. print "\n$title\n\n";

  13. my @forcast_table = ($data =~ /(<table.*?>.*?<\/table>)/ig);
  14. foreach (@forcast_table) {
  15.          if (/class="yuBaoTable"/i) {
  16.                  s/<.*?>//g;
  17.                  s/\s+/\t/g;
  18.                   s/^\t/ ++ /;
  19.                   s/\t白天/\n 白天/;
  20.                   s/\t夜间/\n 夜间/;
  21.                   print "$_\n\n";
  22.          }
  23. }
  24. print "\7";

  25. <STDIN>;
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2