PHP實現(xiàn)采集中國天氣網(wǎng)未來7天天氣
前言
我們在寫一個Web程序的時候,總會想著把自己的網(wǎng)站更美觀一些,功能能更多一些,有時候?qū)懸恍┬〉墓ぞ呋蛘呒由闲〉牟寮屛覀兊恼军c更加完善。比如萬年歷功能,比如我們現(xiàn)在要講的天氣預(yù)報功能。
當(dāng)然我們沒法利用專業(yè)的衛(wèi)星接受數(shù)據(jù),所以我們的天氣數(shù)據(jù)來自現(xiàn)有的天氣預(yù)報網(wǎng)站。利用天氣預(yù)報網(wǎng)站提供的數(shù)據(jù)服務(wù),我們可以寫一個PHP爬蟲,然后動態(tài)采集我們所需要的數(shù)據(jù),并且在目標(biāo)站點更新數(shù)據(jù)的時候,我們的程序也能做到同步更新,自動地獲取數(shù)據(jù)。
下面就介紹一下如何編寫一個簡單的PHP數(shù)據(jù)采集程序(PHP爬蟲)。
原理
給定一個網(wǎng)頁的URL,使用PHP下載該網(wǎng)頁并得到網(wǎng)頁內(nèi)容,然后通過正則表達(dá)式將其中我們感興趣的數(shù)據(jù)提取出來,然后輸出。
具體在這個例子中,我們要抓取的網(wǎng)頁是 http://www.weather.com.cn/weather/101050101.shtml,我們感興趣的是頁面中的未來7天天氣情況。
實現(xiàn)
0.獲取天氣預(yù)報網(wǎng)頁的URL:
$url = "http://www.weather.com.cn/weather/101050101.shtml";
$page_content = file_get_contents($url);
在這里,file_get_contents() 函數(shù)會將 $url 指向的網(wǎng)頁下載下來,并把網(wǎng)頁內(nèi)容作為一個字符串返回。于是,$page_content 變量中就是我們要抓取的網(wǎng)頁的全部HTML代碼了。接下來,我們要從其中抽取我們需要的數(shù)據(jù)。
1.使用正則表達(dá)式匹配符合條件的字符串
先輸出 $page_content 的值,然后查看網(wǎng)頁源代碼,觀察可知我們需要的字符串可以在
<!--day 1 -->
......
<!--day 7 -->
這兩行的注釋里找到。
使用正則表達(dá)式來取得 <!--day 1--> 和 <!--day 7--> 之間的所有內(nèi)容:
eregi("<!--day 1-->(.*)<!--day 7-->",$page_content,$res);
2.補(bǔ)全頁面中圖片的路徑
由于遠(yuǎn)程網(wǎng)頁中的圖片路徑都是像 /m2/i/icon_weather/29x20/d01.gif 這樣的相對路徑,我們需要把這些路徑補(bǔ)全,在它們前面加上 http://www.weather.com.cn。
$forecast = str_replace("<img src="","<img src="http://www.weather.com.cn",$res[0]);
至此,$forecast 中就是我們需要的天氣預(yù)報信息了。這個簡單的PHP爬蟲也就寫好了。
源代碼
以下是這個抓取天氣預(yù)報小程序的完整源代碼,其中添加了一些測量各部分程序運行時間的代碼,并可以通過設(shè)置 $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 "超出預(yù)報能力范圍,請重新設(shè)置!";
}else {
echo "未來".($end-$start)."天哈爾濱的天氣預(yù)報("
.date('Y-m-j')."發(fā)布)";
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.';
}
其他應(yīng)用例子
同樣的思路可以嘗試的有:NBA每天的比分牌、今日哈工大的新聞同步、股市行情等等。都能實現(xiàn)同步實時更新。暫時只想到這些,歡迎大家拍磚~
- PHP調(diào)用API接口實現(xiàn)天氣查詢功能的示例
- PHP微信開發(fā)之查詢城市天氣
- php使用百度天氣接口示例
- php結(jié)合飛信 免費天氣預(yù)報短信
- PHP+AJAX無刷新實現(xiàn)返回天氣預(yù)報數(shù)據(jù)
- PHP 獲取指定地區(qū)的天氣實例代碼
- php實現(xiàn)的百度搜索某地天氣的小偷代碼
- PHP Ajax JavaScript Json獲取天氣信息實現(xiàn)代碼
- php采集自中央氣象臺范圍覆蓋全國的天氣預(yù)報代碼實例
- php微信開發(fā)之百度天氣預(yù)報
- PHP調(diào)用全國天氣預(yù)報數(shù)據(jù)接口查詢天氣示例
相關(guān)文章
Apache啟動報錯No space left on device: AH00023該怎么解決
最近有朋友說:Apache啟動報錯No space left on device: AH00023,是怎么回事,該怎么解決呢?經(jīng)過小編的一番折騰,問題解決,下面把解決辦法分享給大家,需要的朋友可以參考下2015-10-10
php中is_null,empty,isset,unset 的區(qū)別詳細(xì)介紹
本篇文章介紹了,php中is_null,empty,isset,unset 的區(qū)別詳細(xì)分析。需要的朋友參考下2013-04-04

