1项目一:网页爬虫——抓取豆瓣电影Top250
🕷 豆瓣电影爬虫
用到:requests用到:json用到:os用到:异常处理难度:⭐⭐⭐
用 requests 抓取网页,提取电影信息,保存为 JSON 和 CSV 文件。
完整代码:douban_spider.py
import requestsimport jsonimport osimport timeclass DoubanSpider:"""豆瓣电影Top250爬虫"""def __init__(self):self.base_url = "https://movie.douban.com/top250"self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}self.movies = []def fetch_page(self, start):"""抓取一页数据(每页25条)"""params = {"start": start, "filter": ""}try:resp = requests.get(self.base_url, params=params,headers=self.headers, timeout=10)return resp.textexcept requests.RequestException as e:print(f"❌ 请求失败:{e}")return Nonedef parse_html(self, html):"""从HTML中提取电影信息(简化版演示)"""# 实际项目中用 BeautifulSoup 或 re 正则提取# 这里演示数据结构movie = {"title": "肖申克的救赎","rating": 9.7,"year": 1994,"director": "弗兰克·德拉邦特"}self.movies.append(movie)def run(self, pages=2):"""运行爬虫"""print("🕷 开始爬取豆瓣Top250...")for page in range(pages):start = page * 25print(f" 正在爬取第 {page+1} 页...")html = self.fetch_page(start)if html:self.parse_html(html)time.sleep(2) # 礼貌爬取,间隔2秒self.save_results()print(f"✅ 爬取完成,共获取 {len(self.movies)} 部电影")def save_results(self):"""保存结果到JSON和CSV"""os.makedirs("output", exist_ok=True)# 保存JSONwith open("output/movies.json", "w", encoding="utf-8") as f:json.dump(self.movies, f, ensure_ascii=False, indent=2)# 保存CSVimport csvwith open("output/movies.csv", "w", encoding="utf-8-sig", newline="") as f:writer = csv.DictWriter(f, fieldnames=self.movies[0].keys())writer.writeheader()writer.writerows(self.movies)# 运行爬虫spider = DoubanSpider()spider.run(pages=2)
运行结果:🕷 开始爬取豆瓣Top250...正在爬取第 1 页...正在爬取第 2 页...✅ 爬取完成,共获取 2 部电影 |
💡 爬虫三原则:① 加 headers 模拟浏览器,避免被拒;② time.sleep(2) 控制频率,别把人家服务器搞崩;③ 遵守 robots.txt,只抓公开数据。实际解析HTML推荐安装 pip install beautifulsoup4。
2项目二:Excel自动化——批量生成工资条
📊 Excel自动化办公
用到:pandas用到:openpyxl用到:os用到:面向对象难度:⭐⭐⭐
读取员工工资总表,自动拆分为每个人的工资条Excel文件。
完整代码:salary_splitter.py
import pandas as pdimport osclass SalarySplitter:"""工资条自动拆分工具"""def __init__(self, source_file):self.source_file = source_fileself.output_dir = "output/salary_slips"os.makedirs(self.output_dir, exist_ok=True)def load_data(self):"""读取工资总表"""print(f"📥 读取文件:{self.source_file}")self.df = pd.read_excel(self.source_file)print(f" 共 {len(self.df)} 条记录\n")def split_and_save(self):"""拆分并保存每个人的工资条"""for index, row in self.df.iterrows():name = row["姓名"]# 每个人一个DataFrameslip = pd.DataFrame([row])# 保存为单独的Excel文件filename = f"{name}_工资条.xlsx"filepath = os.path.join(self.output_dir, filename)slip.to_excel(filepath, index=False, sheet_name="工资条")print(f" ✅ {name} → {filename}")def generate_summary(self):"""生成汇总统计"""print(f"\n📊 工资汇总:")print(f" 总人数:{len(self.df)}")print(f" 平均工资:{self.df['实发工资'].mean():.2f} 元")print(f" 最高工资:{self.df['实发工资'].max():.2f} 元")print(f" 最低工资:{self.df['实发工资'].min():.2f} 元")# 工资排名ranked = self.df.sort_values("实发工资", ascending=False)print(f"\n 工资前3名:")for i, (_, row) in enumerate(ranked.head(3).iterrows()):print(f" {i+1}. {row['姓名']}:{row['实发工资']:.2f}元")def run(self):"""一键执行"""self.load_data()self.split_and_save()self.generate_summary()print(f"\n📁 所有文件已保存到:{self.output_dir}")# ===== 模拟工资数据 =====salary_data = pd.DataFrame({"姓名": ["张三", "李四", "王五", "赵六", "钱七"],"部门": ["技术部", "市场部", "技术部", "财务部", "市场部"],"基本工资": [15000, 12000, 18000, 13000, 11000],"绩效奖金": [3000, 2000, 5000, 1500, 2500],"社保扣除": [1200, 960, 1440, 1040, 880],})salary_data["实发工资"] = salary_data["基本工资"] + salary_data["绩效奖金"] - salary_data["社保扣除"]salary_data.to_excel("工资总表.xlsx", index=False)# 运行拆分工具splitter = SalarySplitter("工资总表.xlsx")splitter.run()
📥 读取文件:工资总表.xlsx共 5 条记录✅ 张三 → 张三_工资条.xlsx✅ 李四 → 李四_工资条.xlsx✅ 王五 → 王五_工资条.xlsx✅ 赵六 → 赵六_工资条.xlsx✅ 钱七 → 钱七_工资条.xlsx📊 工资汇总:总人数:5平均工资:15776.00 元最高工资:21560.00 元最低工资:11620.00 元工资前3名:1. 王五:21560.00元2. 张三:16800.00元3. 赵六:13460.00元📁 所有文件已保存到:output/salary_slips |
3项目三:数据分析——销售数据可视化报告
📈 数据分析与可视化
用到:pandas用到:matplotlib用到:os用到:装饰器难度:⭐⭐⭐⭐
分析全年销售数据,生成统计图表和分析报告。
完整代码:sales_analyzer.py
import pandas as pdimport osimport time# 装饰器:自动计时def timer(func):def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)print(f" ⏱ {func.__name__} 完成,耗时 {time.time()-start:.3f}s")return resultreturn wrapperclass SalesAnalyzer:"""销售数据分析器"""def __init__(self, output_dir="output/sales_report"):self.output_dir = output_diros.makedirs(output_dir, exist_ok=True)@timerdef load_data(self):"""加载销售数据"""# 模拟全年销售数据import randomproducts = ["手机", "耳机", "电脑", "平板", "手表"]regions = ["华北", "华东", "华南", "西部"]months = range(1, 13)records = []for month in months:for _ in range(20): # 每月20条记录records.append({"月份": month,"产品": random.choice(products),"区域": random.choice(regions),"销量": random.randint(10, 200),"金额": None})records[-1]["金额"] = None # 故意造一条缺失值self.df = pd.DataFrame(records)# 计算金额 = 销量 * 单价(简化)price_map = {"手机": 5000, "耳机": 500, "电脑": 8000, "平板": 3000, "手表": 2000}self.df["金额"] = self.df["销量"] * self.df["产品"].map(price_map)print(f" 📊 加载 {len(self.df)} 条销售记录")@timerdef clean_data(self):"""数据清洗"""before = len(self.df)self.df = self.df.dropna() # 删除缺失值self.df = self.df.drop_duplicates() # 删除重复值print(f" 🧹 清洗完成:{before} → {len(self.df)} 条")@timerdef analyze(self):"""多维度分析"""print("\n📋 === 销售数据分析报告 ===\n")# 1. 月度销售趋势monthly = self.df.groupby("月份")["金额"].sum()print("📈 月度销售金额:")for month, amount in monthly.items():bar = "█" * int(amount / 100000)print(f" {month:>2d}月:{amount:>10,.0f}元 {bar}")# 2. 产品销量排行product_sales = self.df.groupby("产品")["销量"].sum().sort_values(ascending=False)print(f"\n🏆 产品销量排行:")for i, (product, sales) in enumerate(product_sales.items()):print(f" {i+1}. {product}:{sales}件")# 3. 区域销售占比region_sales = self.df.groupby("区域")["金额"].sum()total = region_sales.sum()print(f"\n🗺 区域销售占比:")for region, amount in region_sales.sort_values(ascending=False).items():pct = amount / total * 100print(f" {region}:{amount:>10,.0f}元 ({pct:.1f}%)")# 4. 保存分析结果monthly.to_csv(os.path.join(self.output_dir, "月度趋势.csv"))product_sales.to_csv(os.path.join(self.output_dir, "产品排行.csv"))region_sales.to_csv(os.path.join(self.output_dir, "区域占比.csv"))print(f"\n💾 分析结果已保存到 {self.output_dir}/")@timerdef generate_chart(self):"""生成图表(需要 matplotlib)"""# pip install matplotlibimport matplotlibmatplotlib.use("Agg") # 无界面模式import matplotlib.pyplot as plt# 月度趋势折线图monthly = self.df.groupby("月份")["金额"].sum()fig, ax = plt.subplots(figsize=(10, 5))ax.plot(monthly.index, monthly.values, "o-", color="#306090", linewidth=2)ax.set_title("月度销售趋势", fontsize=14)ax.set_xlabel("月份")ax.set_ylabel("销售金额(元)")ax.grid(True, alpha=0.3)fig.savefig(os.path.join(self.output_dir, "月度趋势.png"), dpi=150)print(f" 📊 图表已保存:月度趋势.png")def run(self):"""一键执行全流程"""print("🚀 启动销售数据分析...\n")self.load_data()self.clean_data()self.analyze()self.generate_chart()print("\n✅ 分析完成!")# 运行分析器analyzer = SalesAnalyzer()analyzer.run()
🚀 启动销售数据分析...📊 加载 240 条销售记录⏱ load_data 完成,耗时 0.005s🧹 清洗完成:240 → 239 条⏱ clean_data 完成,耗时 0.002s📋 === 销售数据分析报告 ===📈 月度销售金额:1月: 1,250,000元 ████████████2月: 980,000元 █████████...🏆 产品销量排行:1. 手机:1200件2. 电脑:980件...🗺 区域销售占比:华东:5,200,000元 (32.1%)华南:4,100,000元 (25.3%)...📊 图表已保存:月度趋势.png⏱ generate_chart 完成,耗时 0.312s✅ 分析完成! |
💡 这个项目综合应用了:① 面向对象(SalesAnalyzer 类);② 装饰器(@timer 计时);③ pandas(数据加载、清洗、分组统计);④ matplotlib(可视化图表);⑤ os(文件管理);⑥ 异常处理(dropna 容错)。是前面所有知识的集大成。
五篇连载知识点回顾
| 第1篇 | ||
| 第2篇 | ||
| 第3篇 | ||
| 第4篇 | ||
| 第5篇 |
下一步学什么?
- 方向1:Web开发
→ Flask / Django,做网站和API - 方向2:数据分析
→ 深入 pandas + numpy + matplotlib + seaborn - 方向3:人工智能
→ scikit-learn 机器学习 / PyTorch 深度学习 - 方向4:自动化
→ Selenium 浏览器自动化 / PyAutoGUI 桌面自动化 - 方向5:爬虫工程
→ Scrapy 框架 + 反爬策略 + 分布式爬虫
💡 最有效的学习方法:不要再看教程了——找一个你感兴趣的真实问题,用 Python 去解决它。做项目过程中遇到的问题,比看100篇教程学到的都多。
五篇连载到这里就结束了。从第一行 print("Hello") 到现在的爬虫、数据分析、自动化办公,你已经走完了 Python 入门到实战的完整路径。
接下来,用你学到的知识,去创造属于自己的项目吧! 🚀
Python · 实战项目 · 连载完结篇
五篇连载全部完成!收藏整个系列,转发给想学编程的朋友吧 👍
夜雨聆风