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语法(2)
Oct 09 PHP
phpMyAdmin2.11.6安装配置方法
Aug 24 PHP
php获取参数的几种方法总结
Feb 18 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
ThinkPHP路由详解
Jul 27 PHP
php之static静态属性与静态方法实例分析
Jul 30 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
Yii1.1框架实现PHP极光推送消息通知功能
Sep 06 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 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 邮件发送问题解决
2014/03/22 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
php加密解密字符串示例
2016/10/13 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python提取内容关键词的方法
2015/03/16 Python
django定期执行任务(实例讲解)
2017/11/03 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
促销活动总结范文
2014/04/30 职场文书
成立公司计划书
2014/05/07 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
音乐幼师求职信
2014/07/09 职场文书
拉贝日记观后感
2015/06/05 职场文书
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers