这主要是因为DedeCMS的采集规则是基于正则表达式来匹配HTML标签的,而<script>标签内的内容被视为纯文本,不会被浏览器当作HTML来解析。

要解决这个问题,主要有以下几种方法,从简单到复杂排列:
使用采集“代码片段”功能(推荐,最简单)
这是最直接、最简单的方法,尤其适用于目标网站的<script>标签结构非常固定和规律的情况。
原理: 不去匹配<script>标签本身,而是直接在<script>标签内部寻找图片URL的模式。
操作步骤:

-
分析目标源码:
- 打开你想要采集的网页,右键“查看网页源代码”。
- 找到包含图片URL的
<script>标签,你可能会看到类似这样的代码:<script> var myData = { 'imageUrl': 'https://www.example.com/images/pic1.jpg', 'thumbUrl': 'https://www.example.com/images/thumb_pic1.jpg' }; var anotherPic = 'https://www.another-site.com/another.png'; </script> - 你的目标是提取
'https://www.example.com/images/pic1.jpg'和'https://www.another-site.com/another.png'。
-
编写采集规则:
- 登录DedeCMS后台,进入 “采集” -> “采集中心”。
- 选择一个已有的采集任务或新建一个。
- 在“选择列表页”或“页”的规则设置中,找到 “代码片段” 这个选项。
- 添加规则:
- 内容链接: 这里不填写,因为我们不从这里获取链接。
- 同样不填写。
- 发布时间: 不填写。
- 作者: 不填写。
- 来源: 不填写。
- 缩略图: 这是关键! 在这里填写你找到的图片URL的匹配规则。
-
编写正则表达式:
-
根据你分析的源码模式,编写正则表达式来匹配图片URL。
-
示例1 (匹配单引号包裹的URL): 如果你的图片URL总是被单引号 包裹,可以使用这个正则:
'(https?://[^\s\''<>]+?\.(jpg|jpeg|png|gif|webp))'- 匹配单引号。
(https?://...):匹配以http://或https://开头的URL。[^\s\''<>]+?:匹配除了空白、单引号、尖括号之外的任意字符,非贪婪模式。\.(jpg|jpeg|png|gif|webp):匹配图片文件后缀。- 匹配结尾的单引号。
-
示例2 (匹配双引号包裹的URL): 如果是双引号 ,则改为:
"(https?://[^\s\"<>]+?\.(jpg|jpeg|png|gif|webp))" -
示例3 (匹配某个变量后面的URL): 如果图片URL总是在某个固定变量后面,
imageUrl: '...',可以更精确地匹配:imageUrl\s*:\s*'(https?://[^\s']+?)'imageUrl\s*:\s*'':精确匹配imageUrl: ''或imageUrl : ''这种格式。
-
-
保存并测试:
- 保存你的采集规则。
- 在“”页面,选择你要采集的条目,然后点击“开始采集”或“”。
- 在获取到的内容预览中,检查“缩略图”字段是否正确抓取到了你想要的图片URL。
优点:
- 操作简单,无需修改任何文件。
- 对特定网站非常有效。
缺点:
- 正则表达式编写需要一定技巧,如果目标网站
<script>结构稍有变动,规则就可能失效。 - 一次只能匹配一个URL,如果
<script>里有多个图片URL,你需要为每个URL写一个“代码片段”规则。
修改采集核心文件(高级,一劳永逸)
如果你想让采集功能原生支持从<script>里提取图片,可以修改DedeCMS的采集处理文件,这是一种更根本的解决方案。
原理: 修改采集规则处理逻辑,在匹配<script>标签后,用PHP的DOMDocument或正则表达式来解析其内部的JS代码,并提取其中的图片URL。
操作步骤:
警告: 修改核心文件有风险,请务必备份原文件!操作前请确认你的DedeCMS版本。
-
找到核心文件:
- 这个文件通常位于
/include/dedehtml.class.php或/include/dedecollection.class.php,具体路径可能因版本而异,你需要通过搜索关键词GetInnerText或FindAll来定位处理HTML标签的核心函数。
- 这个文件通常位于
-
修改代码逻辑:
- 在处理
<img>标签的逻辑附近,添加对<script>标签的处理。 - 以下是一个概念性的修改思路,你需要根据你文件中的具体代码进行调整:
// 假设在某个foreach循环中遍历DOM节点 // ... 原有的处理 img 标签的代码 ... // if($tagname == 'img') { ... } // 添加处理 script 标签的代码 if ($tagname == 'script') { // 1. 获取 <script> 标签内的全部文本内容 $script_content = $this->GetInnerText($e); // 2. 使用正则表达式从文本内容中提取图片URL // 这里使用与方法一相同的正则表达式 $pattern = '/[\'"](https?:\/\/[^\s\'"<>\?#]+\.(jpg|jpeg|png|gif|webp))[\'"]/i'; if (preg_match_all($pattern, $script_content, $matches)) { // 3. $matches[1] 会包含所有匹配到的图片URL数组 // 你可以取第一个作为缩略图,或者存入一个字段供后续处理 if (!empty($matches[1])) { // 假设我们要取第一个匹配到的图片作为缩略图 $this->Fields['picname'] = $matches[1][0]; // 如果你想保存所有图片,可以将其序列化后存入一个字段 // $this->Fields['script_images'] = serialize($matches[1]); } } } - 在处理
-
保存文件并测试:
修改后保存文件,重新采集测试。
优点:
- 一劳永逸,以后所有采集任务都能自动处理
<script>里的图片。 - 更灵活,可以在PHP层面进行更复杂的逻辑处理。
缺点:
- 风险较高,修改错误可能导致采集功能甚至网站出错。
- 需要一定的PHP编程能力。
- 升级DedeCMS版本后,修改的代码可能会被覆盖。
使用第三方采集插件或模块
DedeCMS有一个非常丰富的插件生态,你可以去DedeCMS官方论坛或一些插件网站搜索“高级采集”、“智能采集”、“JavaScript采集”等关键词。
原理: 这些第三方插件通常对DedeCMS的采集引擎进行了深度优化和扩展,内置了更强大的HTML解析和JavaScript执行能力,能够更智能地处理各种复杂情况,包括 优点: 缺点: 给你的建议:<script>
总结与建议
方法
优点
缺点
适用人群
代码片段
简单、安全、快速
正则表达式脆弱,一次只能匹配一个URL
新手、临时需求、目标网站结构固定
修改核心
一劳永逸、功能强大
风险高、需要编程能力、升级会失效
开发者、有高级需求的用户
第三方插件
安全、功能强大、有支持
可能付费、需甄别
预算充足、追求稳定和功能的用户
<script>结构太复杂),并且你有编程能力,可以考虑【方法二】。
