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 相关文章推荐
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
PHP 引用是个坏习惯
Mar 12 PHP
Fatal error: Call to undefined function curl_init()解决方法
Apr 09 PHP
PHP 动态生成静态HTML页面示例代码
Jan 15 PHP
thinkphp实现面包屑导航(当前位置)例子分享
May 10 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
Apr 30 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
php的socket编程详解
Nov 20 PHP
php+mysql开发中的经验与常识小结
Mar 25 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 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/10/10 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
php实现的xml操作类
2016/01/15 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
vue实现评价星星功能
2020/06/30 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
python爬取网站数据保存使用的方法
2013/11/20 Python
python生成随机mac地址的方法
2015/03/16 Python
使用Python生成XML的方法实例
2017/03/21 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
最新的大学生找工作自我评价
2013/09/29 职场文书
沈阳故宫导游词
2015/01/31 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
在Python中如何使用yield
2021/06/07 Python
Python中else的三种使用场景
2021/06/16 Python
java解析XML详解
2021/07/09 Java/Android