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

打造專屬 PHP 采集器:file_get_contents + 正則 + 切片函數三步抓取小說章節

     編輯:PHP 相關知識

采集器核心原理

  1. 遠程讀取:file_get_contents($url) 獲取頁面 HTML(需 allow_url_fopen=On)。
  2. 正則提取:preg_match_all() 批次匹配目標區塊(列表頁的章節連結與標題)。
  3. 切片清洗:自定義 cut($str, $start, $end) 從匹配片段中精確截取所需字串。

關鍵輔助函數

function cut($string, $start, $end) {
    $msg = explode($start, $string, 2);
    if (isset($msg[1])) {
        $msg = explode($end, $msg[1], 2);
        return $msg[0];
    }
    return '';
}

實戰流程:采集某小說站章節列表

1. 取得分類 ID

$html = file_get_contents('https://example.com/Html/Book/123/List.shtm');
$typeid = cut($html, 'Html/Book/', 'List.shtm'); // 取得 '123'

2. 解析章節連結與標題

// 匹配所有章節連結:第1章 開端
preg_match_all('/<a href="(\d+\.shtm)">(.*?)<\/a>/is', $html, $matches);
$urls = $matches[1];   // ['456.shtm', '457.shtm', ...]
$titles = $matches[2]; // ['第1章 開端', '第2章 發展', ...]

$chapters = [];
foreach ($urls as $i => $url) {
    $chapters[$url] = trim($titles[$i]);
}
// $chapters = ['456.shtm' => '第1章 開端', ...]

3. 循環采集正文內容

foreach ($chapters as $url => $title) {
    $chapterHtml = file_get_contents("https://example.com/Html/Book/$typeid/$url");
    // 提取正文區塊(假設在 <div id="content">...</div>)
    $content = cut($chapterHtml, '<div id="content">', '</div>');
    // 清洗廣告、換行、特殊字元
    $content = strip_tags($content, '<p><br>');
    $content = str_replace([' ', '&nbsp;'], ' ', $content);

    // 儲存資料庫或檔案
    saveChapter($title, $content);
    usleep(200000); // 禮貌延遲 0.2 秒,避免被封 IP
}

進階優化建議

  • 並發采集:使用 curl_multi_exec 或 GuzzleHttp\Pool 並發請求,效率提升 10 倍+。
  • 反爬蟲應對:隨機 User-Agent、IP 代理池、模擬瀏覽器 Cookie、處理 JavaScript 渲染(Headless Chrome/Puppeteer)。
  • 增量采集:記錄最後采集 URL/時間,下次僅抓取新增章節。
  • 編碼處理:mb_convert_encoding($html, 'UTF-8', 'auto') 統一轉 UTF-8。
  • 錯誤重試:指數退避重試 3 次,記錄失敗 URL 供人工介入。

法律與道德提醒

采集器僅供技術學習與個人合理使用。商業用途請遵守 robots.txt、網站服務條款、著作權法;優先申請官方 API 或授權。

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