ThinkPHP 8.1需通过QueryList采集网页数据并交由FFmpeg或Python合成4K视频;先执行composer require jaeger/querylist安装,再在config/querylist.php配置最小可用环境,否则报Class not found错误。

你需要用ThinkPHP 8.1自动抓取网页内容并生成4K分辨率的视频教程,但实际流程中TP本身不处理视频编码——必须把QueryList采集的数据结构化输出后,交由FFmpeg或Python脚本合成视频;关键在于采集环节的稳定性、字段精准提取与时间戳对齐。
安装QueryList并配置基础采集环境
在ThinkPHP 8.1项目根目录执行:composer require jaeger/querylist。这一步不能跳过,否则后续所有采集调用都会报Class not found错误。
在config/目录下新建querylist.php,写入最小可用配置:
<?php return ['default' => ['timeout' => 10, 'retry' => 3, 'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36']];
立即学习“PHP免费学习笔记(深入)”;
注意:不要复制网上流传的含type、host等数据库字段的配置——QueryList v4.3+已移除该配置项,强行保留会导致QueryList::get()静默失败。
编写可复用的爬虫命令类
运行php think make:command CrawlVideoData生成命令类文件。
打开app/command/CrawlVideoData.php,在execute()方法中填入以下逻辑:
① 初始化QueryList实例并设置Referer防止反爬:$ql = QueryList::getInstance(); $ql->setServer('https://example.com')->setHeader(['Referer' => 'https://example.com']);
② 使用rules()定义结构化提取规则,例如抓取4K教程标题、时长、章节锚点URL:
$rules = [ 'title' => ['h1', 'text'], 'duration' => ['.video-duration', 'text'], 'chapter_urls' => ['ul.chapter-list li a', 'href'] ];
③ 执行采集并过滤空值:$data = $ql->get('https://example.com/4k-tutorial')->rules($rules)->query()->getData(function ($item) { return !empty($item['title']) && !empty($item['duration']); });
④ 将清洗后的数组存入runtime/crawl/4k_tutorial_'.date('Ymd').'.json,供后续视频合成脚本读取。
生成带字幕与章节标记的4K视频
方法一:用FFmpeg拼接本地MP4片段 + 自动注入SRT字幕
先确保已安装FFmpeg并加入系统PATH;然后用PHP执行shell命令:exec("ffmpeg -i input.mp4 -vf \"subtitles=subtitle.srt\" -c:a copy output_4k.mp4 2>&1", $output);
方法二:调用Python脚本完成全自动合成(推荐)
创建scripts/generate_4k_video.py,用moviepy读取JSON中的章节时间戳,逐段截取、叠加标题动画、导出3840×2160视频;在TP命令中用shell_exec("python scripts/generate_4k_video.py ".escapeshellarg($json_path));触发。
【必须提前确认】Python脚本中需硬编码指定config["fps"] = 60,否则默认30帧无法满足4K平台上传要求。
防封策略与日志追踪
在采集循环内添加随机延迟:usleep(rand(1000000, 3000000));(即1~3秒),避免高频请求被WAF拦截。
每次采集完成后,用Log::write('CRAWL_SUCCESS', 'video_crawl');记录成功日志,并在runtime/log/video_crawl/下按日期归档。
若目标页面返回HTTP 403或空DOM,立即终止当前URL采集,跳转至下一个,不重试——因为4K教程页通常有CDN动态验证,重试只会加剧IP封禁风险。



















