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数组
Oct 09 PHP
PHP学习之PHP变量
Oct 09 PHP
用PHP实现的随机广告显示代码
Jun 14 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
PHP模板解析类实例
Jul 09 PHP
十个PHP高级应用技巧果断收藏
Sep 25 PHP
PHP微信红包生成代码分享
Oct 06 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 PHP
如何运行/调试你的PHP代码
Oct 23 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
php中批量替换文件名的实现代码
2011/07/20 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
捕获关闭窗口的脚本
2009/01/10 Javascript
childNodes.length与children.length的区别
2009/05/14 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
Python如何发布程序的详细教程
2018/10/09 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
简单了解如何封装自己的Python包
2020/07/08 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
python 写一个性能测试工具(一)
2020/10/24 Python
python Gabor滤波器讲解
2020/10/26 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
个人简历自荐信
2013/12/05 职场文书
活动志愿者自荐信
2014/01/27 职场文书
人事部专员岗位职责
2014/03/04 职场文书
关于安全演讲稿
2014/05/09 职场文书
学生安全责任书范本
2014/07/24 职场文书
大学毕业晚会开场白
2015/05/29 职场文书