首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 爬蟲實戰:抓取中國天氣網 7 天預報

     編輯:PHP 綜合知識

專案背景

為網站添加天氣預報功能可提升用戶黏性。因無法直接獲取氣象衛星數據,常見做法是編寫爬蟲抓取公開天氣網站的 HTML 頁面,解析所需資訊。本文以中國天氣網為例,示範簡單的 PHP 采集程式。

核心流程

  1. 指定目標 URL
  2. 下載頁面內容(file_get_contents 或 cURL)
  3. 使用正則表達式提取目標資料區塊
  4. 處理相對路徑資源(圖片、CSS 等)
  5. 輸出或儲存結構化數據

程式碼實作

1. 獲取頁面原始碼

$url = 'https://www.weather.com.cn/weather/101050101.shtml'; // 哈爾濱
$html = file_get_contents($url);
if ($html === false) {
    die('無法獲取遠端頁面');
}

2. 定位目標區塊

觀察頁面原始碼,未來 7 天預報位於 <!--day 1--> 至 <!--day 7--> 註釋之間:

$pattern = '/<!--day 1-->(.*)<!--day 7-->/s';
if (!preg_match($pattern, $html, $matches)) {
    die('頁面結構異常,無法定位預報區塊');
}
$forecastBlock = $matches[1];
注意:s 修飾符讓 . 匹配換行符;實際專案建議使用 DOMDocument + XPath 更穩健。

3. 補全圖片路徑

$forecastBlock = str_replace(
    '<img src="',
    '<img src="https://www.weather.com.cn',
    $forecastBlock
);

4. 完整可配置版本

$url = 'https://www.weather.com.cn/weather/101050101.shtml';
$html = file_get_contents($url);

$startDay = 1;
$endDay = 3; // 可調整抓取天數

if ($endDay > 7) {
    die('超出預報範圍');
}

$pattern = "/<!--day $startDay-->(.*)<!--day $endDay-->/s";
preg_match($pattern, $html, $matches);

$forecast = str_replace('<img src="', '<img src="https://www.weather.com.cn', $matches[1]);
echo "未來 " . ($endDay - $startDay + 1) . " 天天氣預報(" . date('Y-m-d') . " 發布)";
echo $forecast;

進階優化方向

  • 改用 cURL:支援超時、重試、User-Agent 偽裝、Cookie 管理
  • DOM 解析器:DOMDocument + DOMXPath 比正則更穩定、可維護
  • 快取機制:本地快取 30 分鐘,減少對目標站請求壓力
  • 錯誤處理:網路異常、頁面結構變更、編碼問題(目標站可能為 GBK)
  • 結構化輸出:解析為 JSON/XML 供前端 AJAX 調用,而非直接輸出 HTML 片段
  • 法律合規:遵守 robots.txt、控制抓取頻率、確認資料授權條款

同類應用場景

相同技術棧可應用於:股票即時行情、新聞 RSS 聚合、電商比價、公開 API 無官方 SDK 時的替代方案。

總結

簡單的 PHP 爬蟲幾行代碼即可實現,但生產環境需考慮穩定性、效能、合法性與維護性。建議優先尋找官方 API,無 API 時再考慮爬蟲,並做好監控與降級預案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved