名称: scraper
描述: 从 Notion、DocSend、PDF 及其他来源抓取文档并保存为本地 PDF 文件。当用户需要下载、归档或将网页文档转换为 PDF 格式时使用。支持受保护文档的身份验证流程,并通过配置文件实现会话持久化。返回已下载 PDF 的本地文件路径。
一个使用浏览器自动化技术,从多种来源抓取文档并保存为本地 PDF 文件的命令行工具。
npm install -g docs-scraper
将任意文档 URL 抓取为 PDF:
docs-scraper scrape https://example.com/document
返回本地路径:~/.docs-scraper/output/1706123456-abc123.pdf
使用守护进程抓取(推荐,保持浏览器预热):
docs-scraper scrape <url>
使用命名配置文件抓取(用于需要身份验证的网站):
docs-scraper scrape <url> -p <profile-name>
使用预填充数据抓取(例如,为 DocSend 提供邮箱):
docs-scraper scrape <url> -D email=user@example.com
直接模式(单次运行,不使用守护进程):
docs-scraper scrape <url> --no-daemon
当文档需要身份验证(登录、邮箱验证、密码)时:
初次抓取会返回一个任务 ID:
bash
docs-scraper scrape https://docsend.com/view/xxx
# 输出:抓取被阻止
# 任务 ID:abc123
使用数据重试:
bash
docs-scraper update abc123 -D email=user@example.com
# 或附带密码
docs-scraper update abc123 -D email=user@example.com -D password=1234
配置文件用于存储已认证网站的会话 Cookie。
docs-scraper profiles list # 列出已保存的配置文件
docs-scraper profiles clear # 清除所有配置文件
docs-scraper scrape <url> -p myprofile # 使用指定配置文件
守护进程保持浏览器实例预热,以实现更快的抓取速度。
docs-scraper daemon status # 检查状态
docs-scraper daemon start # 手动启动
docs-scraper daemon stop # 停止守护进程
注意:运行抓取命令时,守护进程会自动启动。
PDF 文件存储在 ~/.docs-scraper/output/ 目录下。守护进程会自动清理超过 1 小时的文件。
手动清理:
docs-scraper cleanup # 删除所有 PDF
docs-scraper cleanup --older-than 1h # 删除超过 1 小时的 PDF
docs-scraper jobs list # 列出等待身份验证的被阻止任务
每个抓取器接受特定的 -D 数据字段。请根据 URL 类型使用相应的字段。
处理: 以 .pdf 结尾的 URL
数据字段: 无(直接下载)
示例:
docs-scraper scrape https://example.com/document.pdf
处理: docsend.com/view/*、docsend.com/v/* 及其子域名(例如 org-a.docsend.com)
URL 模式:
- 文档:https://docsend.com/view/{id} 或 https://docsend.com/v/{id}
- 文件夹:https://docsend.com/view/s/{id}
- 子域名:https://{subdomain}.docsend.com/view/{id}
数据字段:
| 字段 | 类型 | 描述 |
|---|---|---|
email |
用于访问文档的邮箱地址 | |
password |
password | 受保护文档的密码/通行码 |
name |
text | 您的姓名(访问受 NDA 保护的文档时必需) |
示例:
# 为 DocSend 预填邮箱
docs-scraper scrape https://docsend.com/view/abc123 -D email=user@example.com
# 带密码保护
docs-scraper scrape https://docsend.com/view/abc123 -D email=user@example.com -D password=secret123
# 需要 NDA 姓名
docs-scraper scrape https://docsend.com/view/abc123 -D email=user@example.com -D name="John Doe"
# 重试被阻止的任务
docs-scraper update abc123 -D email=user@example.com -D password=secret123
注意:
- DocSend 可能需要邮箱、密码和姓名的任意组合
- 文件夹会被抓取为包含文档链接的目录 PDF
- 提供姓名时,抓取器会自动勾选 NDA 复选框
处理: notion.so/*、*.notion.site/*
数据字段:
| 字段 | 类型 | 描述 |
|---|---|---|
email |
Notion 账户邮箱 | |
password |
password | Notion 账户密码 |
示例:
# 公开页面(无需认证)
docs-scraper scrape https://notion.so/Public-Page-abc123
# 需要登录的私有页面
docs-scraper scrape https://notion.so/Private-Page-abc123 \
-D email=user@example.com -D password=mypassword
# 自定义域名
docs-scraper scrape https://docs.company.notion.site/Page-abc123
注意:
- 公开的 Notion 页面不需要身份验证
- 在生成 PDF 前,切换块会自动展开
- 使用会话配置文件在多次抓取间保持登录状态
处理: 未被其他抓取器匹配的任何 URL(自动后备方案)
数据字段: 动态 - 由 Claude 分析页面确定
LLM 抓取器使用 Claude 分析页面 HTML 并检测:
- 登录表单(动态提取字段名)
- Cookie 横幅(自动关闭)
- 可展开内容(自动展开)
- CAPTCHA(报告为被阻止)
- 付费墙(报告为被阻止)
常见动态字段:
| 字段 | 类型 | 描述 |
|---|---|---|
email |
登录邮箱(如果检测到) | |
password |
password | 登录密码(如果检测到) |
username |
text | 用户名(如果登录使用用户名) |
示例:
# 通用网页(无需认证)
docs-scraper scrape https://example.com/article
# 需要登录的网页
docs-scraper scrape https://members.example.com/article \
-D email=user@example.com -D password=secret
# 当被阻止时,检查任务以获取所需字段
docs-scraper jobs list
# 然后使用抓取器检测到的字段重试
docs-scraper update abc123 -D username=myuser -D password=secret
注意:
- 需要设置 ANTHROPIC_API_KEY 环境变量
- 字段名从页面的实际表单字段中提取
- 失败前最多尝试登录 2 次
- CAPTCHA 需要手动干预
| 抓取器 | password | name | 其他 | |
|---|---|---|---|---|
| DirectPdf | - | - | - | - |
| DocSend | ✓ | ✓ | ✓ | - |
| Notion | ✓ | ✓ | - | - |
| LLM Fallback | ✓* | ✓* | - | 动态* |
*字段通过页面分析动态检测
仅 LLM 后备抓取器需要:
export ANTHROPIC_API_KEY=your_key
可选的浏览器设置:
export BROWSER_HEADLESS=true # 设为 false 用于调试
归档 Notion 页面:
docs-scraper scrape https://notion.so/My-Page-abc123
下载受保护的 DocSend 文档:
docs-scraper scrape https://docsend.com/view/xxx
# 如果被阻止:
docs-scraper update <job-id> -D email=user@example.com -D password=1234
使用配置文件进行批量抓取:
docs-scraper scrape https://site.com/doc1 -p mysite
docs-scraper scrape https://site.com/doc2 -p mysite
成功:本地文件路径(例如 ~/.docs-scraper/output/1706123456-abc123.pdf)
被阻止:任务 ID + 所需的凭证类型
docs-scraper daemon stop && docs-scraper daemon startdocs-scraper jobs list 检查待处理任务docs-scraper cleanup 删除旧 PDF