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制作静态网站的模板框架
Oct 09 PHP
PHP5 安装方法
Oct 09 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
Mar 24 PHP
nginx+php-fpm配置文件的组织结构介绍
Nov 07 PHP
使用php实现下载生成某链接快捷方式的解决方法
May 07 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
php curl post 时出现的问题解决
Jan 30 PHP
ThinkPHP之M方法实例详解
Jun 20 PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
laravel使用数据库测试注意事项
Apr 10 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实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
php Calender(日历)代码分享
2014/01/03 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
python实现提取百度搜索结果的方法
2015/05/19 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
Python sys模块常用方法解析
2020/02/20 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
爱晚亭导游词
2015/02/09 职场文书
护士辞职信怎么写
2015/02/27 职场文书
义卖募捐活动总结
2015/05/09 职场文书
电影红河谷观后感
2015/06/11 职场文书
2016公司新年问候语
2015/11/11 职场文书