針對磨鐵中文網非 VIP 章節小說撰寫抓取器,支援輸入小說 ID 自動下載全文。技術棧:cURL 取得網頁、正則解析 HTML、AJAX 前端觸發後端任務。
<?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];
}
}
?>
<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>
<?php
require_once 'SpiderTools.class.php';
if (isset($_GET['bid'])) {
SpiderTools::createBookById(trim($_GET['bid']));
}
?>
CURLOPT_RETURNTRANSFER 取得字串、CURLOPT_CONNECTTIMEOUT_MS 控制逾時。[\s\S]*? 非貪婪匹配跨行內容,u 修飾符支援 UTF-8。iconv)避免 Windows 檔案系統亂碼。網頁爬蟲請遵守目標網站
robots.txt、服務條款與著作權法。本範例僅供技術學習,請勿用於大規模商業抓取或侵權用途。