php采集天气预报代码

网络整理 - 07-26

<?php
/**
* 采集天气预报
* @example
*   weather::$cache = root.'chache/'; //如果不改缓存目录,可以不写
*  $array = weather::get();
* @author lrenwang
* @e-mail lrenwang@qq.com
*
*/
class weather{
  /**
   * 域名
   *
   * @var string
   */
  static public $domain='http://qq.ip138.com';
  /**
   * 城市的连接
   * @example /省份/城市.htm
   *
   * @var string
   */
  static public $url='/weather/hebei/qinhuangdao.htm';
  /**
   * 缓存目录
   *
   * @var string
   */
  static public $cache='cache/';
  /**
   * 更新频率,小时为单位
   *
   * @var unknown_type
   */
  static public $h=1;
  
  /**
   * 天气预报对应的图片路径
   *
   * @var unknown_type
   */
  static public $img = 'images/weather/';

  /**
   * 获得今日,明日天气预报
   *
   * @return array
   */
  
  static function get()
  {
    $time=time();
    
    //缓存文件位置
    $cache_file = self::$cache.'weather.dat';
    //判断缓存文件是否存在,没有则生成
    if(!is_file($cache_file)){
      if(!is_dir(self::$cache))
      mkdir(self::$cache,0777,true);
      self::get_($cache_file);
    }
    
    //判断缓存是否过期,过期则重新生成
    if($time-filemtime($cache_file)>=3600*3){
      self::get_($cache_file);
    }
    $arr=unserialize(file_get_contents($cache_file));
    return $arr;
  }
  
  /**
   * 获得缓存
   *
   * @param unknown_type $cache_file
   */
  static public function get_($cache_file)
  {
    $con = file_get_contents(self::$domain.self::$url);
    preg_match('~<table borderColorDark="#ffffff".*?>(.*?)</table>~s',$con,$table);
    preg_match_all('~<tr.*?>(.*?)</tr>~s',$table[1],$trs);
    $i=0;
    $array = array();

    foreach ($trs[1] as $tr)
    {
      ++$i;
      preg_match_all('~<t[dh].*?>(.*?)</t[dh]>~s',$tr,$tds);
      $array[0][] = self::I($tds[1][1]);
      $array[1][] = self::I($tds[1][2]);
    }
    $array[0][1] = self::get_img($array[0][1]);
    $array[1][1] = self::get_img($array[1][1]);
    file_put_contents($cache_file,serialize($array));
  }

  /**
   * 数据输出测试
   *
   * @param unknown_type $data
   * @param unknown_type $s
   */
  static public function P($data,$s=0)
  {
    echo "<pre>";
    if (is_array($data))
    var_export($data);
    else
    echo $data;
    echo '</pre>';
    if ($s==0)
    exit();
  }
  /**
   * 转码
   *
   * @param unknown_type $str
   * @return unknown
   */
  static public function I($str)
  {
    return iconv('GB2312','UTF-8',$str);
  }

  /**
   * 获得图片的URL,此处可扩展,把图片抓取到本地, 增加访问速度
   *
   * @param string $str
   * @return string
   */
  static public function get_img($str)
  {
    preg_match('~src=["\']?(.*?)["\']? ~s',$str,$p);
    return self::$img.pathinfo($p[1],PATHINFO_BASENAME);
  }
}
//print_r();
$weather = weather::get();
echo "<img src={$weather[0][1]}>";
?>