A Python tool for fetching web articles and converting them to Markdown format
Project description
WeSpy
WeSpy 是一个用于获取wx公众号文章并转换为 Markdown 格式的 Python 工具,支持图片防盗链处理、专辑批量下载和多种输出格式。
特性
- 🚀 智能文章提取:自动识别文章标题、作者、发布时间和正文内容
- 📱 wx公众号支持:专门优化wx公众号文章的提取,支持长短链接自动转换
- 🎵 专辑批量下载:支持微信公众号专辑文章批量获取和下载
- 🖼️ 图片防盗链处理:自动处理图片防盗链问题,确保图片正常显示
- 📝 灵活输出配置:默认只输出 Markdown,可选择 HTML 和 JSON 格式
- 🌐 通用网页支持:支持大多数网站的文章提取
- 🎯 命令行友好:提供简单易用的命令行界面
- 📂 批量处理:支持批量处理多个文章链接和专辑文章
安装
使用 pip 安装(推荐)
pip install wespy
从源码安装
git clone https://github.com/tianchang/wespy.git
cd wespy
pip install -e .
快速开始
命令行使用
# 获取wx公众号文章(默认只输出 Markdown)
wespy "https://mp.weixin.qq.com/s/xxxxx"
# 指定输出目录
wespy "https://mp.weixin.qq.com/s/xxxxx" -o /path/to/output
# 输出 Markdown + HTML 格式
wespy "https://example.com/article" --html
# 输出 Markdown + JSON 格式
wespy "https://example.com/article" --json
# 输出所有格式(HTML + JSON + Markdown)
wespy "https://example.com/article" --all
# 显示详细信息
wespy "https://example.com/article" -v
# === 微信专辑功能 ===
# 获取微信专辑文章列表(不下载内容)
wespy "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=..." --album-only
# 批量下载微信专辑文章(默认下载前10篇)
wespy "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=..."
# 限制专辑文章下载数量
wespy "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=..." --max-articles 5
# 下载专辑文章并保存所有格式
wespy "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=..." --max-articles 5 --all
交互式使用
如果不提供任何参数,程序会进入交互模式:
wespy
然后根据提示输入文章 URL、输出目录和输出格式选择:
- 仅 Markdown(默认)
- Markdown + HTML
- Markdown + JSON
- 全部格式(HTML + JSON + Markdown)
Python API 使用
from wespy import ArticleFetcher
from wespy.main import WeChatAlbumFetcher
# 创建文章获取器实例
fetcher = ArticleFetcher()
# 获取单篇文章(默认只输出 Markdown)
article_info = fetcher.fetch_article(
url="https://mp.weixin.qq.com/s/xxxxx",
output_dir="articles"
)
# 获取文章并指定输出格式
article_info = fetcher.fetch_article(
url="https://mp.weixin.qq.com/s/xxxxx",
output_dir="articles",
save_html=True, # 同时保存HTML文件
save_json=True, # 同时保存JSON文件
save_markdown=True # 保存Markdown文件(默认为True)
)
if article_info:
print(f"标题: {article_info['title']}")
print(f"作者: {article_info['author']}")
print(f"发布时间: {article_info['publish_time']}")
# === 微信专辑功能 ===
# 创建专辑获取器
album_fetcher = WeChatAlbumFetcher()
# 仅获取专辑文章列表
articles = album_fetcher.fetch_album_articles(
"https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=...",
max_articles=20 # 限制获取数量
)
print(f"获取到 {len(articles)} 篇文章")
# 批量下载专辑文章
successful_articles = fetcher.fetch_album_articles(
album_url="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=...",
output_dir="articles",
max_articles=10,
save_html=True,
save_json=True,
save_markdown=True
)
print(f"成功下载 {len(successful_articles)} 篇文章")
输出格式
WeSpy 默认只生成 Markdown 文件,但可以通过配置选项选择其他格式:
默认输出(仅 Markdown)
articles/
└── 文章标题_1627834567.md # Markdown格式
可选格式
- HTML 文件:原始 HTML 内容(使用
--html选项) - JSON 文件:文章元数据信息(使用
--json选项) - Markdown 文件:转换后的 Markdown 格式内容(默认生成)
全部格式输出示例
articles/
├── 文章标题_1627834567.html # 原始HTML
├── 文章标题_1627834567.md # Markdown格式
└── 文章标题_1627834567_info.json # 元数据信息
JSON 元数据格式
{
"title": "文章标题",
"author": "作者名称",
"publish_time": "2023-07-30",
"url": "https://example.com/article",
"html_file": "文章标题_1627834567.html",
"fetch_time": "2023-07-30 12:34:56"
}
支持的网站
完全支持
- wx公众号 (mp.weixin.qq.com)
- 大部分基于标准 HTML 结构的博客和新闻网站
通用支持
WeSpy 使用智能算法尝试从以下元素中提取内容:
<article>标签- 带有
content、article-content、post-content等 class 的元素 <main>标签- 标准的 meta 标签信息
命令行选项
wespy [-h] [-o OUTPUT] [-v] [--html] [--json] [--all] [--max-articles MAX_ARTICLES] [--album-only] url
获取文章内容并转换为Markdown,支持微信专辑批量下载
positional arguments:
url 文章URL或微信专辑URL
optional arguments:
-h, --help 显示帮助信息
-o OUTPUT, --output OUTPUT
输出目录 (默认: articles)
-v, --verbose 显示详细信息
--html 同时保存HTML文件
--json 同时保存JSON信息文件
--all 保存所有格式文件 (HTML, JSON, Markdown)
--max-articles MAX_ARTICLES
微信专辑最大下载文章数量 (默认: 10)
--album-only 仅获取专辑文章列表,不下载内容
输出格式选项说明
- 默认行为:只生成 Markdown 文件
--html:生成 Markdown + HTML 文件--json:生成 Markdown + JSON 文件--all:生成所有格式文件(HTML + JSON + Markdown)
微信专辑功能
功能介绍
WeSpy 支持微信公众号专辑文章的批量获取和下载,可以一次性下载整个专辑中的所有文章。
使用方式
仅获取文章列表
使用 --album-only 参数只获取专辑中的文章列表,不下载具体内容:
wespy "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=..." --album-only
输出示例:
获取到 25 篇文章:
1. 文章标题一
URL: http://mp.weixin.qq.com/s?__biz=...
时间: 1704067200
2. 文章标题二
URL: http://mp.weixin.qq.com/s?__biz=...
时间: 1703980800
文章列表会保存为JSON文件,包含标题、URL、发布时间等完整信息。
批量下载专辑文章
直接使用专辑URL即可批量下载专辑中的所有文章:
# 下载前10篇文章(默认)
wespy "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=..."
# 限制下载文章数量
wespy "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=..." --max-articles 5
# 下载并保存所有格式
wespy "https://mp.weixin.qq.com/mp/appmsgalbum?__biz=...&album_id=..." --max-articles 5 --all
输出结构
专辑文章下载后会创建独立的专辑目录:
articles/
├── album_1703980800/ # 专辑专用目录
│ ├── 文章标题一_1703980800.md # Markdown格式
│ ├── 文章标题一_1703980800_info.json # 文章信息
│ ├── 文章标题二_1703980801.md # 下一篇文章
│ └── ...
└── album_1703980800_summary.json # 专辑下载汇总信息
汇总信息
每个专辑下载完成后会生成详细的汇总报告,包含:
- 专辑URL和下载时间
- 成功/失败统计
- 成功下载的文章列表
- 失败的文章列表和错误信息
技术特性
- 智能分页:自动处理微信分页获取,支持大型专辑
- 错误处理:分离成功和失败的文章,确保部分失败不影响整体下载
- 速率控制:内置延迟机制避免请求过快
- 进度显示:实时显示下载进度和统计信息
依赖要求
- Python 3.6+
- requests >= 2.20.0
- beautifulsoup4 >= 4.9.0
开发
开发环境设置
git clone https://github.com/tianchang/wespy.git
cd wespy
pip install -e ".[dev]"
运行测试
python -m pytest tests/
代码格式化
black wespy/
flake8 wespy/
常见问题
Q: 为什么有些图片无法显示?
A: WeSpy 使用 images.weserv.nl 作为代理服务来解决图片防盗链问题。如果仍然无法显示,可能是原图片已被删除或网络问题。
Q: 支持哪些网站?
A: WeSpy 对wx公众号有特别优化,对大部分使用标准 HTML 结构的网站都有较好的支持。如果某个网站不支持,欢迎提交 issue。
Q: 如何批量处理文章?
A: 目前需要通过脚本调用 Python API 来实现批量处理,命令行版本暂不支持批量处理。
贡献
欢迎提交 issue 和 pull request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
许可证
本项目使用 MIT 许可证。详见 LICENSE 文件。
更新日志
v0.2.0 (2025-01-22)
- 🎵 新增微信专辑功能:支持微信公众号专辑文章批量获取和下载
- 📝 增强命令行选项:
--max-articles、--album-only用于专辑操作 - 🔗 智能链接转换:自动检测并转换微信长链接为短链接
- 📊 详细汇总报告:专辑下载完成后生成详细的统计报告
- 🚀 优化错误处理:分离成功和失败的文章,提升批量处理稳定性
- ⚡ 性能优化:内置速率控制机制避免请求过快
- 📁 改进文件组织:专辑文章保存到独立目录,便于管理
v0.1.2 (2025-01-01)
- 改进输出格式配置:默认只输出 Markdown 文件
- 新增命令行选项:
--html、--json、--all用于控制输出格式 - 优化交互模式:添加输出格式选择菜单
- 更新 Python API:支持参数化输出格式控制
v0.1.0 (2023-07-30)
- 初始版本发布
- 支持wx公众号文章提取
- 支持通用网页文章提取
- 支持 HTML/JSON/Markdown 多格式输出
- 图片防盗链处理
- 命令行界面
联系方式
- GitHub: https://github.com/tianchangNorth/WeSpy
- Issues: https://github.com/tianchangNorth/WeSpy/issues
推荐🐔场
自用🐔场,稳定,线路多,速度快,点这里注册
免责声明
本项目仅供学习和研究目的使用。使用本工具时,请务必遵守以下原则:
使用责任
- 用户需自行承担使用本工具的所有风险和责任
- 请确保您的使用行为符合目标网站的robots.txt文件要求
- 尊重内容创作者的知识产权,不得用于商业目的
- 不要对网站服务器造成过大的访问压力
法律合规
- 请遵守当地法律法规以及目标网站的使用条款
- 不得将本工具用于任何非法或未经授权的活动
- 下载的内容应仅用于个人学习、研究或存档目的
技术风险
- 网站结构可能随时变化,本工具可能无法正常工作
- 本工具按"原样"提供,不提供任何明示或暗示的保证
- 开发者不对因使用本工具造成的任何损失承担责任
数据安全
- 本工具不会收集或上传您的任何个人信息
- 所有数据处理都在本地完成
- 请妥善保管您下载的内容
重要提醒: 请合理、合法、负责任地使用本工具,尊重网络服务提供者和内容创作者的权益.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wespy-0.2.0.tar.gz.
File metadata
- Download URL: wespy-0.2.0.tar.gz
- Upload date:
- Size: 23.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93757511f6cb84ff26794ff108edda98039b8cec9e88abeabc1c3b8ca2ffabae
|
|
| MD5 |
933dec6edcd10144a99c0f3c3f7ae0ee
|
|
| BLAKE2b-256 |
cc6fa27abcb99304ab2c14271f76f33404923407769d422df88f7810724bc441
|
File details
Details for the file wespy-0.2.0-py3-none-any.whl.
File metadata
- Download URL: wespy-0.2.0-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59689f125b3b24d4f142dfa9e87e9baf5b1a2391d0db84cc773c3ceea20f2124
|
|
| MD5 |
9fc0be9876d65c7f29fc7cf87f7b5a9e
|
|
| BLAKE2b-256 |
dfa7d9313c92b27e1dc56f861c5c1a5fe0aa58f462850008ccd11c2b83879045
|