让火车头采集器能够识别并采集目标网站上的图片图集内容,然后将图片下载到你的服务器,并自动在 DedeCMS 中生成一个包含多张图片的图集文章。

这比采集单张图片或普通文章要复杂,因为它涉及到图片下载、远程路径转本地路径、生成缩略图、以及生成图集数据结构等多个步骤。
工作原理概述
整个过程可以分解为以下几个关键步骤:
- 分析目标网站:在火车头中,你需要分析目标图集页面的 HTML 结构,找到图集文章的标题、内容、以及所有图片的
<img>- 配置火车头字段:在火车头的发布项目中,你需要创建多个字段来对应 DedeCMS 的数据表字段。
- 核心脚本处理:这是最关键的一步,你需要编写一小段 PHP 脚本(通常在火车头的“发布参数”->“远程文件处理”中设置),让这个脚本来执行 DedeCMS 图集特有的处理逻辑。
- 发布到 DedeCMS:火车头将处理好的数据(包括标题、内容、图片列表等)通过接口发送给 DedeCMS 后台,DedeCMS 的
addimages.php程序接收到数据后,将其写入数据库,完成图集的创建。
详细配置步骤
第 1 步:在火车头中创建发布项目
- 新建发布项目:打开火车头,新建一个发布项目,选择 DedeCMS 5.7 作为发布接口。
- 配置基本连接信息:填写你的 DedeCMS 网站的登录地址、用户名、密码等。
第 2 步:配置发布字段
这是数据采集的核心,你需要确保火车头采集到的数据能够与 DedeCMS 的 dede_archives (文章主表) 和 dede_addonimages (图集附表) 字段对应起来。
| 火车头字段名 | 对应 DedeCMS 字段 | 说明 |
| :--- | :--- | :--- | | title | 文章标题,必须。 |
| typeid | typeid | 栏目 ID,必须。 |
| writer | writer | 作者,可选。 |
| source | source | 来源,可选。 |
| litpic | litpic | 图集封面/缩略图,非常重要。 |
| body | body | ,这里会包含所有 <img> 标签。 |
| ishtml | ishtml | 是否生成静态页,通常填 1。 |
| redirecturl | redirecturl | 跳转链接,可选。 |
| templet | templet | 指定文章内容模板,可选。 |

关键点说明:
litpic(缩略图):你需要分析目标页面,找到那张你认为最适合做封面的大图,通常图集的第一张图就是封面,在火车头的采集规则中,你需要设置一个规则来提取这张图片的地址。body(内容):这个字段需要采集整个图集区域的 HTML 代码,里面包含了所有的<img>标签,这是后续脚本处理的基础。
第 3 步:配置远程文件处理脚本
这是将“远程图片”变为“本地图片”并生成图集结构的核心。
- 在火车头发布项目的设置中,找到 “发布参数” 或 “远程文件处理” 选项。
- 你需要填写一段 PHP 代码,这段代码会在数据发布到 DedeCMS 之前执行。
核心 PHP 脚本模板:
<?php // 引入 DedeCMS 的核心文件,必须使用你网站服务器的绝对路径 // !!! 这是最关键的一步,路径一定要正确 !!! require_once dirname(__FILE__).'/../include/common.inc.php'; // 获取火车头传过来的 body 内容 $body = $r['body']; // $r 是火车头数据数组,body 字段在其中 // 调用 DedeCMS 的图片处理函数 // 函数会自动下载远程图片,生成缩略图,并替换 body 中的 img 标签 $body = GetRemoteImage($body, '', false, ''); // 将处理后的 body 内容再写回到 $r 数组中,供后续发布使用 $r['body'] = $body; // 返回处理后的数据 return $r; ?>
脚本详解:

