logo
1
1
WeChat Login
ge56_尝试ch72模块增加wps
2026_02_24_1310-wmtag_memo_分支_ee20_在ch76模块中_增加功能_从chrome浏览器书签中_抽取其中的_微信文章的链接

Headless Chrome 浏览器自动化环境

目录

项目概述

这是一个完整的 Chrome Headless 无头浏览器环境安装解决方案,专为 Web 自动化和浏览器自动化测试设计,支持 Selenium 和 Playwright 框架。同时提供微信公众号文章批量下载和 Markdown 转换功能。

主要功能

浏览器自动化

  • Chrome Headless: 无头浏览器模式,支持远程调试
  • Selenium 4.41.0: 经典 Web 自动化框架
  • Playwright 1.58.0: 现代化浏览器自动化框架
  • Python 环境: 使用 uv 管理依赖
  • Node.js 支持: 使用 fnm 管理 Node 版本

文章处理

  • 批量下载: 支持批量下载网页并保存为 HTML5 单文件
  • Markdown 转换: 批量将 HTML5 文件转换为 Markdown 格式
  • 图片提取: 自动提取 base64 编码的图片并保存为独立文件
  • 内容清理: 自动清理微信文章的 UI 元素(评论、分享按钮、二维码等)
  • 图片去重: 基于内容哈希的图片去重机制

目录结构

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 虚拟环境

快速开始

方法一:使用 Makefile(推荐)

# 查看帮助 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书签提取微信公众号链接

支持从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

Markdown 转换流程

# 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 会执行以下操作:

  1. 清理 get_markdown/ 目录下的输出
  2. 清理 me30_准备转换为markdown的文章列表/ 目录
  3. 清理 ne30_已经转换为markdown的文章列表/ 目录
  4. 从备份恢复 he30_下载完毕的文章列表/ 中的原始列表

配置说明

Chrome 远程调试端口

默认端口: 9222

可在 config/chrome_env.sh 中修改:

export CHROME_REMOTE_DEBUGGING_PORT=9222

Chrome 启动参数

参数说明
--headless无头模式
--no-sandbox禁用沙箱(Docker 必需)
--disable-dev-shm-usage禁用 /dev/shm(Docker 必需)
--remote-debugging-port=9222远程调试端口
--disable-gpu禁用 GPU
--disable-setuid-sandbox禁用 setuid 沙箱

Python 依赖

项目使用 uv 管理 Python 依赖:

[project] dependencies = [ "selenium==4.41.0", "playwright==1.58.0", "beautifulsoup4>=4.12.0", "html2text>=2020.1.16", "lxml>=4.9.0", ]

Node.js 环境

使用 fnm exec --using=24 执行 npm 命令:

fnm exec --using=24 npm install -g puppeteer

使用示例

Selenium 示例

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()

Playwright 示例

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)

脚本说明

Shell 脚本

脚本功能
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.shHTML5 转 Markdown(Shell 包装器)
extract_wechat_bookmark.sh从书签提取微信链接(Shell 包装器)

Python 脚本

脚本功能
batch_download.py批量下载文章核心逻辑
compare_and_prepare_list.py比对 HTML5 文件与列表,生成待转换列表
batch_html5_to_markdown.pyHTML5 转 Markdown 核心逻辑,支持图片提取和去重
test_html5_archive.pyHTML5 页面归档测试
extract_wechat_bookmark.py从Chrome书签提取微信公众号链接核心逻辑

故障排除

问题1: Chrome 启动失败

解决方案:

# 检查 Chrome 是否安装 which google-chrome || which chromium # 检查依赖库 ldd $(which google-chrome) | grep "not found" # 查看日志 tail -f logs/chrome.log

问题2: Selenium 连接失败

解决方案:

# 检查 ChromeDriver 版本 chromedriver --version # 检查 Chrome 版本 google-chrome --version # 版本需要匹配

问题3: Playwright 浏览器未安装

解决方案:

# 安装 Playwright 浏览器 uv run playwright install chromium # 安装系统依赖 uv run playwright install-deps

问题4: Docker 环境问题

解决方案:

# 确保使用必要的启动参数 --no-sandbox --disable-dev-shm-usage --disable-setuid-sandbox

问题5: 图片占位符未替换

解决方案: 检查 batch_html5_to_markdown.py 中的正则表达式是否匹配图片文件名格式。

安装路径

  • 源码目录: /workspace/ch76_headless_chrome_env
  • 安装目录: /root/co30_ai_cowokers/ch76_headless_chrome_env

技术支持

如遇问题,请检查:

  1. 日志文件 (logs/ 目录)
  2. 服务状态 (./scripts/status_chrome.sh)
  3. Chrome 版本和 ChromeDriver 版本匹配
  4. 系统资源使用情况

许可证

本项目基于开源软件包,遵循相应开源许可证。

致谢

  • Google Chrome 团队提供优秀的浏览器
  • Selenium 项目提供成熟的自动化框架
  • Microsoft Playwright 团队提供现代化的浏览器自动化工具
  • html2text 项目提供 HTML 转 Markdown 功能

最后更新: 2026-02-24 版本: 1.2 维护者: OpenClaw Automation