一个轻量级的 Go 工具,使用 headless Chrome 从网页中提取 iframe 标签。非常适合分析嵌入内容、抓取 iframe 源或审计第三方集成。
- Headless Browser:通过 chromedp 使用 Chrome DevTools Protocol 完整加载页面,包括动态渲染的内容
- 并发处理:使用可配置的 worker pools 并行处理多个 URL
- 智能等待:随机睡眠间隔确保动态内容有足够时间加载
- 灵活输入:通过命令行参数或输入文件接受 URL
- 去重:自动过滤重复的 iframe 源
- 恢复支持:跳过已处理的 URL,避免重复工作
- 可自定义输出:配置输出目录,选择保存所有 iframe 或仅保存第一个
- Go 1.25.0 或更高版本
- 系统已安装 Chrome/Chromium 浏览器
git clone <repository-url>
cd iframe-extractor
go mod download
go build从单个 URL 提取 iframe:
./iframe-extractor https://example.com处理多个 URL:
./iframe-extractor https://example.com https://test.com https://site.org创建一个文本文件,每行一个 URL:
# urls.txt
https://example.com
https://test.com
# 注释和空行会被忽略
https://another-site.org
处理该文件:
./iframe-extractor --urls-file urls.txt| 标志 | 默认值 | 说明 |
|---|---|---|
--urls-file |
- | 包含 URL 的文件路径(每行一个) |
--skip-already-exists-files |
true |
跳过输出文件已存在的 URL |
--max-workers |
3 |
并行处理的 worker 数量 |
--timeout-seconds |
70 |
加载每个页面的浏览器超时时间(秒) |
--min-sleep-seconds |
10 |
页面加载后等待内容渲染的最短时间 |
--max-sleep-seconds |
25 |
页面加载后等待内容渲染的最长时间 |
--save-all-iframes |
true |
保存找到的所有 iframe(false = 仅保存第一个 iframe) |
--output-dir |
__output_iframes |
提取的 iframe HTML 文件保存目录 |
仅提取每个页面的第一个 iframe:
./iframe-extractor --save-all-iframes=false https://example.com使用 10 个并发 worker 和较短的超时时间处理:
./iframe-extractor --max-workers 10 --timeout-seconds 30 --urls-file urls.txt为加载缓慢的动态内容自定义等待时间:
./iframe-extractor --min-sleep-seconds 15 --max-sleep-seconds 30 https://example.com保存到自定义目录:
./iframe-extractor --output-dir my_iframes https://example.com重新处理所有 URL(不跳过已存在的文件):
./iframe-extractor --skip-already-exists-files=false --urls-file urls.txt- 解析输入:从命令行参数或输入文件读取 URL
- 过滤 URL:可选择跳过已处理的 URL
- 并发处理:启动 worker goroutine 并行处理 URL
- 浏览器自动化:对于每个 URL:
- 启动一个 headless Chrome 实例
- 导航到 URL
- 等待页面 body 准备就绪
- 睡眠一个随机时长(在最小/最大秒数之间),以允许动态内容加载
- 使用正则表达式模式匹配从 HTML 中提取 iframe 标签
- 过滤掉
about:blankiframe 和重复项
- 保存结果:创建包含提取的 iframe 标签的 HTML 文件
- 报告:显示进度和遇到的任何错误
提取的 iframe 保存为简单的 HTML 文件:
<!DOCTYPE html>
<html>
<body>
<iframe src="https://example.com/embed/video123">
<iframe src="https://another-site.com/widget">
</body>
</html>文件名派生自 URL 的最后一个路径段:
https://example.com/page/video→video.htmlhttps://example.com/page/→page.htmlhttps://example.com/→index.html- 查询参数会被移除:
page?id=123→page.html
- chromedp/chromedp - Go 的 Chrome DevTools Protocol 驱动