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

PHP 結合 cURL 與正則表達式抓取網頁資料實戰

     編輯:PHP 相關知識

專案背景

針對磨鐵中文網非 VIP 章節小說撰寫抓取器,支援輸入小說 ID 自動下載全文。技術棧:cURL 取得網頁、正則解析 HTML、AJAX 前端觸發後端任務。

核心類別:SpiderTools

<?php
class SpiderTools {
    // 取得小說標題
    public function getBookNameById($aid) {
        $ch = curl_init();
        $url = 'https://www.motie.com/book/' . $aid;
        $pattern = is_numeric($aid)
            ? '/<h1\sclass="p-title">\s*<a\shref="\/book\/\d+">(.*)<\/a>\s*<\/h1>/'
            : '/<title>(.*)<\/title>/';
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_CONNECTTIMEOUT_MS => 0,
        ]);
        $output = curl_exec($ch);
        curl_close($ch);
        preg_match_all($pattern, $output, $arr);
        return $arr[1][0] ?? '';
    }

    // 取得章節內容
    public function getBookContextById($aid) {
        list($titleId, $articleId) = explode('_', $aid);
        $ch = curl_init();
        $url = 'https://www.motie.com/book/' . $aid;
        $pattern = '/<div class="page-content">[\s\S]*<pre[^>]*id="html_content_\d*"[^>]*>[\s\S]*(.*)<img src="\/ajax\/chapter\/' . $titleId . '\/' . $articleId . '" class="hidden" \/><\/pre>/ui';
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_HEADER => 0,
        ]);
        $output = curl_exec($ch);
        curl_close($ch);
        preg_match_all($pattern, $output, $arr);
        $content = $arr[0][0] ?? '';
        $content = substr($content, 180); // 移除固定前綴
        return trim(explode('<img', $content)[0]);
    }

    // 靜態方法:遞迴下載全書
    public static function createBookById($id) {
        if (!is_numeric($id)) { // 章節 ID 格式:bookId_chapterId
            $st = new self();
            $content = $st->getBookContextById($id);
            $title = $st->getBookNameById($id);
            // 儲存邏輯(建立目錄、寫入檔案、編碼轉換)...
        } else { // 書本 ID,需先取得所有章節 ID
            $ids = self::getBookIdsById($id);
            foreach ($ids as $chapterId) {
                self::createBookById($id . '_' . $chapterId);
            }
        }
    }

    // 取得書本所有章節 ID
    public static function getBookIdsById($aid) {
        $ch = curl_init();
        $url = 'https://www.motie.com/book/' . $aid . '/chapter';
        $pattern = '/<li class="" createdate="\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}">[\s\S]*?<a href="\/book\/' . $aid . '_(\d*?)"\s>.*?<\/a>.*?/u';
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_HEADER => 0,
        ]);
        $output = curl_exec($ch);
        curl_close($ch);
        preg_match_all($pattern, $output, $arr, PREG_PATTERN_ORDER);
        return $arr[1];
    }
}
?>

前端觸發頁面 (index.html)

<html>
<head><meta charset="utf-8"><title>小說下載器</title></head>
<body>
<h1>輸入磨鐵中文網小說 ID 下載</h1>
<form>
  <input type="text" id="myid" name="myid" placeholder="小說 ID">
  <button type="button" onclick="createbook()">開始下載</button>
</form>
<div id="info"></div>

<script>
function createbook() {
    var bookid = document.getElementById('myid').value;
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'getinfo.php?bid=' + bookid + '&sid=' + Math.random(), true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            document.getElementById('info').innerHTML = xhr.responseText;
        } else {
            document.getElementById('info').innerHTML = '處理中...';
        }
    };
    xhr.send();
}
</script>
</body>
</html>

後端入口 (getinfo.php)

<?php
require_once 'SpiderTools.class.php';
if (isset($_GET['bid'])) {
    SpiderTools::createBookById(trim($_GET['bid']));
}
?>

關鍵技術點總結

  • cURL 設定:CURLOPT_RETURNTRANSFER 取得字串、CURLOPT_CONNECTTIMEOUT_MS 控制逾時。
  • 正則模式:使用 [\s\S]*? 非貪婪匹配跨行內容,u 修飾符支援 UTF-8。
  • 編碼處理:檔案名稱從 UTF-8 轉 Big5/GBK(iconv)避免 Windows 檔案系統亂碼。
  • 遞迴下載:靜態方法配合 Session 記錄進度,支援斷點續傳(程式碼中註解部分)。
  • AJAX 輪詢:前端定時請求後端進度,即時顯示狀態。

法律與道德提醒

網頁爬蟲請遵守目標網站 robots.txt、服務條款與著作權法。本範例僅供技術學習,請勿用於大規模商業抓取或侵權用途。

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