Skip to content

Maxcilo/web-fetch

Repository files navigation

Web Fetch - 智能网页抓取工具

Python License Tests Twitter Version

智能网页抓取工具,自动选择最佳方案(Scrapling 或 Jina Reader),支持微信公众号、推特、普通网页。

作者: @Go8888I

✨ 特性

v1.4.0 新增功能 🎉

  • 🤖 AI 摘要 - 自动生成文章摘要,提取核心观点
  • 📝 聊天窗口显示 - 摘要直接显示在 Telegram 聊天窗口
  • 🔢 准确字数统计 - 仅统计纯文本(去除图片、URL、Markdown 标记)
  • 📊 完整统计信息 - 字数、图片数、时间戳
  • 💾 双格式输出 - 同时生成 MD + PDF 文件
  • 📱 Telegram 集成 - 自动发送文件到 Telegram

v1.3.0 新增功能 🎉

  • 📕 PDF 生成 - 自动生成 PDF 文件(A4 格式)
  • 🎨 美化样式 - 标题、段落、代码块、表格样式
  • 🖼️ 图片适配 - 自动缩放,避免截断
  • 📄 同时输出 - Markdown + PDF 双文件
  • 🇨🇳 中文支持 - 完美支持中文字体

v1.2.0 新增功能 🎉

  • 📷 图片下载 - 自动下载文章中的所有图片
  • 🖼️ Base64 嵌入 - 图片转 base64 嵌入到 Markdown(推荐)
  • 📦 打包发送 - MD 文件 + 图片目录打包
  • 🔍 智能识别 - 自动提取图片 URL
  • 📊 进度显示 - 下载进度和统计信息

v1.1.0 新增功能 🎉

  • 💾 自动保存 - 自动保存为 MD 文件(带元数据)
  • 📤 Telegram 集成 - 自动发送文件到 Telegram
  • 📊 文章摘要 - 终端显示文章信息和预览
  • 🏷️ 元数据支持 - 标题、URL、时间、抓取方案
  • 📝 增强版工具 - web_fetch_enhanced.py

核心特性

  • 🎯 智能路由 - 自动选择最佳抓取方案
  • 🔄 自动降级 - 主方案失败后自动切换备用方案
  • 🛡️ 安全可靠 - URL 验证、参数检查、内存限制
  • 📱 微信公众号支持 - 能抓取 Jina Reader 无法访问的微信文章
  • 🐦 推特支持 - 完美支持推特内容抓取
  • 💰 节省配额 - 优先使用无限制的 Scrapling,节省 Jina 配额
  • 🧪 单元测试 - 核心功能有完整测试覆盖
  • 📝 类型安全 - 完整的类型提示

🚀 快速开始

安装依赖

# 安装 Scrapling
pip install scrapling html2text curl-cffi browserforge

# 安装 PDF 生成依赖(v1.3.0 新增)
pip install weasyprint markdown Pillow

# 确保 curl 已安装(系统自带)
curl --version

基本用法

# 方案 1:AI 摘要版(推荐)⭐⭐⭐
python3 web_fetch_with_summary.py https://example.com
# 输出:文章摘要 + MD 文件 + PDF 文件 + 发送到 Telegram

# 方案 2:PDF 版
python3 web_fetch_pdf.py https://example.com
# 输出:MD 文件 + PDF 文件

# 方案 3:图片嵌入版
python3 web_fetch_embedded.py https://example.com
# 输出:MD 文件(图片 Base64 嵌入)

# 方案 4:增强版
python3 web_fetch_enhanced.py https://example.com
# 输出:MD 文件(自动保存 + Telegram)

# 方案 5:基础版
python3 web_fetch.py https://example.com
# 输出:纯文本到终端

# 抓取微信公众号文章
python3 web_fetch.py https://mp.weixin.qq.com/s/xxxxx

# 抓取推特内容
python3 web_fetch.py https://x.com/user/status/123456

