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生成静态页的实现方法
May 10 PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 PHP
Php output buffering缓存及程序缓存深入解析
Jul 15 PHP
PHP中file_get_contents高?用法实例
Sep 24 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 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读取超大文件的实例代码
2012/04/01 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
取得父标签
2006/11/14 Javascript
Javascript 作用域使用说明
2009/08/13 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
俄语专业毕业生推荐信
2013/10/28 职场文书
保护环境的建议书
2014/03/12 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
旅游活动总结
2014/08/27 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
报到证办理个人委托书
2014/10/06 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
小学庆六一主持词
2015/06/30 职场文书
思品教学工作总结
2015/08/10 职场文书
Python中的 No Module named ***问题及解决
2022/07/23 Python