一套网页内容处理的命令行工具:
- md-fetch - 将网页转换为干净的 Markdown 格式
- md-fetch-screen - 对网页进行高质量截图
由 Claude Code 和 Claude Sonnet 开发
- 🚀 使用原生 fetch API 获取网页内容
- 🌐 支持无头浏览器模式(Puppeteer)处理 SPA 页面
- 📄 使用 Mozilla Readability 提取主要内容
- ✨ 使用 Turndown 将 HTML 转换为 Markdown
- 📋 自动生成 YAML frontmatter(包含标题、URL、作者、发布时间等元数据)
- 🎯 支持自定义 CSS 选择器提取内容
- 🔒 代理支持(HTTP_PROXY/HTTPS_PROXY 环境变量)
- ⚙️ 可配置的超时、headers 等选项
- 🔄 自动重试(3 次,指数退避)
- 📦 最小化依赖
使用 md-fetch 最简单的方式是从 npm 全局安装:
# 使用 npm
npm install -g md-fetch
# 使用 pnpm
pnpm add -g md-fetch
# 使用 yarn
yarn global add md-fetch安装后,md-fetch 和 md-fetch-screen 两个命令都可以全局使用。
# 克隆项目(如果还没有)
git clone <repo-url>
cd md-fetch
# 安装依赖
pnpm install使用 pnpm:
# 1. 构建项目
pnpm build
# 2. 配置 pnpm(首次使用需要)
pnpm setup
# 3. 全局链接(开发时推荐)
pnpm link --global
# 4. 现在可以在任何位置使用 md-fetch 命令
md-fetch https://example.com使用 npm:
# 1. 构建项目
pnpm build
# 2. 全局链接
npm link
# 3. 现在可以在任何位置使用 md-fetch 命令
md-fetch https://example.com修改代码后重新构建:
# 重新构建后会自动生效,无需重新 link
pnpm build
md-fetch https://example.com如果是通过 npm install -g md-fetch 安装的:
# 使用 npm
npm uninstall -g md-fetch
# 使用 pnpm
pnpm remove -g md-fetch
# 使用 yarn
yarn global remove md-fetch如果是通过 npm link 或 pnpm link 安装的:
使用 pnpm:
# 取消全局链接
pnpm unlink --global
# 可选:清理 pnpm 全局 store 中未被引用的包(释放磁盘空间)
pnpm store prune使用 npm:
# 取消全局链接
npm unlink -g md-fetch# 基本使用 - 输出到 stdout
pnpm dev -- https://example.com
# 保存到文件
pnpm dev -- https://example.com -o output.md
# 浏览器模式(用于 SPA 页面)
pnpm dev -- -b https://react-app.example.com
# 禁用 readability,保留完整内容
pnpm dev -- https://example.com -R
# 或使用完整选项名
pnpm dev -- https://example.com --no-readability
# 使用自定义选择器
pnpm dev -- https://example.com -s "article.main-content"
# 处理多个 URL
pnpm dev -- https://example.com https://httpbin.org/html
# 自定义 HTTP headers
pnpm dev -- https://example.com -H "Authorization: Bearer token"
# 使用代理
pnpm dev -- https://example.com --proxy http://proxy.example.com:8080
# 详细日志
pnpm dev -- https://example.com --verbose
# 查看所有选项
pnpm dev -- --help# 基本使用
md-fetch https://example.com
# 保存到文件
md-fetch https://example.com -o article.md
# 浏览器模式
md-fetch -b https://react-app.example.com
# 使用代理(从环境变量)
export HTTPS_PROXY=http://proxy.example.com:8080
md-fetch https://example.commd-fetch 会自动在 Markdown 文件开头添加 YAML frontmatter,包含页面的元数据:
---
title: "Example Domain"
url: https://example.com
description: "Example Domain description"
author: "John Doe"
siteName: "Example"
publishedTime: 2024-01-01T00:00:00Z
modifiedTime: 2024-01-15T10:30:00Z
keywords:
- example
- demo
- test
image: https://example.com/og-image.jpg
lang: en
---
# Example Domain
This domain is for use in illustrative examples...title- 页面标题(优先从 Readability、Open Graph、Twitter Cards 或<title>标签提取)url- 原始 URLdescription- 页面描述或摘要author- 作者信息siteName- 站点名称publishedTime- 发布时间(ISO 8601 格式)modifiedTime- 最后修改时间(ISO 8601 格式)keywords- 关键词数组image- 页面主图片(Open Graph 或 Twitter Cards)lang- 页面语言代码
Usage: md-fetch <urls...> [options]
Arguments:
urls URLs to convert to Markdown
Options:
-V, --version output the version number
-o, --output <file> Output to file instead of stdout
-b, --browser Use headless browser mode (for SPA pages)
--browser-path <path> Custom Chrome/Chromium executable path
-R, --no-readability Disable readability, keep full HTML content
-s, --selector <selector> Custom CSS selector to extract content
-H, --header <header> Custom HTTP header (can be repeated)
--proxy <url> Proxy server URL (also reads HTTP_PROXY/HTTPS_PROXY env vars)
-t, --timeout <ms> Request timeout in milliseconds (default: 30000)
--user-agent <string> Custom user agent (default: "md-fetch/1.0.0")
--wait-until <event> Browser wait condition (load|domcontentloaded|networkidle0|networkidle2)
--verbose Enable verbose logging
-h, --help display help for command
- TypeScript - 类型安全
- Node.js ≥18 - 使用原生 fetch API
- ES 模块 - 现代 JavaScript
- Commander - CLI 参数解析
- Mozilla Readability - 智能内容提取
- Turndown - HTML 转 Markdown
- JSDOM - DOM 解析
- Puppeteer-core - 无头浏览器支持
- Undici - 代理支持
# 安装依赖
pnpm install
# 开发模式
pnpm dev -- <url>
# 构建
pnpm build
# 运行测试
pnpm test- Fetch - 使用原生 fetch 或 Puppeteer 无头浏览器获取 HTML 内容
- Extract - 使用 Readability 或自定义选择器提取主要内容,同时提取页面元数据
- Convert - 使用 Turndown 转换为 Markdown
- Generate Frontmatter - 从提取的元数据生成 YAML frontmatter
- Output - 将 frontmatter 和 Markdown 内容输出到 stdout 或保存到文件
md-fetch 自动从环境变量读取代理配置:
# 设置代理
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
# 排除某些域名
export NO_PROXY=localhost,127.0.0.1,.example.com
# 或通过命令行参数
md-fetch https://example.com --proxy http://proxy.example.com:8080- 📸 对网页进行高质量截图
- 🖥️ 全页截图或仅视口截图模式
- 📐 可自定义视口尺寸(宽度/高度)
- ✨ 支持设备像素比例,可生成高清截图(Retina 显示屏)
- 🎨 多种图片格式(PNG、JPEG、WebP)
- 🎯 使用 CSS 选择器截取特定元素
- 🙈 隐藏不需要的元素(广告、弹窗等)
- ⏱️ 可配置截图前延迟
- 🔒 代理支持
- 🌐 使用 Puppeteer 的无头浏览器模式
- 📁 从 URL 和时间戳自动生成文件名
- 🔄 批量截图多个 URL
# 基本截图(全页,标准分辨率)
md-fetch-screen https://example.com
# 仅视口截图,自定义尺寸
md-fetch-screen https://example.com --viewport -W 1440 -H 900
# 高清截图(2倍像素比例,适合 Retina 显示屏)
md-fetch-screen https://example.com --scale 2
# 带详细日志的截图
md-fetch-screen https://example.com --verbose# 截取特定元素
md-fetch-screen https://example.com --selector "#main-content"
# 隐藏广告和弹窗
md-fetch-screen https://example.com --hide ".ad,.popup,.cookie-banner"
# JPEG 格式,自定义质量
md-fetch-screen https://example.com --format jpeg --quality 85
# 保存到指定目录
md-fetch-screen https://example.com --output ./screenshots
# 等待页面加载完成后延迟 2 秒再截图
md-fetch-screen https://example.com --wait-until networkidle0 --delay 2000
# 批量截图多个 URL
md-fetch-screen https://site1.com https://site2.com https://site3.com全页模式(默认):
- 宽度/高度控制浏览器视口大小
- 截图会捕获整个页面内容
- 最终图片尺寸取决于页面的实际高度
# 全页截图,视口宽度 1920px
md-fetch-screen https://example.com -W 1920 -H 1080视口模式:
- 宽度/高度直接控制截图尺寸
- 只捕获视口内可见的内容
# 精确 1440x900 的截图
md-fetch-screen https://example.com --viewport -W 1440 -H 900像素比例(设备像素比):
--scale 1(默认):标准分辨率- 视口 1920x1080 → 图片 1920x1080 像素
--scale 2:高清(Retina)- 视口 1920x1080 → 图片 3840x2160 像素
--scale 3:超高清- 视口 1920x1080 → 图片 5760x3240 像素
# 高质量 Retina 截图
md-fetch-screen https://example.com --scale 2
# 视口模式 + 2倍像素比例 = 2880x1800 最终图片
md-fetch-screen https://example.com --viewport -W 1440 -H 900 --scale 2用法: md-fetch-screen [options] <urls...>
参数:
urls 要截图的 URL
选项:
-V, --version 输出版本号
视口和尺寸:
-f, --full-page 全页截图(默认)
--viewport 仅视口截图
-W, --width <pixels> 视口宽度(像素)(默认:1920)
-H, --height <pixels> 视口高度(像素)(默认:1080)
--scale <number> 设备像素比例,用于高清截图(1/2/3,默认:1)
输出:
--output <dir> 输出目录(默认:".")
--format <type> 图片格式:png|jpeg|webp(默认:"png")
--quality <number> JPEG/WebP 质量 0-100(默认:90)
浏览器:
--browser-path <path> 自定义 Chrome/Chromium 可执行文件路径
--wait-until <event> 等待条件:load|domcontentloaded|networkidle0|networkidle2
--timeout <ms> 超时时间(毫秒)(默认:30000)
--user-agent <string> 自定义 user agent
--proxy <url> 代理服务器 URL
内容:
--delay <ms> 截图前延迟时间(毫秒)(默认:0)
--selector <css> CSS 选择器,用于截取特定元素
--hide <selectors> 要隐藏的 CSS 选择器(逗号分隔)
其他:
--verbose 启用详细日志
-h, --help 显示帮助信息
截图会自动使用以下格式命名:
<域名_路径_前50字符>_<时间戳>.png
示例:
example.com_20251229153045.pnggithub.com_user_repo_issues_123_20251229153045.png
文件名包含:
- 域名和路径(最多 50 个字符,已进行文件系统安全化处理)
- 时间戳格式:
YYYYMMDDHHmmss - 基于格式的文件扩展名
MIT