# 指定最大字符数
python3 web_fetch.py https://example.com 5000

增强版用法(v1.1.0 新增)

# 使用增强版工具(自动保存 MD 文件并发送到 Telegram)
python3 web_fetch_enhanced.py https://example.com

# 抓取微信公众号文章
python3 web_fetch_enhanced.py https://mp.weixin.qq.com/s/xxxxx

# 指定最大字符数
python3 web_fetch_enhanced.py https://example.com 5000

增强版输出:

  • 📁 自动保存为 MD 文件(包含元数据)
  • 📤 自动发送到 Telegram(通过 MEDIA 标签)
  • 📊 终端显示文章摘要和预览(前 500 字符)
  • 🏷️ 包含标题、URL、时间、抓取方案等信息

图片功能用法(v1.2.0 新增)

默认推荐:Base64 嵌入版(图片自动嵌入)⭐

# 默认使用图片嵌入版本
python3 web_fetch_embedded.py https://example.com

# 生成单个 MD 文件,图片直接显示
# 适合图片不多的文章(< 5 张)

推荐:PDF 版本(v1.3.0 新增)⭐⭐

# 同时生成 Markdown + PDF
python3 web_fetch_pdf.py https://example.com

# 生成两个文件:
# - article.md(Markdown 文件,图片嵌入)
# - article.pdf(PDF 文件,A4 格式)

PDF 功能特点:

  • 📕 A4 纸张格式,2cm 边距
  • 🎨 美化样式(标题分级、段落对齐)
  • 🖼️ 图片自动适配(max-height: 800px)
  • 📃 避免图片跨页断裂
  • 🇨🇳 完美支持中文字体
  • 💻 代码高亮
  • 📊 表格样式
  • 💬 引用块样式

可选:不含图片版本(文件更小)

# 如果不需要图片,使用增强版
python3 web_fetch_enhanced.py https://example.com

# 只保存文本内容,文件更小

可选:下载图片到本地

# 下载文章和所有图片
python3 web_fetch_with_images.py https://example.com

# 生成文件:
# - article.md(Markdown 文件)
# - article_images/(图片目录)
#   - image_001.jpg
#   - image_002.png

版本对比:

版本 图片处理 输出格式 文件大小 适用场景
web_fetch_pdf.py ⭐⭐ Base64 嵌入 MD + PDF 较大 推荐,阅读体验最佳
web_fetch_embedded.py ⭐ Base64 嵌入 MD 较大 默认推荐,图片直接显示
web_fetch_enhanced.py 不含图片 MD 较小 只需要文本内容
web_fetch_with_images.py 下载到本地 MD + 图片 分离 需要独立管理图片

图片功能特点:

  • 📷 自动识别文章中的所有图片
  • ⬇️ 下载图片(支持 JPEG, PNG, GIF, WebP, SVG)
  • 🔄 更新 Markdown 图片路径
  • 📊 显示下载进度和统计
  • ✅ 修复微信图片(data-src → src)
  • 💡 智能提示:自动提醒用户可选版本

Python 调用

基础版:

from web_fetch import smart_fetch

# 抓取网页
content, method = smart_fetch("https://example.com")

if content:
    print(f"成功抓取,使用方案:{method}")
    print(content)
else:
    print(f"抓取失败:{method}")

增强版(v1.1.0 新增):

from web_fetch_enhanced import fetch_and_save, Article

# 抓取并保存
article, filepath = fetch_and_save("https://example.com")

if article:
    print(f"标题:{article.title}")
    print(f"URL:{article.url}")
    print(f"时间:{article.timestamp}")
    print(f"方案:{article.method}")
    print(f"文件:{filepath}")
    print(f"\n内容预览:")
    print(article.content[:500])
else:
    print(f"抓取失败:{filepath}")

📋 智能路由策略

网站类型 优先方案 备用方案 原因
微信公众号 Scrapling - Jina Reader 会 403
推特 Jina Reader - Scrapling 需要 JS
其他网站 Scrapling Jina Reader 节省 Jina 配额

