網頁爬蟲是資料蒐集的常用技術,本文透過一個實際的 PHP 範例,示範如何從 PCLady 情感技巧首頁抓取文章標題與連結,再進入內容頁擷取詳細資訊。程式碼使用 file_get_contents 取得網頁原始碼,搭配正則表達式解析 HTML 結構,最後透過迴圈逐一處理每篇文章。
<?php
// 目標首頁網址
$url = "https://emotion.pclady.com.cn/skills/";
// 取得頁面原始碼
$rs = file_get_contents($url);
// 設定標題匹配正則:擷取 <i class="titles"><a href="...">標題</a></i>
$preg = '/<i\s+class="titles"><a\s+href="[^>]+">(.*)<\/a><\/i>/i';
preg_match_all($preg, $rs, $title);
$count = count($title[0]);
echo $count . "<br>";
// 逐一處理每篇文章
for ($i = 0; $i < $count; $i++) {
// 從標題區塊擷取內容頁連結
$pr = '/<a\s+href="[^>]+">/isU';
preg_match_all($pr, $title[0][$i], $jurl);
$substr = substr($jurl[0][0], 9);
$curl = substr($substr, 0, -18);
// 取得內容頁原始碼
$c = file_get_contents($curl);
// 嘗試匹配內容頁特定連結(這裡是問題所在)
$pc = '/<a\s+href="[^>]+">/i';
preg_match($pc, $c, $content);
// 輸出除錯資訊
echo $title[0][$i] . "<br>";
echo $title[1][$i] . "<br>";
$concount = count($content[0]);
echo $concount . "<br>";
echo $content[0][0];
}
?>
原詢問者發現 $pc 正則只匹配到「<」而非完整的 <a href=... 標籤。主要原因有二:
/<a\s+href="[^>]+">/i 中的 [^>]+ 雖為非貪婪,但若 HTML 屬性包含 > 字元(如 title="a>b"),會導致提早結束。建議改用 /<a\s+href="([^"]*)"[^>]*>/i 並擷取第 1 群組。file_get_contents 取得的可能是壓縮、編碼不同或經 JavaScript 渲染的內容,導致正則無法匹配。建議先 var_dump($c) 確認實際內容,或改用 DOMDocument 解析 HTML,更穩健。DOMDocument + DOMXPath 取代正則,避免 HTML 結構變動導致失效。set_time_limit(0) 與錯誤處理,避免長時間執行中斷。robots.txt 與網站使用條款,適當延遲請求(如 usleep(500000))。掌握基本爬蟲邏輯後,可擴展為定時任務、資料庫存儲、多執行緒並發等進階應用。