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

PHP 網頁抓取與 HTML/XML 解析完全指南

     編輯:PHP 綜合知識

前言

在 Web 開發中,從遠端獲取網頁內容並提取所需資料是常見需求。PHP 提供了多種抓取網頁的方法,搭配不同的解析技術,能高效完成資料採集、API 整合等任務。本文系統梳理 PHP 抓取網頁的六大主流方式,以及三種主流 HTML/XML 解析策略,並附上可直接運行的代碼示例。

一、PHP 抓取網頁的六大方法

1. file() 函數

最基礎的方法,將整個文件讀入陣列,每行佔一個元素。

<?php
$url = 'https://t.qq.com';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
echo htmlspecialchars($lines_string);
?>

優點:代碼簡潔;缺點:記憶體佔用大,不適合大文件,需開啟 allow_url_fopen。

2. file_get_contents() 函數

一行代碼獲取完整內容,是目前最常用的簡易抓取方式。

<?php
$url = 'https://t.qq.com';
$lines_string = file_get_contents($url);
echo htmlspecialchars($lines_string);
?>

同樣依賴 allow_url_fopen = On,且無法精細控制請求標頭、超時等參數。

3. fopen() → fread() → fclose() 流式讀取

適合大文件分塊讀取,可控制緩衝區大小。

<?php
$url = 'https://t.qq.com';
$handle = fopen($url, "rb");
$lines_string = "";
do {
    $data = fread($handle, 1024);
    if (strlen($data) == 0) { break; }
    $lines_string .= $data;
} while (true);
fclose($handle);
echo htmlspecialchars($lines_string);
?>

4. cURL 方式(推薦)

功能最強大,支援 HTTPS、POST、Cookie、代理、超時控制等高級特性。

<?php
$url = 'https://t.qq.com';
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$lines_string = curl_exec($ch);
curl_close($ch);
echo htmlspecialchars($lines_string);
?>

啟用方法:Windows 下 php.ini 取消 extension=php_curl.dll 註釋,並將 ssleay32.dll、libeay32.dll 複製到系統目錄;Linux 安裝 php-curl 擴展。

5. fsockopen() Socket 底層通訊

直接操作 TCP/UDP 協議,適合特殊協議或極致性能場景,但需手動構建 HTTP 協議報文。

<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
    echo "ERROR: $errno - $errstr<br />\n";
} else {
    fwrite($fp, "\n");
    echo fread($fp, 26);
    fclose($fp);
}
?>

受限於伺服器協議支援情況,通用性較差。

6. 第三方庫(如 Snoopy)

封裝良好、模擬瀏覽器行為的純 PHP 類庫,適合不支援 cURL 的虛擬主機環境。

二、HTML/XML 解析的三大策略

1. 正則表達式

靈活但脆弱,適合簡單、結構固定的片段提取。

<?php
$url = 'https://t.qq.com';
$html = file_get_contents($url);
preg_match('/<title>(.*?)<\/title>/is', $html, $matches);
echo htmlspecialchars($matches[1] ?? '');
?>

注意:HTML 結構變動極易導致正則失效,不建議用於複雜文檔。

2. DOMDocument 內建物件

標準 W3C DOM API,健壯性強,支援 XPath 查詢。

<?php
$url = 'https://www.example.com';
$dom = new DOMDocument();
libxml_use_internal_errors(true); // 抑制格式錯誤警告
$dom->loadHTMLFile($url);
$title = $dom->getElementsByTagName('title');
echo $title->item(0)->nodeValue ?? '';
?>

可配合 DOMXPath 進行精準查詢:

$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//div[@class="content"]/p');

3. PHP Simple HTML DOM Parser(推薦)

語法類似 jQuery,選擇器直觀易用,容錯性佳。

<?php
require_once 'simple_html_dom.php';
$url = 'https://t.qq.com';
$html = file_get_html($url);
$title = $html->find('title', 0);
echo $title->plaintext ?? '';
?>

支援鏈式操作:$html->find('.list a')->href,開發效率極高。

三、工程實踐建議

  • 優先選擇 cURL + Simple HTML DOM:功能完整、代碼可維護性強。
  • 異常處理:檢查 HTTP 狀態碼、設置合理超時、捕獲網絡異常。
  • 編碼處理:抓取後統一轉為 UTF-8,mb_convert_encoding($html, 'UTF-8', 'auto')。
  • 遵守 robots.txt:爬蟲請識別並遵守站點爬蟲協議,避免法律風險。
  • 緩存機制:對不常變動的頁面建立本地緩存,降低目標站點壓力。

四、法律與道德邊界

文中提到「php小偷程序」現象值得深思:技術本身中性,但大量採集站未創造原創內容,僅搬運他人成果,違反搜索引擎指南且侵犯版權。作為開發者,應將抓取技術用於:

  • 聚合類產品(如比價網站)且已獲授權
  • 數據分析、學術研究
  • 企業內部系統整合
  • 合法的 API 替代方案

切勿用於內容盜版、SEO 作弊等灰產鏈條。

結語

掌握 PHP 網頁抓取與解析,關鍵在於「工具選型」與「工程化思維」。cURL 提供最強大的網絡層控制,DOMDocument 保證標準合規,Simple HTML DOM 則極大提升開發體驗。結合緩存、異常處理、編碼轉換等工程細節,即可構建穩健、高效的資料採集系統。

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