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
用文本文件实现的动态实时发布新闻的程序
Oct 09 PHP
生成静态页面的PHP类
Nov 25 PHP
Gregarius中文日期格式问题解决办法
Apr 22 PHP
php使用curl存储cookie的示例
Mar 31 PHP
PHP 正则表达式小结
Feb 12 PHP
Yii2实现让关联字段支持搜索功能的方法
Aug 10 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
PHP使用DOM对XML解析处理操作示例
Jul 04 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
laravel通用化的CURD的实现
Dec 13 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
php调用mysql存储过程
2007/02/14 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
php检测url是否存在的方法
2015/04/14 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Eclipse中Python开发环境搭建简单教程
2016/03/23 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
毕业生自我鉴定范文
2013/11/08 职场文书
QA工程师岗位职责
2013/11/20 职场文书
综合办公室个人的自我评价
2013/12/22 职场文书
领导干部保密承诺书
2014/08/30 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
大学生个人总结范文
2015/02/15 职场文书
离职信范文
2015/06/23 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书