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

PHP 網頁爬蟲實作:以 PCLady 情感技巧頁面為例

     編輯:PHP 綜合知識

網頁爬蟲是資料蒐集的常用技術,本文透過一個實際的 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=... 標籤。主要原因有二:

  1. 貪婪與非貪婪模式:原模式 /<a\s+href="[^>]+">/i 中的 [^>]+ 雖為非貪婪,但若 HTML 屬性包含 > 字元(如 title="a>b"),會導致提早結束。建議改用 /<a\s+href="([^"]*)"[^>]*>/i 並擷取第 1 群組。
  2. 內容頁編碼與結構差異:file_get_contents 取得的可能是壓縮、編碼不同或經 JavaScript 渲染的內容,導致正則無法匹配。建議先 var_dump($c) 確認實際內容,或改用 DOMDocument 解析 HTML,更穩健。

改良建議

  • 使用 DOMDocument + DOMXPath 取代正則,避免 HTML 結構變動導致失效。
  • 加入 set_time_limit(0) 與錯誤處理,避免長時間執行中斷。
  • 遵守 robots.txt 與網站使用條款,適當延遲請求(如 usleep(500000))。

掌握基本爬蟲邏輯後,可擴展為定時任務、資料庫存儲、多執行緒並發等進階應用。

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