火車頭采集器(LocoySpider)默認使用 SQLite (.db3) 存儲采集數據,而 DedeCMS 使用 MySQL。將數萬條采集數據高效、準確遷移至 DedeCMS,涉及表結構映射、字符集轉換、HTML 內容清洗、關鍵詞提取、縮圖處理、附件關聯等多個環節。本文提供一個經實戰驗證的完整 PHP 腳本,涵蓋從 DB3 讀取到 DedeCMS 多表寫入的全流程。
content 表。mb_convert_encoding(..., 'gbk', 'auto') 轉為 DedeCMS 所需的 GBK。mysql_escape_string() 防注入 + 拼接后綴。litpic)。{dede:link} 標簽。SplitWord 分詞類(需自行實現或引入第三方如 PSCWS)。dede_addonsoft:軟件模型擴展表(文件大小、下載鏈接、介紹等)。dede_archives:主文檔表(標題、縮圖、點擊數、關鍵詞、描述等)。dede_arctiny:微型索引表(僅含 ID、欄目、排序等核心字段,用于列表頁高速查詢)。mt_rand(1000,10000)、發布時間 time()、固定 IP/作者等。<?php
$pdo = new PDO('sqlite:d:/pdoSpiderResult.db3');
$split = new SplitWord(); // 需自行實現分詞接口
$stmt = $pdo->query('SELECT * FROM content LIMIT 160, 80'); // 分批處理
foreach ($stmt as $row) {
// 1. 基礎字段處理
$title = mysql_escape_string(mb_convert_encoding($row[3], 'gbk', 'auto')) . '-js相册';
$content = str_replace('Image/', 'https://g.111cn.cn/javascript教程/Image/', mb_convert_encoding($row[4], 'gbk', 'auto'));
$size = '未知';
$downUrl = 'https://g.111cn.cn/javascript/' . str_replace('.zip', '', $row['address']) . '.rar';
$preview = '<br />效果預覽地址<a href="https://g.111cn.cn/javascript/' . str_replace('.zip', '', $row['address']) . '" target="_blank">' . $title . '</a>';
// 2. 提取首圖作為縮圖
preg_match_all('/(src|SRC)=["\'\s]{0,}((.*).(gif|jpg|jpeg|png|bmp))/isU', $content, $imgs);
$litpic = str_replace(['"', "'"], '', $imgs[2][0] ?? '');
// 3. 關鍵詞與描述
$keywords = str_replace(' ', ',', $split->SplitRMM($title));
$description = ''; // 可自動摘要前 200 字
$introduce = $content . $description . $preview;
// 4. 寫入 dede_addonsoft
$addonSql = "INSERT INTO dede_addonsoft (typeid, filetype, language, softtype, accredit, os, softrank, officialUrl, officialDemo, softsize, softlinks, introduce, templet, userip, redirecturl)
VALUES ('$typeid', '$filetype', '$language', '', '', 'Win2003,WinXP,Win2000,Win9X', '3', '', '', '$size', '{dede:link islocal=1 text=本地下载}$downUrl{/dede:link}', '$introduce', '', '222.103.69.94', '')";
mysql_query($addonSql) or die('addonsoft: ' . mysql_error());
$aid = mysql_insert_id();
// 5. 寫入 dede_archives
$arcSql = "INSERT INTO dede_archives (id, typeid, typeid2, sortrank, flag, ismake, channel, arcrank, click, money, title, litpic, writer, source, pubdate, senddate, mid, description, keywords)
VALUES ('$aid', '$typeid', '0', '$sortrank', 'p', '1', '3', '0', '$click', '0', '$title', '$litpic', '$writer', 'unknown', '$sortrank', '$sortrank', 1, '$description', '$keywords')";
mysql_query($arcSql) or die('archives: ' . mysql_error());
// 6. 寫入 dede_arctiny
$tinySql = "INSERT INTO dede_arctiny (id, typeid, typeid2, arcrank, channel, senddate, sortrank, mid)
VALUES ($aid, $typeid, 0, 0, 3, '$sortrank', '$sortrank', 1)";
mysql_query($tinySql) or die('arctiny: ' . mysql_error());
}
echo '導入完成';
?>
DedeCMS 歷史版本多為 GBK,而現代采集數據常為 UTF-8。務必在入庫前統一轉為 GBK,否則前台顯示亂碼、搜索失效。若站點已為 UTF-8 版 DedeCMS,則無需轉碼,但需確保數據庫連接 SET NAMES utf8。
示例使用 mysql_escape_string(),但 強烈建議改用 PDO/MySQLi 預處理語句,徹底消除注入風險。
代碼中的 SplitWord 為占位符。生產環境可接入:
腳本僅處理數據庫記錄,**實體文件(圖片、壓縮包)需單獨同步到服務器對應目錄**,并確保 URL 路徑一致。建議使用 rsync 或對象存儲(OSS/COS)批量遷移。
LIMIT offset, count 分批處理,避免內存溢出。BEGIN; ... COMMIT; 包裹每批次,提升寫入速度並保證原子性。ImageResize 類)。本方案提供了從火車頭 DB3 到 DedeCMS 多表寫入的完整數據流,涵蓋編碼轉換、內容清洗、關鍵詞提取、縮圖關聯、三表聯動寫入等關鍵環節。實際部署時請務必補全分詞組件、改用預處理語句、做好文件同步與緩存更新,即可構建穩定高效的采集入庫管道。