PHP实现采集中国天气网未来7天天气


Posted in PHP onOctober 15, 2014

前言

我们在写一个Web程序的时候,总会想着把自己的网站更美观一些,功能能更多一些,有时候写一些小的工具或者加上小的插件会让我们的站点更加完善。比如万年历功能,比如我们现在要讲的天气预报功能。

当然我们没法利用专业的卫星接受数据,所以我们的天气数据来自现有的天气预报网站。利用天气预报网站提供的数据服务,我们可以写一个PHP爬虫,然后动态采集我们所需要的数据,并且在目标站点更新数据的时候,我们的程序也能做到同步更新,自动地获取数据。

下面就介绍一下如何编写一个简单的PHP数据采集程序(PHP爬虫)。

原理

给定一个网页的URL,使用PHP下载该网页并得到网页内容,然后通过正则表达式将其中我们感兴趣的数据提取出来,然后输出。

具体在这个例子中,我们要抓取的网页是 http://www.weather.com.cn/weather/101050101.shtml,我们感兴趣的是页面中的未来7天天气情况。

实现

0.获取天气预报网页的URL:

$url = "http://www.weather.com.cn/weather/101050101.shtml";

$page_content = file_get_contents($url);

在这里,file_get_contents() 函数会将 $url 指向的网页下载下来,并把网页内容作为一个字符串返回。于是,$page_content 变量中就是我们要抓取的网页的全部HTML代码了。接下来,我们要从其中抽取我们需要的数据。

1.使用正则表达式匹配符合条件的字符串

先输出 $page_content 的值,然后查看网页源代码,观察可知我们需要的字符串可以在

<!--day 1 -->

......

<!--day 7 -->

这两行的注释里找到。

使用正则表达式来取得 <!--day 1--> 和 <!--day 7--> 之间的所有内容:

eregi("<!--day 1-->(.*)<!--day 7-->",$page_content,$res);

2.补全页面中图片的路径

由于远程网页中的图片路径都是像 /m2/i/icon_weather/29x20/d01.gif 这样的相对路径,我们需要把这些路径补全,在它们前面加上 http://www.weather.com.cn。

$forecast = str_replace("<img src="","<img src="http://www.weather.com.cn",$res[0]);

至此,$forecast 中就是我们需要的天气预报信息了。这个简单的PHP爬虫也就写好了。

源代码

以下是这个抓取天气预报小程序的完整源代码,其中添加了一些测量各部分程序运行时间的代码,并可以通过设置 $start 和 $end 的值来控制抓取哪几天的信息。

$url = "http://www.weather.com.cn/weather/101050101.shtml";

$t1 = time();

    

$page_content = file_get_contents($url);

$t2 = time();
$start = 1;

$end = 3;
if ($end > 7){

    echo "超出预报能力范围,请重新设置!";

}else {

    echo "未来".($end-$start)."天哈尔滨的天气预报("

              .date('Y-m-j')."发布)";
    eregi("--day $start--(.*)--day $end--", $page_content, $res);
    $forecast = str_replace("<img src=\"",

        "<img src=\"http://www.weather.com.cn", $res[0]);

    $t3 = time();
    echo $forecast;
    echo 'First step costs '.($t2 - $t1).' ms.';

    echo 'Last step costs '.($t3 - $t2).' ms.';

}

其他应用例子

同样的思路可以尝试的有:NBA每天的比分牌、今日哈工大的新闻同步、股市行情等等。都能实现同步实时更新。暂时只想到这些,欢迎大家拍砖~

PHP 相关文章推荐
PHP语法速查表
Dec 06 PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
PHP以及MYSQL日期比较方法
Nov 29 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
PHP递归复制、移动目录的自定义函数分享
Nov 18 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
php实现的用户查询类实例
Jun 18 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
Laravel学习教程之model validation的使用示例
Oct 23 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
跟我学Laravel之视图 &amp; Response
Oct 15 #PHP
跟我学Laravel之请求与输入
Oct 15 #PHP
跟我学Laravel之路由
Oct 15 #PHP
跟我学Laravel之请求(Request)的生命周期
Oct 15 #PHP
跟我学Laravel之配置Laravel
Oct 15 #PHP
跟我学Laravel之安装Laravel
Oct 15 #PHP
跟我学Laravel之快速入门
Oct 15 #PHP
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
PHP 程序员应该使用的10个组件
2009/10/31 PHP
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
Python中使用摄像头实现简单的延时摄影技术
2015/03/27 Python
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
Python实现异步IO的示例
2020/11/05 Python
高中学生干部学习的自我评价
2014/02/21 职场文书
大学生就业意向书范文
2014/04/01 职场文书
行政监察建议书
2014/05/19 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
工作试用期自我评价
2015/03/10 职场文书
圣诞晚会主持词
2015/07/01 职场文书
三八节祝酒词
2015/08/11 职场文书
感谢师恩主题班会
2015/08/17 职场文书