用途
Web Fetch 用于抓取网页内容,并将其转换为干净的 Markdown 和 PDF 格式。它支持一般网站,也专门支持微信公众号文章。适合需要保存网页正文、将文章转为可编辑文本或生成便于阅读的 PDF 的场景。
主要能力
- 自动去除噪声内容,包括导航、页眉、页脚、侧边栏。
- 保留图片并附带 alt 文本。
- 对微信公众号文章进行特殊处理,包括懒加载图片和元数据提取。
- 输出干净的 Markdown,便于翻译或后续处理。
- 支持转换为 PDF,采用干净的阅读样式。
- 支持中文(CJK)字体。
- 默认同时输出 Markdown 和 PDF。
依赖安装
核心依赖:
pip install crawl4ai requests beautifulsoup4 markdownify
微信公众号文章抓取:
pip install playwright
playwright install chromium
支持 CJK 字体的 PDF 转换:
pip install reportlab markdown beautifulsoup4
说明:reportlab 提供良好的 CJK 字体支持,可在 Windows/Mac/Linux 上运行,无需系统依赖。
使用方式
一般网页
对大多数网站,使用基于 crawl4ai 的抓取脚本:
python scripts/fetch_web_content.py <url> <output_filename>
示例:
python scripts/fetch_web_content.py https://example.com/article article.md
微信公众号文章
对微信文章,使用基于 Playwright 的抓取脚本,可绕过反爬:
python scripts/fetch_weixin.py <url> [output_filename]
示例:
# 自动生成文件名(YYYYMMDD+标题格式)
python scripts/fetch_weixin.py "https://mp.weixin.qq.com/s/xxxxx"
# 自定义文件名
python scripts/fetch_weixin.py "https://mp.weixin.qq.com/s/xxxxx" article.md
特点:
- 使用真实 Chromium 浏览器绕过反爬保护。
- 自动处理懒加载图片。
- 根据发布日期和标题自动生成文件名(YYYYMMDD 格式)。
- 支持可见浏览器(用于调试)和无头模式。
将 Markdown 转换为 PDF
抓取内容为 Markdown 后,可转换为 PDF:
python scripts/md_to_pdf.py <markdown_file> [--output output.pdf]
示例:
# 转换单个文件为 PDF(自动生成输出名)
python scripts/md_to_pdf.py article.md
# 使用自定义输出名
python scripts/md_to_pdf.py article.md --output custom_name.pdf
# 批量转换整个目录
python scripts/md_to_pdf.py ./articles_folder --concurrency 4
特点:
- 使用 Microsoft YaHei 提供出色的中文(CJK)字体支持。
- 支持图片渲染(HTTP/HTTPS URL 和本地路径)。
- 自动按比例缩放图片。
- 支持单文件和批量目录转换。
- 排版干净易读,针对中文内容优化。
响应模式
当用户请求抓取网页内容时:
-
识别 URL 类型:
- 微信 URL(mp.weixin.qq.com)→ 使用 fetch_weixin.py
- 其他 URL → 使用 fetch_web_content.py
-
确定输出格式:
- 用户明确提到“PDF”→ MD + PDF
- 用户说“只要 MD”/“不要 PDF”/“仅 markdown”→ 仅 MD
- 请求不明确 → 询问:“是否也需要 PDF 格式?”
检测示例:
- “Fetch as PDF” / “转换为PDF”→ MD + PDF
- “Save to PDF”→ MD + PDF
- “Get markdown only” / “只要markdown”→ 仅 MD
- “Fetch this article”→ 询问用户
- “抓取网页内容”→ 询问用户
-
执行抓取:
python scripts/fetch_web_content.py <url> <output>.md
# 或
python scripts/fetch_weixin.py <url> [output].md
注意:对微信文章,输出文件名可选,会自动生成为 YYYYMMDD+标题。
- 转换为 PDF(如请求):
python scripts/md_to_pdf.py <output>.md
这会在 <output>.md 旁生成 <output>.pdf。
- 报告结果:
- 确认两个文件已保存(如有 PDF)。
- 显示两种格式的统计信息。
- 建议后续步骤。
示例工作流
工作流 1:抓取并生成 PDF(明确请求)
# 用户:“Fetch this article as PDF: https://example.com/article”
# 步骤 1:抓取 markdown
python scripts/fetch_web_content.py https://example.com/article article.md
# 步骤 2:转换为 PDF
python scripts/md_to_pdf.py article.md
# 结果:
# ✓ Saved: article.md (45 KB, 8,234 words)
# ✓ PDF: article.pdf (with images embedded)
工作流 2:仅抓取 Markdown
# 用户:“Get the markdown only”
# 步骤 1:抓取 markdown
python scripts/fetch_web_content.py https://example.com/article article.md
# 步骤 2:跳过 PDF 转换
# 结果:
# ✓ Saved: article.md (45 KB, 8,234 words)
工作流 3:请求不明确
# 用户:“Fetch this article: https://example.com/article”
# Claude 询问:“I'll fetch this article. Would you like me to convert it to PDF as well?”
# 用户:“Yes”
# 然后按工作流 1 继续
工作流 4:微信文章并生成 PDF
# 用户:“抓取微信文章为PDF”
# 步骤 1:抓取 markdown(自动生成文件名为 YYYYMMDD+标题)
python scripts/fetch_weixin.py "https://mp.weixin.qq.com/s/xxxxx"
# 步骤 2:转换为 PDF(使用自动生成的文件名)
python scripts/md_to_pdf.py 20251214关于财政政策和货币政策的关系.md
# 结果:
# ✓ Saved: 20251214关于财政政策和货币政策的关系.md (中文内容)
# ✓ PDF: 20251214关于财政政策和货币政策的关系.pdf (完美支持中文和图片)
批量处理
对多个 URL,循环抓取每个:
for url in url1 url2 url3; do
filename="output_$(date +%s)"
python scripts/fetch_web_content.py "$url" "$filename.md"
python scripts/md_to_pdf.py "$filename.md" # 可选:添加 PDF
done
故障排除
| 问题 | 解决方案 |
|---|---|
| 内容为空 | 尝试不同的 CSS 选择器,或使用微信 Playwright 抓取器 |
| 图片缺失 | 检查网站是否阻止外部请求 |
| 编码问题 | 内容默认保存为 UTF-8 |
| 微信被阻止 | 使用 Playwright 抓取器——它启动真实浏览器绕过反爬 |
| 微信超时 | 脚本有 60 秒超时并重试——通常第二次尝试成功 |
| Playwright 未安装 | 运行:pip install playwright && playwright install chromium |
| PDF 转换失败 | 安装依赖:pip install reportlab markdown beautifulsoup4 |
| PDF 中文字符 | 自动使用 Microsoft YaHei 字体(出色的 CJK 支持) |
| PDF 中图片缺失 | 检查图片 URL 可访问或本地图片路径正确 |
| PDF 过大 | 图片被嵌入并缩放;原始图片大小影响 PDF 大小 |
适用场景
- 保存网页文章为 Markdown 以便编辑、翻译或归档。
- 将网页或微信公众号文章转换为 PDF 便于阅读或分享。
- 批量抓取多个网页并生成 Markdown/PDF。
- 需要保留图片和中文排版的场景。
限制
- 需要安装 Python 及相关依赖。
- 微信文章抓取依赖 Playwright 和 Chromium。
- 部分网站可能阻止外部请求,导致图片缺失或内容为空。
- PDF 大小受嵌入图片原始大小影响。
- 未提供关于收费、价格、平台支持范围或效果保证的信息。