这是一个基于 Node.js 开发的网页文章剪藏工具,专门用于将网页文章(如知乎、微信公众号等)抓取并转换为格式规范、内容纯净的 Markdown 文件。
- 绕过反爬虫检测:集成
puppeteer-extra-plugin-stealth插件,模拟真实用户行为,有效应对知乎、微信等平台的自动化访问限制。 - 正文智能提取:使用 Mozilla 的
Readability算法(Firefox 阅读模式同款),自动识别文章标题和正文,过滤导航、广告、侧边栏等无关元素。 - 批量处理支持:支持从
.csv、.xls、.xlsx或.txt文件中批量导入链接进行自动化处理。 - 高质量 Markdown 转换:采用
Turndown库并集成 GFM 插件,支持表格、任务列表等。 - 环境兼容性:支持使用系统中已安装的 Chrome 浏览器,避免重复下载庞大的 Chromium。
- 页面加载:通过
Puppeteer启动 Chrome 浏览器并导航至目标 URL,使用networkidle2等待网络空闲。 - 反检测:启用
Stealth插件并设置真实的User-Agent,隐藏自动化特征。 - 内容抓取:获取页面完全渲染后的 HTML 内容。
- 正文解析:利用
JSDOM构建文档对象模型,通过Readability提取核心文章数据(标题、正文 HTML)。 - 格式转换:使用
Turndown将 HTML 片段转换为 Markdown 格式。 - 本地保存:根据域名和时间戳自动生成文件名并保存至本地。
puppeteer-extra: Puppeteer 的增强版,支持插件扩展。puppeteer-extra-plugin-stealth: 用于隐藏 Puppeteer 的自动化特征。@mozilla/readability: 用于从 HTML 中提取文章正文。jsdom: 在 Node.js 环境中模拟浏览器 DOM。turndown: 将 HTML 转换为 Markdown。turndown-plugin-gfm: Turndown 的插件,支持 GitHub Flavored Markdown (GFM),包括表格、任务列表等。
- Node.js: 建议使用 LTS 版本。
- Google Chrome 浏览器: 本项目需要 Chrome 浏览器来渲染页面。
- 在项目根目录下创建
.env文件。 - 添加以下配置并根据你的实际安装路径修改
CHROME_PATH:注意:代码中也提供了默认路径,如果你的安装路径是标准路径,则可以跳过此步骤。CHROME_PATH=C:\Program Files\Google\Chrome\Application\chrome.exe
在项目根目录下运行:
npm install本项目提供了一个 API 接口,方便第三方服务调用。
npm start服务器默认在 3000 端口启动。
- Docker 已安装
- 端口 8081 可用(或自定义端口)
# 拉取代码
git clone <your-repo-url> web_clipper
cd web_clipper
# 构建镜像
docker build -t web-clipper-api .
# 运行容器(后台运行,自动重启)
docker run -d \
--name web-clipper-api \
-p 8081:3000 \
--restart unless-stopped \
web-clipper-api# 检查容器状态
docker ps | grep web-clipper-api
# 测试 API
curl -X POST http://localhost:8081/api/parse \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'# 查看日志
docker logs web-clipper-api
# 查看实时日志
docker logs -f web-clipper-api
# 重启服务
docker restart web-clipper-api
# 停止服务
docker stop web-clipper-api
# 删除容器
docker rm web-clipper-api
# 删除镜像
docker rmi web-clipper-api# 拉取最新代码
git pull
# 重新构建并部署
docker build -t web-clipper-api .
docker stop web-clipper-api
docker rm web-clipper-api
docker run -d \
--name web-clipper-api \
-p 8081:3000 \
--restart unless-stopped \
web-clipper-api
# 清理旧镜像(可选)
docker image prune -f# 使用不同端口(如 3000)
docker run -d \
--name web-clipper-api \
-p 3000:3000 \
--restart unless-stopped \
web-clipper-api
# 使用环境变量
docker run -d \
--name web-clipper-api \
-p 8081:3000 \
-e PORT=3000 \
--restart unless-stopped \
web-clipper-api部署成功后访问:http://<服务器IP>:8081/api/parse
- Endpoint:
POST /api/parse - Content-Type:
application/json
请求体 (Body):
{
"url": "<要抓取的文章链接>"
}成功响应 (200 OK):
{
"success": true,
"data": {
"title": "文章标题",
"content": "... Markdown 内容 ...",
"url": "<原始链接>",
"createdAt": "... ISO 8601 时间戳 ..."
}
}失败响应 (4xx/5xx):
{
"success": false,
"error": {
"code": "ERROR_CODE",
"message": "详细错误信息"
}
}在终端中执行以下命令,将 <Input> 替换为你想要抓取的文章链接或包含链接的文件路径:
node clipper.js <Input>node clipper.js https://zhuanlan.zhihu.com/p/2011434236989682345支持 .csv、.xls、.xlsx 和 .txt 格式。
- 对于 CSV/Excel:脚本会读取名为
url的列,如果不存在则读取第一列。 - 对于 TXT:每行一个 URL。
node clipper.js links.csv
node clipper.js list.xlsx
node clipper.js urls.txt执行成功后,Markdown 文件将自动生成在项目根目录下。