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 02 PHP
理解和运用PHP中的多态性[译]
Aug 02 PHP
浅析PHP中Collection 类的设计
Jun 21 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
Jul 10 PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
Apr 20 PHP
PhpStorm配置Xdebug调试的方法步骤
Feb 02 PHP
PHP生成图表pChart的示例解析
Jul 31 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 常见郁闷问题答解
2006/11/25 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
详解Nodejs内存治理
2018/05/13 NodeJs
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
python模块之StringIO使用示例
2015/04/08 Python
Django中处理出错页面的方法
2015/07/15 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
flask中过滤器的使用详解
2018/08/01 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
python如何输出反斜杠
2020/06/18 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
初二政治教学反思
2014/01/12 职场文书
大学社团活动总结
2014/04/26 职场文书
建筑投标担保书
2014/05/20 职场文书
社保委托书怎么写
2014/08/02 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
微信小程序调用python模型
2022/04/21 Python