方法總覽
| 方法 | 依賴條件 | 優點 | 缺點 | 推薦場景 |
| file() | allow_url_fopen=On | 簡單,返回行陣列 | 大文件記憶體佔用高,無超時控制 | 小型文本文件 |
| file_get_contents() | allow_url_fopen=On | 一行代碼獲取完整內容 | 同上,無高級 HTTP 選項 | 快速獲取靜態頁面 |
| fopen/fread/fclose | allow_url_fopen=On | 流式讀取,控制緩衝區大小 | 代碼冗長,需手動循環 | 大文件分塊處理 |
| cURL | php_curl 擴展 | 功能最全:超時、Header、Cookie、代理、POST、SSL、斷點續傳 | 需安裝擴展 | 生產環境首選 |
| fsockopen (Socket) | 允許 Socket 連接 | 底層控制,可實現自定義協議 | 需手動構造 HTTP 協議,錯誤率高 | 特殊協議、學習用途 |
| Snoopy 庫 | 純 PHP 類庫 | 模擬瀏覽器完整,自動處理重定向、Cookie、表單 | 維護較少,效能不如 cURL | 快速開發爬蟲原型 |
代碼範例
1. file_get_contents() 最簡潔
<?php
$url = 'https://t.qq.com';
$html = file_get_contents($url);
echo htmlspecialchars($html);
?>
2. cURL 完整配置(生產推薦)
<?php
$url = 'https://t.qq.com';
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; PHP Bot)',
CURLOPT_SSL_VERIFYPEER => false, // 僅測試環境
]);
$html = curl_exec($ch);
if (curl_errno($ch)) {
error_log('cURL Error: ' . curl_error($ch));
}
curl_close($ch);
echo $html;
?>
3. Snoopy 類庫使用
<?php
require('Snoopy.class.php');
$snoopy = new Snoopy;
$snoopy->agent = $_SERVER['HTTP_USER_AGENT']; // 模擬當前瀏覽器
$snoopy->fetch('https://t.qq.com');
echo $snoopy->results;
?>
HTML/XML 解析策略
- DOMDocument + DOMXPath:標準庫,健壯處理不規範 HTML,支援 XPath 查詢
- SimpleXML:適合結構良好的 XML,語法簡潔
- 正則表達式:不推薦 解析 HTML,僅適用極簡單、固定格式片段
- 第三方庫:
QueryPath (jQuery 風格)、PHPHtmlParser、Symfony DomCrawler
DOMDocument 實戰範例
<?php
$html = file_get_contents('https://example.com');
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();
$xpath = new DOMXPath($dom);
$links = $xpath->query('//a[@href]');
foreach ($links as $link) {
echo $link->getAttribute('href') . ' - ' . $link->nodeValue . "\n";
}
?>
最佳實踐建議
- 優先使用 cURL,功能最完整、錯誤處理最可控
- 設置合理的
User-Agent、Referer 避免被反爬蟲攔截
- 實現重試機制(指數退避)與超時控制
- 遵守
robots.txt、限制請求頻率、緩存結果
- 解析階段使用 DOMDocument + XPath,健壯性最強
- 異常情況記錄日誌,便於排查