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 删除无限级目录与文件代码共享
Nov 22 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
深入php define()函数以及defined()函数的用法详解
Jun 05 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
PHP简单生成缩略图相册的方法
Jul 29 PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
Nov 20 PHP
thinkphp5+layui实现的分页样式示例
Oct 08 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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
把77A收信机改造成收音机
2021/03/02 无线电
PHP+DBM的同学录程序(2)
2006/10/09 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
js实现列表按字母排序
2020/08/11 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
基于python操作ES实例详解
2019/11/16 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
大二自我鉴定范文
2013/10/05 职场文书
单位授权委托书范本
2014/09/26 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
死亡赔偿协议书
2015/01/28 职场文书
司机个人年终总结
2015/03/03 职场文书
八年级作文之感恩
2019/11/22 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang