读完教程后第一个问题:“我应该做什么项目?“本文按难度分级推荐 10 个项目,每个都说明你能学到什么、源码该怎么读、怎么参与贡献。不只是列链接,而是给你一张"项目学习地图”。
目录
- 选项目的原则
- Level 1:命令行工具(100~300 行)
- Level 2:数据处理脚本(300~800 行)
- Level 3:小型 Web 应用(800~2000 行)
- Level 4:爬虫与自动化(500~1500 行)
- Level 5:框架与工具库(2000+ 行)
- 如何高效阅读开源项目源码
- 如何参与开源贡献
- 项目选择速查表
1. 选项目的原则
好的练手项目应该:
| 原则 | 说明 |
|---|---|
| 有明确的目标 | “做一个博客"比"学 Flask"更有驱动力 |
| 有可见的输出 | 跑起来能看到效果,数据能看到变化 |
| 规模可控 | 1000 行以内最好,不会望而生畏 |
| 有奖反馈机制 | 能部署给别人用、能获得 Star |
| 覆盖你想学的技能 | 如果你想学数据库,就找个带数据库的项目 |
推荐的学习路径
命令行工具 → 数据处理 → Web 应用 → 爬虫/API → 框架/工具库
↘ ↘ ↘
每个阶段选一个项目做到"能独立改代码"
2. Level 1:命令行工具(100~300 行)
适合:刚学完 Python 基础语法,想做第一个能用的东西
项目 1:待办事项 CLI(Todo CLI)
GitHub 搜索关键词:python todo cli、python task manager
推荐项目:
- todo.txt-cli — 文本文件存储,极简哲学
- taskwarrior — 功能丰富的任务管理(C++,但学习设计思想)
你能学到:
argparse命令行参数解析- 文件读写(JSON/文本持久化)
- 日期时间处理
- 基本的 CRUD 操作
上手建议:先做一个简化版——只支持 add、list、done 三个命令。
# 简化版 todo.py 结构
def main():
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
add_parser = subparsers.add_parser("add")
add_parser.add_argument("text")
# ... list, done 子命令
args = parser.parse_args()
# 根据 args.command 分发处理
项目 2:密码生成器(Password Generator)
推荐项目:
- pwgen — Unix 密码生成器
你能学到:
random/secrets模块(密码学安全随机)- 字符串操作
- 可配置选项(长度、字符集等)
3. Level 2:数据处理脚本(300~800 行)
适合:想练习文件处理、正则表达式、数据结构
项目 3:日志分析器
推荐参考:
- GoAccess — 实时 Web 日志分析器(看设计思路)
你能学到:
- 正则表达式解析日志格式
collections.Counter统计- CSV/JSON 报表输出
- 文件迭代处理大文件
实战代码(Nginx 日志分析核心):
import re
from collections import Counter
LOG_PATTERN = re.compile(
r'(?P<ip>\S+) \S+ \S+ \[(?P<time>[^\]]+)\] '
r'"(?P<method>\S+) (?P<path>\S+) \S+" '
r'(?P<status>\d{3})'
)
def analyze_log(filepath):
ips = Counter()
statuses = Counter()
paths = Counter()
with open(filepath) as f:
for line in f:
m = LOG_PATTERN.match(line)
if m:
d = m.groupdict()
ips[d['ip']] += 1
statuses[d['status']] += 1
paths[d['path']] += 1
return {
'top_ips': ips.most_common(10),
'status_counts': dict(statuses),
'top_paths': paths.most_common(10),
}
项目 4:Markdown 转 HTML 工具
推荐项目:
- mistune — 纯 Python Markdown 解析器(约 2000 行,适合学习解析器设计)
- Python-Markdown — 扩展性强的 Markdown 实现
你能学到:
- 有限状态机(FSM)文本解析
- 正则表达式模式匹配
- HTML 生成
- 插件系统设计
4. Level 3:小型 Web 应用(800~2000 行)
适合:学了 Web 框架后想做一个完整的东西
项目 5:个人博客系统
推荐参考项目:
你能学到:
- MVC 架构模式
- 数据库 ORM(SQLAlchemy)
- 用户认证与 Session
- HTML 模板渲染(Jinja2)
- 表单处理与验证
核心功能清单:
| 功能 | 技术点 |
|---|---|
| 文章 CRUD | SQLAlchemy ORM |
| 用户注册/登录 | Werkzeug 密码哈希 + Session |
| Markdown 渲染 | mistune/flask-markdown |
| 分页 | SQLAlchemy paginate |
| RSS 输出 | feedgen 库 |
项目 6:短链接服务
推荐参考:
- YOURLS — PHP 短链接(学功能设计)
你能学到:
- URL 路由设计
- 数据库设计(短码映射)
- Base62 编码
- 重定向与 404 处理
- 点击统计
核心算法(Base62 编码生成短码):
import string
BASE62 = string.ascii_letters + string.digits # a-zA-Z0-9
def encode_base62(num):
"""将整数转为 Base62 字符串"""
if num == 0:
return BASE62[0]
result = []
while num:
num, rem = divmod(num, 62)
result.append(BASE62[rem])
return ''.join(reversed(result))
def decode_base62(s):
"""将 Base62 字符串转回整数"""
return sum(BASE62.index(c) * (62 ** i) for i, c in enumerate(reversed(s)))
5. Level 4:爬虫与自动化(500~1500 行)
适合:想练习 HTTP、HTML 解析、数据存储
项目 7:豆瓣电影爬虫
推荐项目:
- Scrapy 官方教程 — 系统学习爬虫框架
你能学到:
- HTTP 请求与响应处理
- XPath / CSS Selector 解析
- 数据清洗与存储
- 反反爬策略(User-Agent、延时)
- 爬虫调度与去重
核心代码:
import requests
from bs4 import BeautifulSoup
import time
import csv
def fetch_douban_top250():
base_url = "https://movie.douban.com/top250"
headers = {
"User-Agent": "Mozilla/5.0 (compatible; Bot/1.0)"
}
movies = []
for start in range(0, 250, 25):
resp = requests.get(f"{base_url}?start={start}", headers=headers)
soup = BeautifulSoup(resp.text, "html.parser")
for item in soup.select(".item"):
title = item.select_one(".title").text
rating = item.select_one(".rating_num").text
movies.append({"title": title, "rating": float(rating)})
time.sleep(1) # 礼貌爬虫,不要请求太快
return movies
项目 8:图片批量下载器
推荐参考:
- gallery-dl — 强大的图片/画廊下载器
你能学到:
- 异步 HTTP 请求(
aiohttp或httpx) - 文件路径处理(
pathlib) - 并发下载控制(Semaphore)
- 进度条显示(
tqdm) - 断点续传(Range 请求)
6. Level 5:框架与工具库(2000+ 行)
适合:想深入理解"好的代码是怎么写的”
项目 9:Web 框架(从零实现简化版 Flask)
推荐学习:
你能学到:
- WSGI 协议
- 路由匹配算法
- 请求/响应对象封装
- 上下文管理(Thread-local)
- 模板引擎集成
Bottle 阅读路径:
bottle.py
├── _Request → HTTP 请求封装
├── _Response → HTTP 响应封装
├── Router → 路由匹配(正则 + 字典树)
├── Bottle → 应用主类
└── run() → WSGI 服务器入口
项目 10:测试框架(从零实现简化版 pytest)
推荐学习:
你能学到:
- 测试发现机制
- Fixture 依赖注入
- 插件架构(Hook 系统)
- 断言重写
7. 如何高效阅读开源项目源码
七步法
1. 先看 README 和文档 → 了解项目是干什么的
2. 安装并运行 → 看看效果
3. 看目录结构 → 理解模块划分
4. 找到入口点 → 从 __main__ 或 CLI 命令开始
5. 追踪一个核心功能 → export/import/CRUD 的完整流程
6. 画调用图 → main → funcA → funcB → funcC
7. 尝试修改 → 加日志、改输出,看效果
示例:阅读 Flask 源码
# 1. 克隆代码
git clone https://github.com/pallets/flask.git
cd flask
# 2. 找到入口
# src/flask/__init__.py → 看 exports
# src/flask/app.py → Flask 类
# 3. 追踪一个请求
# Flask.wsgi_app() → request_context() → dispatch_request()
推荐的源码阅读顺序
| 难度 | 项目 | 代码量 | 阅读重点 |
|---|---|---|---|
| ⭐⭐ | Bottle | ~4K 行 | 单文件 Web 框架 |
| ⭐⭐ | Jinja2(核心) | ~8K 行 | 模板编译与渲染 |
| ⭐⭐⭐ | Flask | ~15K 行 | WSGI、Blueprint |
| ⭐⭐⭐ | Requests | ~5K 行 | HTTP 请求封装 |
| ⭐⭐⭐⭐ | SQLAlchemy(核心) | ~30K 行 | ORM 与查询构建 |
| ⭐⭐⭐⭐ | pytest | ~50K 行 | 测试收集与执行 |
8. 如何参与开源贡献
贡献路径
阶段 1: 使用者
→ 用项目,提 Issue(报告 bug、提需求)
阶段 2: 文档贡献者
→ 修复 typo、改进文档、翻译
阶段 3: 代码贡献者
→ 修 Good First Issue、写测试、小功能
阶段 4: 维护者
→ Review PR、管理 Issue
找到适合新手的 Issue
GitHub 搜索技巧:
label:"good first issue"
label:"help wanted"
label:"beginner friendly"
is:open
第一次 PR 流程
# 1. Fork 项目到你账号
# 2. 克隆你的 Fork
git clone https://github.com/YOUR_NAME/project.git
# 3. 创建分支
git checkout -b fix-typo-readme
# 4. 修改代码
# ...
# 5. 提交
git add .
git commit -m "docs: fix typo in README.md"
git push origin fix-typo-readme
# 6. 在 GitHub 上发起 Pull Request
9. 项目选择速查表
根据你当前的水平和目标选择项目:
| 你想练习… | 推荐项目 | 预计耗时 |
|---|---|---|
| 命令行参数处理 | Todo CLI | 1~2 天 |
| 文件处理 + 正则 | 日志分析器 | 2~3 天 |
| 文本解析 | Markdown → HTML | 3~5 天 |
| Web 全栈 | 个人博客 | 1~2 周 |
| URL 路由设计 | 短链接服务 | 3~5 天 |
| HTTP + 解析 | 豆瓣爬虫 | 2~3 天 |
| 异步编程 | 图片批量下载器 | 3~5 天 |
| 框架设计思想 | Bottle 源码阅读 | 1~2 周 |
| 测试框架 | pytest 源码阅读 | 2~3 周 |
延伸阅读
- Python 极简入门教程 —— 系统学习基础
- Python 学习资源终极路线图 —— 完整学习路径
- Python Web 框架对比 —— Web 项目技术选型
- Python 现代工具链 —— uv + ruff 工程化配置
- GitHub Actions CI/CD 指南 —— 为项目添加自动化
选一个项目,今天就动手。最好的开源学习不是"读”,而是"改"。找到一个好项目,提一个 PR,你就是开源社区的一员了。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。