]*>(.*?)<\/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、網站服務條款與著作權法,僅供個人學習研究。
進階擴充建議
- 使用
GuzzleHttp + 非同步請求提升速度。
- 引入
symfony/dom-crawler 或 paquettg/php-html-parser 以 CSS 選取器替代脆弱正則。
- 支援斷點續傳:記錄已抓取章節 URL 至 JSON/DB,中斷後可續抓。
- 輸出 EPUB/MOBI:搭配
kittycat/epub-generator 產生電子書格式。
- 上一篇文章: PHP Try-Catch 異常處理機制深度測試與最佳實務
- 下一篇文章: PHP AJAX 中文亂碼根因與一行解決方案
關鍵點說明
- 正則需依目標網站實際結構調整,建議先用瀏覽器開發者工具分析 DOM。
- 大量請求請加入
set_time_limit(0)、錯誤重試、User-Agent 偽裝、IP 輪換等反爬策略。 - 編碼轉換:若來源非 UTF-8,用
mb_convert_encoding($html, 'UTF-8', 'GBK')。 - 合法性:請遵守
robots.txt、網站服務條款與著作權法,僅供個人學習研究。
進階擴充建議
- 使用
GuzzleHttp+ 非同步請求提升速度。 - 引入
symfony/dom-crawler或paquettg/php-html-parser以 CSS 選取器替代脆弱正則。 - 支援斷點續傳:記錄已抓取章節 URL 至 JSON/DB,中斷後可續抓。
- 輸出 EPUB/MOBI:搭配
kittycat/epub-generator產生電子書格式。




