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 25 PHP
php木马攻击防御之道
Mar 24 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
php IP转换整形(ip2long)的详解
Jun 06 PHP
浅析php数据类型转换
Jan 09 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
php操作mongoDB实例分析
Dec 29 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
thinkPHP框架实现多表查询的方法
Jun 14 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
Thinkphp中Create方法深入探究
2014/06/16 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
Jquery attr(&quot;checked&quot;) 返回checked或undefined 获取选中失效
2013/10/10 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
Python中的元类编程入门指引
2015/04/15 Python
粗略分析Python中的内存泄漏
2015/04/23 Python
Python自动登录126邮箱的方法
2015/07/10 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
python SocketServer源码深入解读
2019/09/17 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
python之随机数函数的实现示例
2020/12/30 Python
flask框架中的cookie和session使用
2021/01/31 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
建筑结构施工专业推荐信
2014/02/21 职场文书
会计求职自荐信
2014/06/20 职场文书
商场租赁意向书
2014/07/30 职场文书
繁星春水读书笔记
2015/06/30 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
volatile保证可见性及重排序方法
2022/08/05 Java/Android