-
require_once dirname(__FILE__).'/../include/common.inc.php';- 这是绝对不能错的一行! 它告诉火车头去加载 DedeCMS 的核心函数库。
dirname(__FILE__)指的是火车头发布脚本所在的目录,../include/common.inc.php是相对于该目录的 DedeCMS 核心文件路径。请务必根据你的实际安装路径修改! 如果路径错误,脚本将无法运行,无法识别GetRemoteImage函数。
- 这是绝对不能错的一行! 它告诉火车头去加载 DedeCMS 的核心函数库。
-
$body = $r['body'];- 获取火车头采集到的、包含所有
<img>标签的原始内容。
- 获取火车头采集到的、包含所有
-
$body = GetRemoteImage($body, '', false, '');- 这是 DedeCMS 的核心函数,它做了以下几件事:
- 解析
$body中的所有<img src="..."> - 下载图片:将
src指向的远程图片下载到你网站uploads目录下的子文件夹中(uploads/allimg/)。 - 生成缩略图:根据 DedeCMS 后台设置的缩略图规则,为下载的图片生成一张缩略图。
- 替换路径:将
<img>标签中的src属性从远程地址替换为本地服务器地址。 - 图集数据:这个函数还会将下载的图片信息记录下来,并准备好写入
dede_addonimages数据表。
- 解析
- 参数详解:
$body: 要处理的 HTML 字符串。- 保存路径,留空则使用 DedeCMS 默认设置。
false: 是否水印,false表示不加水印。- 本地附加地址,通常留空。
- 这是 DedeCMS 的核心函数,它做了以下几件事:
-
return $r;- 将处理好的、包含了本地图片路径的
$r数组返回给火车头,然后火车头再将这个最终数据发布给 DedeCMS。
- 将处理好的、包含了本地图片路径的
第 4 步:测试与发布
- 测试:在火车头中,先运行“采集”功能,抓取几条数据。
- 预览发布:在发布前,使用“预览发布”或“本地测试发布”功能,检查发布后的数据,特别是
body内容,看图片链接是否已经变成本地路径,以及litpic是否正确。 - 正式发布:确认无误后,即可进行“全部发布”或“定时发布”。
常见问题与解决方案
-
问题:脚本执行失败,提示
Fatal error: Call to undefined function GetRemoteImage()- 原因:99% 的情况是
require_once的路径错误,DedeCMS 的核心文件没有被成功加载。 - 解决:仔细检查
common.inc.php的绝对路径,可以通过在脚本里echo dirname(__FILE__);来打印当前路径,然后拼接出正确的路径。
- 原因:99% 的情况是
-
问题:图片下载失败,或者图片路径是错的。
- 原因:
- 目标图片网站做了防盗链,你的服务器无法直接下载。
- DedeCMS 的
uploads目录没有写入权限。 GetRemoteImage函数本身有问题(极罕见)。
- 解决:
- 对于防盗链,可以尝试使用火车头的“使用代理”或“自定义请求头”功能,模拟浏览器访问。
- 检查服务器上
uploads及其子目录的权限,确保www或nginx运行用户有写入权限。 - 手动在后台发布一张图集文章,看是否能正常上传图片,以排除 DedeCMS 本身配置的问题。
- 原因:
-
问题:发布成功,但文章内容里没有图片,或者图片是裂开的。
- 原因:
body字段采集的 HTML 不完整,或者GetRemoteImage函数没有成功替换路径。 - 解决:
- 检查火车头采集
body的规则是否正确,确保采集到的是完整的图集 HTML 区域。 - 检查
GetRemoteImage函数的返回值,可以在脚本里echo $body; exit;来查看处理后的内容,看<img>标签的src是否被正确替换。
- 检查火车头采集
- 原因:
-
问题:发布的文章没有生成图集,而是普通文章。
- 原因:在发布时,火车头没有指定正确的模型。
- 解决:在火车头发布项目的“高级设置”或“模型”选项中,确保选择的模型是 “图集”,而不是“文章”或其他,DedeCMS 的不同模型对应不同的数据表。
火车头 + DedeCMS 图集采集是一个强大但需要精细配置的组合,成功的关键在于:
- 精准的字段配置:确保
litpic和body字段采集到正确的数据。 - 正确的脚本路径:
require_once 'DedeCMS核心文件路径';是成败的基石。 - 理解
GetRemoteImage函数:它就是你实现图集自动化的“魔法棒”。
只要按照以上步骤仔细操作,多测试、多调试,你就可以成功搭建起一个高效的图集采集系统。
