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 26 PHP
php中利用post传递字符串重定向的实现代码
Apr 21 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
php实现文件下载实例分享
Jun 02 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
php实现简单文件下载的方法
Jan 30 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 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结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python求最大连续子数组的和
2018/07/07 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
英文简历自荐信范文
2013/12/11 职场文书
医学实习生自我鉴定
2013/12/12 职场文书
自我评价如何写好?
2014/01/05 职场文书
幼儿园元旦活动感言
2014/03/02 职场文书
四下基层实施方案
2014/03/28 职场文书
岗位竞聘书范文
2014/03/31 职场文书
领导班子四风表现材料
2014/08/23 职场文书
高中班主任评语
2014/12/30 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang