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

PHP 爬取小說並合成 TXT 完整實作

     編輯:PHP 綜合知識

需求

給定小說目錄頁與章節頁 URL 規則,抓取所有章節標題與內容,合併為單一 TXT 檔案。

核心程式碼

<?php
// 設定
$bookBaseUrl = 'https://example.com/book/123/';
$catalogUrl  = $bookBaseUrl . 'index.html';
$saveDir     = __DIR__ . '/novel_123';
$outputFile  = $saveDir . '/full_novel.txt';

if (!is_dir($saveDir)) mkdir($saveDir, 0755, true);

// 1. 取得目錄頁
$html = file_get_contents($catalogUrl);
if (!$html) die('無法取得目錄頁');

// 2. 擷取章節連結 (視實際 HTML 調整正則)
preg_match_all('/href="(chapter_\d+\.html)"/', $html, $matches);
$chapterUrls = array_unique($matches[1]);

// 3. 逐章抓取
$fullContent = '';
foreach ($chapterUrls as $relUrl) {
    $chapterHtml = @file_get_contents($bookBaseUrl . $relUrl);
    if (!$chapterHtml) continue;

    // 假設章節標題在 

,內容在
if (preg_match('/]*>(.*?)<\/h1>/s', $chapterHtml, $mTitle) && preg_match('/
]*>(.*?)<\/div>/s', $chapterHtml, $mBody)) { $title = strip_tags(trim($mTitle[1])); $body = strip_tags(trim($mBody[1])); $body = preg_replace('/\s+/', "\n", $body); // 簡易段落處理 $fullContent .= "\n\n=== $title ===\n\n$body\n"; echo "已抓取: $title\n"; } usleep(200000); // 禮貌延遲 0.2 秒 } // 4. 寫入檔案 file_put_contents($outputFile, $fullContent); echo "完成!輸出: $outputFile\n"; ?>

關鍵點說明

  • 正則需依目標網站實際結構調整,建議先用瀏覽器開發者工具分析 DOM。
  • 大量請求請加入 set_time_limit(0)、錯誤重試、User-Agent 偽裝、IP 輪換等反爬策略。
  • 編碼轉換:若來源非 UTF-8,用 mb_convert_encoding($html, 'UTF-8', 'GBK')。
  • 合法性:請遵守 robots.txt、網站服務條款與著作權法,僅供個人學習研究。

進階擴充建議

  1. 使用 GuzzleHttp + 非同步請求提升速度。
  2. 引入 symfony/dom-crawler 或 paquettg/php-html-parser 以 CSS 選取器替代脆弱正則。
  3. 支援斷點續傳:記錄已抓取章節 URL 至 JSON/DB,中斷後可續抓。
  4. 輸出 EPUB/MOBI:搭配 kittycat/epub-generator 產生電子書格式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved