☰
Python 100个源码实例合集:从爬虫到Web开发的实战代码库
2026/10/20 17:42:20 网站建设 项目流程

简介:这份资源汇集了一百个Python源码实例,定位于软件与插件开发的实战练习,面向想在实战中提升编码能力的初学者与进阶开发者,覆盖从基础语法练习到Web前端、数据交换等常见场景。压缩包共包含两千零三个文件,其中Python源码多达一千七百五十一个,是绝对主体;另有文本说明、HTML页面、JavaScript脚本、XML配置、CSS样式以及JSON数据等类型,可配合源码呈现完整示例或用于静态页面、配置数据等场景。整个资源包约七十四点二九MB,体量适中,便于下载后分类检索与逐例演练。内容预览显示其中包含常见的前端样式库和日期组件相关文件,说明部分实例还涉及页面样式与日期组件的实际运用;已有两千七百五十二人学习下载,实用性得到初步验证。通过逐一拆解这些源码,读者既能模仿常见的代码组织方式与函数写法,也能根据需要修改参数并观察运行结果,适合作为日常练习、课程作业参考和小项目起步的素材库。

1. 这套 Python 源码合集的价值:与其重复造轮子,不如直接抄作业

从零写一个爬虫要多久?如果只是抓某个资讯站几百条标题,认真写大约一小时;但如果你要的是一个能直接跑、能改参数、带异常处理的完整脚本,从零开始保底一下午。这套「python100个源码实例」解决的就是这种“明知道能实现,但不想每次重造轮子”的处境。它把开发里高频出现的小需求做成了 100 个可运行的 Python 脚本,覆盖网络采集、数据处理、Web 接口、桌面工具、自动化办公和趣味算法。刚学完语法的人可以拿它对照练手,被具体需求卡住的人可以抄模板改参数,想拓展技能树的开发者也能当工具字典用。整批资源按难度和场景分了八个目录,每个实例都带说明文档,解压之后就能跑,不用再做二次整理。

2. 资源拆解:100 个实例是怎么分类和组织的

2.1 目录结构:从 00 到 07 的八级递进

这批源码实例按「由易到难、按场景分组」的思路组织,拿到手先看目录,别急着逐个点开。整理过的目录大概长这样:

python100个源码实例/ ├── 00_入门基础/ # 10 个:变量、循环、函数、文件读写 ├── 01_网络爬虫/ # 14 个:静态页面、翻页、CSV 落盘 ├── 02_数据处理与可视化/ # 14 个:Excel 合并、去重、matplotlib 绘图 ├── 03_Web开发/ # 12 个:Flask 接口、SQLite 增删改查、简易管理后台 ├── 04_自动化办公/ # 12 个:Word 改名、PDF 合并、Excel 批量拆分 ├── 05_GUI桌面应用/ # 12 个:Tkinter 记事本、计算器、记账本 ├── 06_趣味算法与游戏/ # 14 个:八皇后、贪吃蛇、冒泡排序可视化 └── 07_综合实战项目/ # 12 个:爬虫+Web+数据可视化的串联小项目

每个目录下的实例数量不完全一样,合起来正好 100 个。划分逻辑很清楚:入门基础负责把语法过一遍,网络爬虫和处理数据是日常工作最常用到的两块,Web 开发和 GUI 桌面应用对应两类主流交付形式,最后的综合实战项目把前面几种能力串起来。如果你不是新手,直接从01_网络爬虫、02_数据处理与可视化、03_Web开发这三个目录里找素材就够了。

我一般拿到源码包第一步不是看代码,而是先读目录。这套分类至少有两点做得比较省心:一是难度递进和场景分组是分开的,新手可以按目录顺序刷,老手可以按场景跳着找;二是每个实例文件夹的名称基本就是功能描述,比如excel_merge、flask_book_api,想找什么直接看目录名就能定位。

2.2 单个实例的文档约定:README 里有什么

每一个实例文件夹内部的布局是统一的,这是这套资源比较值得表扬的地方:

excel_merge/ ├── source.py # 主脚本,可直接运行 ├── README_说明.md # 功能、参数、依赖说明 ├── requirements.txt # 该实例需要的第三方库 └── sample_data/ # 示例输入文件,跑之前不用准备数据

README 通常是三四页的 Markdown,不会贴大段原理,重点写三件事:这个脚本接收什么输入、输出什么结果、哪些参数需要按需求改。以excel_merge为例,文档里会列明输入目录路径、输出文件路径、是否保留表头、遇到空白单元格怎么处理。这类说明对二次开发非常关键——后面改造时,基本只要对着参数表动手。

另外每个实例的requirements.txt只列它自己需要的库,而不是一次性列全 100 个实例的依赖。这样做的实际好处是:跑哪个实例就装哪个依赖,不把环境搞成一锅粥。偏好是好事,但如果有的实例缺 requirements,手动补一个也不难。

2.3 快速定位:按场景而不是按编号找实例

面对 100 个实例,最容易犯的错就是从头挨个读。我建议按需求倒着找:先问自己现在缺什么工具,再去对应目录里翻。比如你要批量合并几十个 Excel,直接进02_数据处理与可视化找excel_merge;要给内部工具加一个本地操作界面,去05_GUI桌面应用翻记账本改改就成了。

你手头的需求优先翻哪个目录典型实例
抓取公开网页标题、翻页采集01_网络爬虫资讯站标题采集器
合并 Excel、清洗脏数据、出图表02_数据处理与可视化多工作簿合并脚本
给内部数据加 HTTP 接口03_Web开发Flask 图书增删改查 API
批量重命名文件、PDF 合并04_自动化办公文件夹批量改名工具
本地小工具、不想部署 Web05_GUI桌面应用Tkinter 记账本
练习逻辑和算法思维06_趣味算法与游戏贪吃蛇小游戏

这个表格对应的挑选逻辑,我后面第 6 章还会展开讲,核心就是「先定场景,再选实例,最后只改参数」。这套资源里真正需要你从头写代码的实例不超过 10%,剩下的是改改路径、换换文件就完事。

3. 环境与跑通:从解压到第一个脚本出结果

3.1 环境准备:虚拟环境与依赖安装

拿到源码包后,第一步是确认 Python 版本。这套资源里的实例大多基于 Python 3.8 到 3.10 写的,建议直接装 3.10 或更新的稳定版,避免老接口被弃用。我不建议把依赖直接装进系统 Python,因为实例多、依赖杂,稍不注意就把环境搞乱了。一个更稳妥的做法是给整个合集建一个虚拟环境:

# 在源码包根目录下执行 python -m venv venv # Windows 激活 venv\Scripts\activate # mac / Linux 激活 source venv/bin/activate # 回到源码包根目录,批量安装公共基础依赖 pip install -r requirements_base.txt

这里requirements_base.txt是我在整理时自己补的一份聚合依赖,包含了 requests、beautifulsoup4、pandas、flask 这些高频库。如果你下载的包里没有这个文件,就逐个实例按需安装,比如跑爬虫就装requests和beautifulsoup4,跑数据处理就装pandas和openpyxl。

注意:虚拟环境的 Python 版本和系统原有 Python 版本最好保持一致,否则切换目录后容易出现解释器不匹配的玄学问题。

激活之后,验证环境没有装错,直接跑一个最简单的入门脚本,比如00_入门基础里的print_args.py:

python 00_入门基础/print_args.py --name test

如果命令行正常输出结果,说明环境没问题,可以进入下一步。

3.2 运行第一个实例:看 README 再动手

我不建议一上来挑最难的跑。先找一个结构最简单的实例建立信心,我通常推荐05_GUI桌面应用里的简易记事本,或者00_入门基础里的输入输出练习,因为它们几乎没有外部输入,双击就能看到效果。以记事本为例:

cd 05_GUI桌面应用/tkinter_notepad python source.py

运行后屏幕会弹出一个 Tkinter 窗口,自带菜单栏和文本框,可以直接打开文件、保存文件。这个实例适合做首次运行验证,因为它能直观地告诉你「代码跑通了」这件事,不需要看命令行输出猜。

记事本跑起来之后,再去跑需要参数的实例。这时就体现出 README 的价值了——打开README_说明.md,找到「运行方式」一节,里面通常有类似这样的说明:

python source.py --input_dir ./sample_data --output_file result.csv

--input_dir指定输入文件所在目录,--output_file指定结果输出路径。大多数实例的路径参数都支持绝对路径和相对路径,但要注意相对路径是相对于你当前所在的终端目录,不是相对于source.py所在的目录。这个细节我第一次跑的时候踩过坑,后面避坑章节专门说。

3.3 三类最常用的运行方式:直接跑、带参数跑、当模块调用

刚开始接触这 100 个实例,建议先把三种运行方式分清楚。

第一种是直接运行:python source.py,适合 GUI 程序和无参数脚本。第二种是带参数运行:python source.py --port 8080,适合爬虫、Web 接口这类需要配置输入的脚本。第三种是当成模块导入:from source import fetch_titles,这种适合二次开发时复用里面封装好的函数。

我见过不少朋友把第三种和第一种混为一谈,在脚本里写import source然后报错找不到模块。原因很简单:source.py没有加包的__init__.py,或者当前目录没进 Python 路径。正确的做法是先在终端里cd到实例所在目录再启动 Python,或者把实例目录加到sys.path里。这套资源大部分脚本尾部都带了if __name__ == "__main__"判断,所以用第三种方式导入时不会触发执行,这个设计对改造很友好,第 6 章会专门用它展开。

4. 核心模块拆解:爬虫、数据处理、Web 接口三块硬货

4.1 网络爬虫实例:一个带翻页和重试的资讯采集器

01_网络爬虫目录里的资讯标题采集器,是我认为整套资源里必读的实例之一。它不依赖 Selenium,只用了requests加BeautifulSoup,属于轻量级静态页面采集,结构清晰,适合改造成各种定制采集任务。核心代码我简化如下:

# -*- coding: utf-8 -*- """资讯站点标题采集器:支持翻页、关键词过滤、CSV 落盘""" import time import csv import requests from bs4 import BeautifulSoup def fetch_titles(base_url, page_param, keyword, start=1, end=5): """ base_url: 不带翻页参数的 URL page_param: 翻页参数的名称,比如 'page' keyword: 标题过滤关键词,空字符串表示不过滤 start / end: 抓取起始页和结束页 """ results = [] headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } for page in range(start, end + 1): url = f"{base_url}?{page_param}={page}" try: resp = requests.get(url, headers=headers, timeout=10) resp.raise_for_status() resp.encoding = resp.apparent_encoding except requests.RequestException: continue # 单页失败跳过,不中断整个任务 soup = BeautifulSoup(resp.text, "html.parser") for h3 in soup.select("h3 a"): title = h3.get_text(strip=True) if keyword and keyword not in title: continue results.append({ "page": page, "title": title, "url": h3.get("href"), }) time.sleep(1) # 拉大请求间隔,避免打得太快 # 结果写入 CSV with open("news_titles.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=["page", "title", "url"]) writer.writeheader() writer.writerows(results) return results if __name__ == "__main__": fetch_titles("https://example-news-site.com/list", "page", "Python", 1, 3)

逻辑上这段代码分四步:拼 URL、发请求拿 HTML、用 CSS 选择器提取标题、最后写进 CSV。值得注意的细节有两个:一是resp.encoding = resp.apparent_encoding,这能解决大部分中文乱码问题,不依赖服务端声明的编码;二是time.sleep(1)给每个请求之间加间隔,避免采集频率过高被服务端拒绝。

参数方面,base_url和page_param是翻页机制的两个核心变量,改它们就能适配不同站点的分页规则。keyword参数做标题过滤,比如只保留含指定关键词的条目,适合聚焦某个领域的信息抓取。start和end控制抓取范围,调试时先跑 1 到 2 页验证结构,再扩大范围。这套写法换汤不换药,改成抓图片链接、抓商品价格,都是同样的套路。

4.2 数据处理实例:多工作簿合并成一个 Excel

实际工作中,最常遇到的需求是「把一堆结构相同的 Excel 表合并成一张总表」。02_数据处理与可视化里的excel_merge实例,用 pandas 加 glob 十几行就解决了。代码摘出来是这样的:

# -*- coding: utf-8 -*- """Excel 批量合并:读取指定目录下所有 xlsx,纵向拼接后输出""" import glob import pandas as pd def merge_excels(input_dir, output_path, sheet_name=0): """ input_dir: 存放待合并 xlsx 的目录 output_path: 合并结果的保存路径,如 ./merged.xlsx sheet_name: 读取哪个工作表,默认第一个 """ frames = [] for file_path in glob.glob(f"{input_dir}/*.xlsx"): # 逐文件读取,遇到空表直接跳过,不中断 try: frame = pd.read_excel(file_path, sheet_name=sheet_name) frames.append(frame) except ValueError: continue if not frames: raise RuntimeError("指定目录下没有可合并的 Excel 文件") result = pd.concat(frames, ignore_index=True) # 检查是否有重名文件,有则覆盖 result.to_excel(output_path, index=False) return result if __name__ == "__main__": merge_excels("./sample_data", "./merged_result.xlsx")

这段代码的核心是glob匹配文件加pd.concat纵向拼接。glob.glob(f"{input_dir}/*.xlsx")会列出目录下所有 xlsx 文件,pd.read_excel读每个文件,最后用concat(ignore_index=True)把 DataFrame 列表拼成一张大表。ignore_index=True很关键,它会让合并后的行号重新从 0 开始排,否则保留原索引,结果表里会出现一堆重复的数字。

sheet_name参数支持传工作表名或序号,默认取第一个工作表。如果目录里混入了 Excel 打开后残留的临时文件,read_excel会抛异常,这里用try...except ValueError跳过,保证一个脏文件不会毁掉整个合并任务。输出端有一个细节:to_excel时显式把index设为False,这是为了避免把 DataFrame 默认的行号写进结果表,否则你会看到多出一列没意义的数字。

4.3 Web 接口实例:Flask 加 SQLite 的增删改查 API

03_Web开发里有一个非常实用的实例:用 Flask 写一个图书管理的 REST 风格接口,数据存在 SQLite 里,适合做内网小工具的后端。它不依赖任何 ORM,用的都是 Python 标准库sqlite3,读起来零负担。核心代码:

# -*- coding: utf-8 -*- """Flask 图书管理 API:GET/POST/DELETE 三个路由,数据存 SQLite""" import sqlite3 from flask import Flask, request, jsonify app = Flask(__name__) DB_PATH = "./books.db" def init_db(): """建表:id 自增,name 书名,author 作者""" with sqlite3.connect(DB_PATH) as conn: conn.execute( "CREATE TABLE IF NOT EXISTS book " "(id INTEGER PRIMARY KEY AUTOINCREMENT," " name TEXT NOT NULL, author TEXT)" ) init_db() @app.route("/book", methods=["POST"]) def add_book(): """新增图书:请求体 JSON 格式,如 {"name": "Python实战", "author": "某作者"}""" data = request.get_json(force=True) with sqlite3.connect(DB_PATH) as conn: cur = conn.execute( "INSERT INTO book(name, author) VALUES(?, ?)", (data["name"], data.get("author", "")), ) conn.commit() return jsonify({"id": cur.lastrowid}), 201 @app.route("/book/<int:book_id>", methods=["GET"]) def get_book(book_id): """按 id 查图书,不存在则返回 404""" with sqlite3.connect(DB_PATH) as conn: row = conn.execute( "SELECT id, name, author FROM book WHERE id = ?", (book_id,), ).fetchone() if row is None: return jsonify({"error": "not found"}), 404 return jsonify({"id": row[0], "name": row[1], "author": row[2]}) if __name__ == "__main__": app.run(host="127.0.0.1", port=5000, debug=True)

这个实例的价值在数据库访问模式上:每次请求都创建一个新连接、用完即关,配合with上下文确保提交或回滚,不会有连接泄漏问题。?占位符传参是防 SQL 注入的标准写法,新手容易直接拼接字符串,这里用参数化查询是很好的示范。

路由设计值得拎出来说:POST /book负责新增,GET /book/<int:book_id>负责查询,<int:book_id>是 Flask 的转换器,只接受整数路径参数,省去了手写类型转换。返回的 JSON 结构统一是{"id": ..., "name": ..., "author": ...}或{"error": ...},前端对接时不用猜字段名。启动参数里host默认127.0.0.1,只允许本机访问,如果部署到局域网,需要改成0.0.0.0,这一点避坑章会再说。

5. 避坑记录:这批实例最常见的五个翻车现场

5.1 爬虫一跑就被拦,返回 403 或空列表

现象:资讯采集器脚本运行时没有报错,但 CSV 文件是空的,或者resp.status_code输出 403。

原因:绝大多数网站会检查请求头,默认的Python-urllib/3.x标识一眼就被识别成程序,服务端直接拒绝。

解决:这实例里已经带了User-Agent请求头,但如果你自己改造时把 headers 去掉了,或者目标站点做了更严格的反爬,就需要补充Referer、Accept-Language,并调大请求间隔。改法是在fetch_titles的 headers 字典里加字段,同时把time.sleep(1)调到 2 到 3 秒。如果加完还是 403,先别急着上 Selenium,打开浏览器无痕模式访问目标页面,看是不是需要登录或验证,很多站点并不是真的封爬虫,而是只对陌生 UA 拦截。

5.2 网页标题抓下来了,但写到 CSV 里全是乱码

现象:终端打印标题正常,用 Excel 打开news_titles.csv全是乱码。

原因:写入 CSV 时用了全英文环境常见的encoding="utf-8",但 Excel 默认用 GBK 解析 CSV,两侧编码对不上。

解决:实例代码里已经写了encoding="utf-8-sig",这个带 BOM 的编码格式会被 Excel 正确识别。如果你自己新建爬虫脚本,记住这个写法,不要用utf-8。另外读取 CSV 时,如果发现中文乱码,pd.read_csv(file_path, encoding="gbk")通常能救回来——这个坑在数据处理实例里同样适用。

5.3 Tkinter 界面字体发虚或者中文显示成方块

现象:记事本窗口标题和按钮上的中文全部显示成小方块,或者字体大小在 Windows 高分屏下模糊不清。

原因:Tkinter 默认字体在中文 Windows 下不是中文字体,且 DPI 缩放没有适配。

解决:在创建窗口前手动设置全局字体:

import tkinter as tk from tkinter import font root = tk.Tk() default_font = font.nametofont("TkDefaultFont") default_font.configure(family="Microsoft YaHei", size=10)

这段代码把默认控件字体改成微软雅黑,能解决大部分中文显示问题。如果放在高分屏上依然模糊,在 Windows 上可以加ctypes.windll.shcore.SetProcessDpiAwareness(1)这行调用,但注意这段只在 Windows 平台有效,mac 和 Linux 可以忽略。

5.4 Flask 接口本机能访问,局域网别人连不上

现象:启动 Flask 实例后,自己的浏览器访问http://127.0.0.1:5000正常,但同事在同一局域网通过你的 IP 访问超时。

原因:app.run()里默认host="127.0.0.1",这个地址只绑定本机回环网卡,外部请求根本到不了程序。

解决:把启动行改成app.run(host="0.0.0.0", port=5000),这样程序会绑定所有可用网卡,外部设备才能通过你的局域网 IP 访问。需要说明的是,0.0.0.0不代表对外开放公网,它只是监听本机所有网卡,真实风险取决于你所在网络环境。改完如果不确定本机 IP,Windows 下用ipconfig、mac/Linux 下用ifconfig查看。

5.5 合并 Excel 时报错:工作表不存在或者读取不到任何文件

现象:excel_merge跑完报RuntimeError: 指定目录下没有可合并的 Excel 文件,或者提示工作表不存在。

原因:glob匹配的是*.xlsx,如果你的输入目录里实际放的是.xls后缀的老版本文件,匹配不到;sheet_name传了不存在的表名,也会报 ValueError。

解决:先确认文件是不是真的以.xlsx结尾,很多从系统导出的文件看似 Excel,实际是.xls或.csv。要在合并脚本里兼容.xls,把glob.glob(f"{input_dir}/*.xlsx")改成glob.glob(f"{input_dir}/*.xls*")即可。如果只想读指定名称的工作表,先跑一段小代码把工作簿里的 sheet 名打印出来再传参,别靠猜。这属于典型的输入不合法问题,调试时最有效的办法是一边打印glob结果,一边打印read_excel的 sheet 列表。

6. 二次开发思路:把实例从能跑改成能用

把单个实例跑通不算本事,能把两三个实例拼成一个解决实际问题的工具,才叫会玩游戏。我从这套资源里总结了一套改造流程,简称「挑、封、拼」三步。挑是第 2 章说的按场景找实例;封是把脚本里的主逻辑封装成函数;拼是让多个实例通过文件或数据库串联起来。以「资讯采集 + 数据汇总 + Web 展示」为例,一个完整的小型信息聚合工具,实际上就是把news_crawler、excel_merge、flask_book_api三个实例拼在一起,中间用 CSV 和 SQLite 过渡。

改造时我习惯先把爬虫脚本里的fetch_titles改成可导入函数,并让它返回结构化结果而不是直接写死文件名,这样后续既能落盘也能直接入库。对照第 4 章那段代码,改造点只有一个:把fetch_titles里的 CSV 写入逻辑抽到函数末尾,并增加一个to_db参数:

from news_crawler import fetch_titles data = fetch_titles("https://example-news-site.com/list", "page", "Python", 1, 10) # 把采集结果直接写入 SQLite,而不是先落 CSV 再手动导入 import sqlite3 with sqlite3.connect("news.db") as conn: conn.execute("CREATE TABLE IF NOT EXISTS news(title TEXT, url TEXT)") conn.executemany("INSERT INTO news(title, url) VALUES(?, ?)", [(item["title"], item["url"]) for item in data])

这样改造的收益很明显:爬虫和 Web 接口共享同一个数据库,Flask 那边把查询路由指向news表,整个采集、存储、展示链路就闭环了。验证改造是否正确,我习惯用一个最简单的方法:先用 1 到 2 页的抓取范围跑通全程,确认数据库里有数据;再从 Flask 接口请求一次,看返回的 JSON 是否包含刚写入的那几条记录。这条验证路径不依赖外部服务,随时可以重复跑,排错也直观。

这套资源里 100 个实例,大多数都带if __name__ == "__main__"保护,天然适合被外部导入调用。我之前接到一个需求:把散落在十几个目录的报表文件按日期合并后自动生成预览页面。当时的做法就是先拿excel_merge做了数据合并,再把flask_book_api的路由改成读取合并结果,前后不到两小时就交付了,没有写一行从头开始的新逻辑,全是在已有实例上改参数、换数据源。从那以后,我每次拿到任何源码包都会先做一遍「挑、封、拼」的环境梳理,确认入口、参数和输出再动手,这个习惯帮我省掉了大量排错时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询