这是一个完整的 Chrome Headless 无头浏览器环境安装解决方案,专为 Web 自动化和浏览器自动化测试设计,支持 Selenium 和 Playwright 框架。同时提供微信公众号文章批量下载和 Markdown 转换功能。
ch76_headless_chrome_env/ ├── Makefile # 便捷命令入口 ├── README.md # 本文件 ├── master_controller.sh # 交互式管理菜单 ├── pyproject.toml # Python 项目配置 ├── uv.lock # uv 依赖锁定文件 ├── config/ # 配置文件 │ ├── README.md # 配置说明 │ ├── chrome_env.sh # Chrome 环境变量配置 │ └── python_env.sh # Python 环境配置 ├── scripts/ # 安装和启动脚本 │ ├── README.md # 脚本说明 │ ├── install_headless_chrome.sh # 主安装脚本 │ ├── start_chrome.sh # 启动 Chrome 服务 │ ├── stop_chrome.sh # 停止 Chrome 服务 │ ├── status_chrome.sh # 状态检查 │ ├── test_all.sh # 完整测试脚本 │ ├── show_access_info.sh # 显示访问信息 │ ├── destroy_chrome.sh # 销毁环境 │ ├── batch_download.sh # 批量下载脚本 (Shell 包装器) │ ├── batch_download.py # 批量下载核心逻辑 │ ├── compare_and_prepare_list.sh # 比对生成待转换列表 (Shell) │ ├── compare_and_prepare_list.py # 比对核心逻辑 │ ├── batch_html5_to_markdown.sh # HTML5 转 Markdown (Shell) │ ├── batch_html5_to_markdown.py # 转换核心逻辑 │ └── test_html5_archive.py # HTML5 归档测试 ├── pull_list/ # 文章列表管理 │ ├── README.md # 列表管理说明 │ ├── fe30_准备下载的文章列表/ # 待下载的文章 URL 列表 │ ├── he30_下载完毕的文章列表/ # 已完成下载的文章列表 │ ├── me30_准备转换为markdown的文章列表/ # 待转换列表 │ └── ne30_已经转换为markdown的文章列表/ # 已完成转换列表 ├── get_markdown/ # Markdown 输出目录 │ └── YYYY-MM-DD/ # 按日期组织 │ └── 文章标题/ # 每篇文章独立目录 │ ├── README.md # Markdown 文档 │ └── assets/ # 图片资源 ├── wmgitignore/ # 已下载的 HTML5 文件(被 git 忽略) │ └── README.md # 说明 ├── logs/ # 日志文件 │ └── README.md # 日志说明 └── .venv/ # Python 虚拟环境
# 查看帮助
make
# 安装环境
make install
# 启动 Chrome 服务
make start
# 查看状态
make status
# 停止服务
make stop
# 运行测试
make test
# 打开交互菜单
make menu
# 打开交互菜单
./master_controller.sh
# 非交互式操作
./master_controller.sh -i # 安装
./master_controller.sh -s # 启动
./master_controller.sh -S # 停止
./master_controller.sh -c # 状态
# 给脚本添加执行权限
chmod +x scripts/*.sh
# 运行安装脚本
./scripts/install_headless_chrome.sh
支持从Chrome浏览器导出的书签HTML文件中提取微信公众号文章链接。
┌─────────────────────────────────┐ │ de30_原有的浏览器的书签 │ 1. 导出Chrome书签 │ │ 放入HTML文件 └───────────────┬─────────────────┘ │ make extract_bookmark ▼ ┌─────────────────────────────────┐ │ fe30_准备下载的文章列表 │ 2. 提取微信公众号链接 │ │ 生成文章列表 │ de40_已经处理完成的书签 │ 原书签文件移至此 └─────────────────────────────────┘
# 导出Chrome书签
# 1. 打开Chrome浏览器
# 2. 访问 chrome://bookmarks/
# 3. 点击右上角"..." → "导出书签"
# 4. 保存HTML文件到 pull_list/de30_原有的浏览器的书签/
# 提取微信公众号链接
make extract_bookmark
# 列出待处理的书签文件
make list_bookmark
# 指定书签文件处理
./scripts/extract_wechat_bookmark.sh -f bookmarks.html
生成的文章列表格式:
# 微信公众号文章列表
## 生成信息
- 生成时间: 2026-02-24 16:30:00
- 源书签文件: bookmarks.html
- 文章数量: 42
## 文章列表
- [文章标题1](https://mp.weixin.qq.com/s/xxxxx)
- [文章标题2](https://mp.weixin.qq.com/s/yyyyy)
┌─────────────────────────────────┐ │ fe30_准备下载的文章列表 │ 1. 创建文章列表 └───────────────┬─────────────────┘ │ make batch ▼ ┌─────────────────────────────────┐ │ he30_下载完毕的文章列表 │ 2. 下载完成后移动至此 │ wmgitignore/*.html │ HTML5 文件存储 └───────────────┬─────────────────┘ │ make prepare_convert ▼ ┌─────────────────────────────────┐ │ me30_准备转换为markdown的文章列表│ 3. 待转换列表 └───────────────┬─────────────────┘ │ make convert ▼ ┌─────────────────────────────────┐ │ ne30_已经转换为markdown的文章列表│ 4. 已转换列表 │ get_markdown/YYYY-MM-DD/ │ Markdown 输出 └─────────────────────────────────┘
# 1. 在 pull_list/fe30_准备下载的文章列表/ 创建文章列表
echo "https://mp.weixin.qq.com/s/xxxxx" > pull_list/fe30_准备下载的文章列表/文章列表.md
# 2. 批量下载文章
make batch
# 3. 查看下载结果
make finished
# 1. 比对生成待转换列表
make prepare_convert
# 2. 批量转换为 Markdown
make convert
# 3. 查看转换输出
make list_converted
# 或查看输出目录
ls -la get_markdown/
转换后的 Markdown 文件按日期组织,每个文章独立目录:
get_markdown/ └── 2026-02-24/ └── 20260224_134604_wmbin_go_out_文章标题$${文章ID}$$/ ├── README.md # Markdown 文档(统一命名) └── assets/ # 图片资源目录 ├── image_001.png # 自动编号的图片 ├── image_002.jpg # 支持 png/jpg/webp/gif 等格式 └── image_003.png # 相同内容的图片会去重
开发测试阶段可以使用 make test_reset 重置环境:
# 重置测试状态(清理输出 + 恢复列表)
make test_reset
# 然后重新执行完整流程
make prepare_convert && make convert
test_reset 会执行以下操作:
get_markdown/ 目录下的输出me30_准备转换为markdown的文章列表/ 目录ne30_已经转换为markdown的文章列表/ 目录he30_下载完毕的文章列表/ 中的原始列表默认端口: 9222
可在 config/chrome_env.sh 中修改:
export CHROME_REMOTE_DEBUGGING_PORT=9222
| 参数 | 说明 |
|---|---|
--headless | 无头模式 |
--no-sandbox | 禁用沙箱(Docker 必需) |
--disable-dev-shm-usage | 禁用 /dev/shm(Docker 必需) |
--remote-debugging-port=9222 | 远程调试端口 |
--disable-gpu | 禁用 GPU |
--disable-setuid-sandbox | 禁用 setuid 沙箱 |
项目使用 uv 管理 Python 依赖:
[project]
dependencies = [
"selenium==4.41.0",
"playwright==1.58.0",
"beautifulsoup4>=4.12.0",
"html2text>=2020.1.16",
"lxml>=4.9.0",
]
使用 fnm exec --using=24 执行 npm 命令:
fnm exec --using=24 npm install -g puppeteer
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=options)
driver.get('https://example.com')
print(driver.title)
driver.quit()
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto('https://example.com')
print(page.title())
browser.close()
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option("debuggerAddress", "localhost:9222")
driver = webdriver.Chrome(options=options)
| 脚本 | 功能 |
|---|---|
install_headless_chrome.sh | 完整安装 Chrome、ChromeDriver、Python 环境 |
start_chrome.sh | 启动 Chrome Headless 远程调试服务 |
stop_chrome.sh | 停止 Chrome 服务 |
status_chrome.sh | 检查服务状态和组件安装情况 |
test_all.sh | 执行完整的功能测试 |
show_access_info.sh | 显示连接信息和示例代码 |
destroy_chrome.sh | 销毁环境(停止进程并删除安装目录) |
batch_download.sh | 批量下载文章(Shell 包装器) |
compare_and_prepare_list.sh | 生成待转换列表(Shell 包装器) |
batch_html5_to_markdown.sh | HTML5 转 Markdown(Shell 包装器) |
extract_wechat_bookmark.sh | 从书签提取微信链接(Shell 包装器) |
| 脚本 | 功能 |
|---|---|
batch_download.py | 批量下载文章核心逻辑 |
compare_and_prepare_list.py | 比对 HTML5 文件与列表,生成待转换列表 |
batch_html5_to_markdown.py | HTML5 转 Markdown 核心逻辑,支持图片提取和去重 |
test_html5_archive.py | HTML5 页面归档测试 |
extract_wechat_bookmark.py | 从Chrome书签提取微信公众号链接核心逻辑 |
解决方案:
# 检查 Chrome 是否安装
which google-chrome || which chromium
# 检查依赖库
ldd $(which google-chrome) | grep "not found"
# 查看日志
tail -f logs/chrome.log
解决方案:
# 检查 ChromeDriver 版本
chromedriver --version
# 检查 Chrome 版本
google-chrome --version
# 版本需要匹配
解决方案:
# 安装 Playwright 浏览器
uv run playwright install chromium
# 安装系统依赖
uv run playwright install-deps
解决方案:
# 确保使用必要的启动参数
--no-sandbox
--disable-dev-shm-usage
--disable-setuid-sandbox
解决方案:
检查 batch_html5_to_markdown.py 中的正则表达式是否匹配图片文件名格式。
/workspace/ch76_headless_chrome_env/root/co30_ai_cowokers/ch76_headless_chrome_env如遇问题,请检查:
logs/ 目录)./scripts/status_chrome.sh)本项目基于开源软件包,遵循相应开源许可证。
最后更新: 2026-02-24 版本: 1.2 维护者: OpenClaw Automation