
本文介绍如何通过无头浏览器工具(如 puppeteer 或 playwright)自动化抓取嵌入在 iframe 中的动画视频直链,并批量下载,避免手动逐个查找网络请求的繁琐操作。
本文介绍如何通过无头浏览器工具(如 puppeteer 或 playwright)自动化抓取嵌入在 iframe 中的动画视频直链,并批量下载,避免手动逐个查找网络请求的繁琐操作。
要实现从类似 animejoy.ru 这类动画网站自动批量下载视频,核心思路是复现并自动化你在浏览器开发者工具中手动完成的操作流程,而非解析 HTML 静态结构(因为视频链接通常由 JavaScript 动态加载、加密或受防盗链保护)。以下是清晰可行的技术路径:
一、关键步骤概览
-
启动无头浏览器:使用 Puppeteer(Node.js)或 Playwright(多语言支持,推荐 TypeScript/Python),模拟真实用户访问目标动画主页(如
https://animejoy.ru/tv-serialy/3647-provozhayuschaya-v-posledniy-put-friren1.html); -
定位并遍历播放器 iframe:通过 CSS 选择器(如
iframe[src*="player"]或动态 class)识别所有集数对应的播放器 iframe,依次切换上下文(page.frame()); -
捕获网络请求中的视频资源:启用请求拦截(
page.on('request') / page.on('response')),过滤出 MIME 类型为video/mp4、application/vnd.apple.mpegurl(HLS)或含.mp4/.m3u8路径的请求 URL; -
提取并去重有效直链:对捕获的 URL 进行合法性校验(如状态码 200、可预检
HEAD请求)、去除临时 token 过期参数(必要时需逆向分析签名逻辑); -
批量下载与保存:调用
axios或node-fetch流式写入文件,按集数命名(如Frieren_S01E01.mp4),支持并发控制(建议 3–5 个并发避免被限流)。
二、注意事项与进阶提示
- ⚠️ 反爬与风控:目标站可能校验
User-Agent、Referer、Cookie 或执行前端指纹检测。务必设置合理延时(page.waitForTimeout())、启用真实 UA 及保留登录态(如导入已登录的 Cookie); - ? 动态加载场景:若视频源通过 AJAX 或 WebWorker 加载,需监听
fetch请求或注入客户端脚本(page.evaluate())主动提取window.player?.src或document.querySelector('video').src; - ? HLS/MPEG-DASH 支持:若捕获到
.m3u8,需额外使用ffmpeg或hls-downloader合并分片,不可直接用curl下载; - ✅ 验证可行性:首次运行前,建议先禁用无头模式(
headless: false)并手动断点调试,确认 iframe 切换与请求捕获逻辑准确。
三、最小可行示例(Puppeteer + Node.js)
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
const videoUrls = new Set();
page.on('response', async (response) => {
const url = response.url();
const contentType = response.headers()['content-type'] || '';
if ((url.includes('.mp4') || url.includes('.m3u8')) &&
(contentType.includes('video/') || contentType.includes('application/vnd.apple'))) {
videoUrls.add(url);
}
});
await page.goto('https://animejoy.ru/tv-serialy/3647-provozhayuschaya-v-posledniy-put-friren1.html', { waitUntil: 'networkidle2' });
// 此处补充:点击“第1集”→等待 iframe 加载→重复至最后一集
console.log('Detected video URLs:', Array.from(videoUrls));
await browser.close();
})();
该方案不依赖服务端渲染或逆向加密算法,门槛低、适配性强,是处理现代 JS 渲染视频页的首选实践。后续可封装为 CLI 工具,支持配置剧集范围、输出目录及下载线程数,真正实现“一键离线追番”。