为什么优先 Scrapling?

  • Jina Reader 每天只有 200 次免费配额
  • Scrapling 无限制使用
  • 把 Jina 配额留给真正需要的场景(推特、格式要求高的文档)

🔧 配置

环境变量

# 启用调试模式(显示详细错误信息)
export DEBUG=true

# 禁用调试模式(生产环境推荐)
export DEBUG=false

# 自定义超时时间(秒)
export JINA_TIMEOUT=30
export SCRAPLING_TIMEOUT=60

# 自定义重试次数
export MAX_RETRIES=2

# 自定义内容长度限制
export MIN_CONTENT_LENGTH_JINA=100
export MIN_CONTENT_LENGTH_SCRAPLING=50
export MAX_CONTENT_SIZE=10485760  # 10MB

# 自定义 Scrapling 脚本路径
export SCRAPLING_PATH=/path/to/scrapling_fetch.py

配置示例

# 生产环境配置
export DEBUG=false
export JINA_TIMEOUT=30
export SCRAPLING_TIMEOUT=60

# 开发环境配置
export DEBUG=true
export JINA_TIMEOUT=60
export SCRAPLING_TIMEOUT=120

配置参数

在代码中可以修改以下配置:

JINA_TIMEOUT = 30              # Jina Reader 超时时间(秒)
SCRAPLING_TIMEOUT = 60         # Scrapling 超时时间(秒)
MAX_RETRIES = 2                # 最大重试次数
MIN_CONTENT_LENGTH_JINA = 100  # Jina 最小内容长度
MIN_CONTENT_LENGTH_SCRAPLING = 50  # Scrapling 最小内容长度
MAX_CONTENT_SIZE = 10 * 1024 * 1024  # 最大内容大小(10MB)

🧪 测试

# 运行单元测试
python3 test_web_fetch.py

# 测试特定 URL
python3 web_fetch.py https://example.com

📊 API 文档

smart_fetch(url, max_chars=30000)

智能抓取网页内容

参数:

  • url (str): 目标 URL(必须是 http:// 或 https://)
  • max_chars (int): 最大字符数(100-100000,默认 30000)

返回:

  • (content, method): 成功时返回 (内容字符串, 方案名称)
  • (None, error): 失败时返回 (None, 错误信息)

示例:

content, method = smart_fetch("https://example.com", max_chars=5000)

is_valid_url(url)

验证 URL 是否合法

参数:

  • url (str): 待验证的 URL

返回:

  • bool: URL 是否合法

is_wechat_url(url)

检查是否是微信公众号链接

参数:

  • url (str): 待检查的 URL

返回:

  • bool: 是否是微信公众号链接

is_twitter_url(url)

检查是否是推特链接

参数:

  • url (str): 待检查的 URL

返回:

  • bool: 是否是推特链接

🛡️ 安全特性

  • URL 验证 - 检查 URL 格式、长度、控制字符、NULL 字节
  • 参数验证 - 检查 maxChars 范围
  • 命令注入防护 - 使用列表参数,不使用 shell=True
  • 内存限制 - 最大 10MB,防止内存溢出
  • 重定向限制 - 最多 5 次重定向
  • 超时保护 - 防止长时间阻塞
  • 异常处理 - 完善的错误处理和恢复

📈 性能

  • 普通网站: 2-3 秒
  • 微信公众号: 3-4 秒
  • 推特: 1-2 秒
  • 内存占用: < 50MB
  • 并发支持: 单进程安全

📝 更新日志

详见 CHANGELOG.md

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📄 许可证

MIT License

👤 作者

@Go8888I - 推特关注获取更多更新

大富小姐姐 🎀


评分: 9.3/10 ⭐⭐⭐⭐⭐
状态: 生产环境可用 ✅

About

Smart web scraping tool with automatic routing (Scrapling/Jina Reader). Code quality: 9.3/10

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages