- 利用PHP抓取QQ天气预报
- 发布时间:2009-07-20 14:08:20 浏览数:7830 发布者:superadmin 设置字体【大 中 小】
在抓取QQ天气预报之前我们要准备的工作。
如何用PHP获取网页内容?
如何过滤掉多余的数据?
如何缓存我们需要的数据?
我们带着问题进入主题。
〈?
/*
** 1、首先我们要找到QQ天气预报的地址($sUrl),找不到就无法进行下一步了,
** 2、访问下$sUrl吧,查看源代码进行分析.
*/
$sUrl = "http://www.soso.com/tb.q";
$sWeatherCachePath = '../_cache/weather';
$sCacheTime = 600;
/*
** ,从原代码看到只支持这些城市。
** 好吧,将它列入数组吧。
*/
$aCity = array('淮南','马鞍山','淮北','铜陵','滁州','巢湖','池州','宣城','亳州','宿州','阜阳','六安','蚌埠','合肥','芜湖','安庆','黄山',
'澳门',
'北京',
'奉节','重庆','涪陵',
'莆田','浦城','南平','宁德','福州','龙岩','三明','泉州','漳州','厦门',
'张掖','金昌','武威','兰州','白银','定西','平凉','庆阳','甘南','临夏','天水','嘉峪关','酒泉','陇南',
'南雄','韶关','清远','梅州','肇庆','广州','河源','汕头','深圳','汕尾','湛江','阳江','茂名','佛冈','梅县','电白','高要','珠海','佛山','江门','惠州','东莞','中山','潮州','揭阳','云浮',
'桂林','河池','柳州','百色','贵港','梧州','南宁','钦州','北海','防城港','玉林','贺州','来宾','崇左',
'毕节','遵义','铜仁','安顺','贵阳','黔西南布依族苗族自治州','六盘水',
'海口','三亚','屯昌','琼海','儋州','文昌','万宁','东方','澄迈','定安','临高','白沙黎族自治县昌','乐东黎族自治县','陵水黎族自治县','保亭黎族苗族自治县','琼中黎族苗族自治县',
'邯郸','衡水','石家庄','邢台','张家口','承德','秦皇岛','廊坊','唐山','保定','沧州',
'安阳','三门峡','郑州','南阳','周口','驻马店','信阳','开封','洛阳','平顶山','焦作','鹤壁','新乡','濮阳','许昌','漯河','商丘','济源',
'大兴安岭','黑河','齐齐哈尔','绥化','鹤岗','佳木斯','伊春','双鸭山','哈尔滨','鸡西','漠河','大庆','七台河','牡丹江','绥芬河',
'襄樊','荆门','黄冈','恩施土家族苗族自治州','武汉','麻城','黄石','鄂州','孝感','咸宁','随州','仙桃','天门','潜江','神农架','枣阳',
'张家界','岳阳','怀化','长沙','邵阳','益阳','郴州','桑植','沅陵','南岳','株洲','湘潭','衡阳','娄底','常德',
'辽源','通化','白城','松原','长春','吉林市','桦甸','延边朝鲜族自治州','集安','白山','四平',
'无锡','苏州','盱眙','赣榆','东台','高邮','镇江','泰州','宿迁','徐州','连云港','淮安','南京','扬州','盐城','南通','常州',
'庐山','玉山','贵溪','广昌','萍乡','新余','宜春','赣州','九江','景德镇','南昌','鹰潭','上饶','抚州',
'葫芦岛','盘锦','辽阳','铁岭','阜新','朝阳','锦州','鞍山','沈阳','本溪','抚顺','营口','丹东','瓦房店','大连',
'呼伦贝尔','兴安盟','锡林郭勒盟','巴彦淖尔盟','包头','呼和浩特','锡林浩特','通辽','赤峰','乌海','鄂尔多斯','乌兰察布盟',
'石嘴山','银川','吴忠','固原',
'海北藏族自治州','海南藏族自治州','西宁','玉树藏族自治州','黄南藏族自治州','果洛藏族自治州','海西蒙古族藏族自治州','海东',
'德州','滨州','烟台','聊城','济南','泰安','淄博','潍坊','青岛','济宁','日照','泰山','枣庄','东营','威海','莱芜','临沂','菏泽',
'长治','晋中','朔州','大同','吕梁','忻州','太原','阳泉','临汾','运城','晋城','五台山',
'榆林','延安','西安','渭南','汉中','商洛','安康','铜川','宝鸡','咸阳',
'上海',
'甘孜藏族自治州','阿坝藏族羌族自治州','成都','绵阳','雅安','峨眉山','乐山','宜宾','巴中','达州','遂宁','南充','泸州','自贡','攀枝花','德阳','广元','内江','广安','眉山','资阳','凉山彝族自治州',
'台北',
'天津','塘沽区',
'那曲','日喀则','拉萨','山南','阿里','昌都','林芝',
'香港',
'昌吉回族自治州','克孜勒苏柯尔克孜自治州','伊犁哈萨克自治州','阿拉尔','克拉玛依','博尔塔拉蒙古自治州','乌鲁木齐','吐鲁番','阿克苏','石河子','喀什','和田','哈密','奇台',
'昭通','丽江','曲靖','保山','大理白族自治州','楚雄彝族自治州','昆明','瑞丽','玉溪','临沧','思茅','红河哈尼族彝族自治州','文山壮族苗族自治州','西双版纳傣族自治州','德宏傣族景颇族自治州','怒江傈傈族自治州','迪庆藏族自治州',
'湖州','嵊州','平湖','石浦','宁海','洞头','舟山','杭州','嘉兴','金华','绍兴','宁波','衢州','丽水','台州','温州'
);
/*
** 查询URL形式 actions.php?actions=tq&ctiy=XXXX;
** 这里我写成类,这里为了展示,我将过程写得这里来。
*/
if (isset($_GET['actions'])) {
$sActions = $_GET['actions'];
if ($sActions == 'tq') {
$sCity = isset($_GET['city']) ? $_GET['city']:'广州';
$sUrl = $sUrl.'?city='.$sCity;
if (!in_array($sCity,$aCity)) {
echo "对不起,你查询的地区超出服务范围!";
exit();
}
$sWeatherCacheFile = $sWeatherCachePath.'/'.md5($sCity).'.txt';
if (file_exists($sWeatherCacheFile) &&
(filemtime($sWeatherCacheFile) >
(time() - $sCacheTime))){
$sWeather = file_get_contents($sWeatherCacheFile);
} else {
$handle = @fopen($sUrl,"rb"); // PHP获取网页内容的关键
do {
$data = @fread($handle,8192);
if (strlen($data) == 0) break;
$contents .=$data;
} while (true);
@fclose($handle);
// 过滤掉多余的数据
$sContents = strstr($sContents,"<ul><li>");
$end = strpos($sContents,"</li></ul></div></div>");
$sContents = substr($sContents,0,$end);
$sContents = str_replace('<br/><strong',' <strong',
$sContents);
$sWeather = str_replace('后天','\n后天',
str_replace('明天','\n明天',
str_replace('今天','\n今天',
strip_tags($sContents))));
/*
** 写入缓存
** 这里我已写成类。为了展示,我将过程写得这里来。
*/
$oldmask = @umask(0);
$fp = @fopen($sWeatherCacheFile,'w');
@flock($fp,3);
if (!$fp) {
return false;
} else {
@fwrite($fp,$sWeather);
@fclose($fp);
@umask($oldmask);
@chmod($sWeatherCacheFile,0777);
return true;
}
}
echo $sWeather;
}
}
?>