人工智能之编程进阶 Python高级:第十一章 过渡项目

人工智能之编程进阶 Python高级

第十一章 过渡项目


以下是 ​5 个由浅入深、覆盖 Python 核心技能的实战项目​,每个项目都包含:

  • 🎯 项目目标
  • 🔧 技术栈(知识点)
  • 📦 功能模块
  • 💡 实现要点与代码片段
  • 🚀 扩展建议

适合从入门到进阶的学习者动手实践,真正“学以致用”。


🌟 项目一:天气查询 CLI 工具(基础)

🎯 目标

通过命令行输入城市名,返回当前天气信息。

🔧 技术栈

  • requests(HTTP 请求)
  • argparse(命令行参数解析)
  • JSON 数据处理
  • 异常处理
  • 免费 API 调用(如 Open-Meteo 或国内聚合 API)

✅ 适合刚学完函数、模块、异常的新手

📦 功能

  • 输入城市 → 输出温度、天气状况
  • 支持多城市查询
  • 网络错误友好提示

💡 实现要点

1. 获取免费天气 API

推荐 Open-Meteo(无需 Key):

# 示例:通过经纬度查天气(需先查城市坐标)
def get_weather(lat, lon):url = f"https://api.open-meteo.com/v1/forecast"params = {"latitude": lat,"longitude": lon,"current_weather": True}resp = requests.get(url, params=params)data = resp.json()return data["current_weather"]

2. 命令行接口

import argparseparser = argparse.ArgumentParser(description="天气查询工具")
parser.add_argument("city", help="城市名,如 Beijing")
args = parser.parse_args()weather = get_weather_by_city(args.city)
print(f"{args.city} 当前温度: {weather['temperature']}°C")

3. 城市转经纬度(简化版)

可内置一个小型字典:

CITY_COORDS = {"Beijing": (39.9042, 116.4074),"Shanghai": (31.2304, 121.4737),# 可扩展为读取 CSV 或调用地理编码 API
}

🚀 扩展建议

  • 使用 geopy 自动将城市名转经纬度
  • 添加缓存(避免重复请求)
  • 输出彩色文字(colorama 库)
  • 支持历史天气、未来预报

🌟 项目二:静态网页爬虫 + 数据分析(中级)

🎯 目标

爬取豆瓣电影 Top 250,保存为 CSV,并做简单统计。

🔧 技术栈

  • requests(获取页面)
  • BeautifulSoup(解析 HTML)
  • pandas(数据分析)
  • csv / json(数据存储)
  • 正则表达式(可选)

📦 功能

  • 自动翻页(共 10 页)
  • 提取:电影名、评分、导演、年份
  • 保存为 movies.csv
  • 分析:平均分、最高分电影、年份分布

💡 实现要点

1. 爬取单页

url = "https://movie.douban.com/top250"
headers = {"User-Agent": "Mozilla/5.0"}
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, "lxml")for item in soup.select(".item"):title = item.select_one(".title").textrating = item.select_one(".rating_num").textyear = item.select_one(".bd p").text.split()[-1].strip("()")

2. 自动翻页

all_movies = []
for start in range(0, 250, 25):page_url = f"https://movie.douban.com/top250?start={start}"movies = parse_page(page_url)all_movies.extend(movies)time.sleep(1)  # 礼貌延迟

3. 保存与分析

import pandas as pddf = pd.DataFrame(all_movies)
df.to_csv("douban_top250.csv", index=False)print("平均分:", df["rating"].astype(float).mean())
print("最高分电影:\n", df.loc[df["rating"].astype(float).idxmax()])

⚠️ 注意

  • 遵守 robots.txt
  • 添加随机 User-Agent 和延迟,避免被封

🚀 扩展建议

  • matplotlib 可视化评分分布
  • 存入 SQLite / MySQL
  • 部署为定时任务(每天更新)

🌟 项目三:动态网站爬虫 —— 模拟登录 + 数据抓取(中高级)

🎯 目标

自动登录 GitHub,抓取用户仓库列表。

🔧 技术栈

  • selenium(浏览器自动化)
  • WebDriverWait(显式等待)
  • Cookie / Session 管理
  • 无头模式(Headless)

✅ 掌握真实场景中的反爬对抗

📦 功能

  • 自动打开 Chrome
  • 输入用户名密码(或 Token)
  • 登录后跳转到 /username?tab=repositories
  • 提取仓库名、语言、Star 数
  • 保存为 JSON

💡 实现要点

1. 启动浏览器(无头)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECoptions = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)

2. 模拟登录

driver.get("https://github.com/login")
driver.find_element(By.ID, "login_field").send_keys("your_email")
driver.find_element(By.ID, "password").send_keys("your_password")
driver.find_element(By.NAME, "commit").click()# 等待登录成功
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "header[role='banner']"))
)

🔐 ​安全建议​:使用 GitHub Personal Access Token 代替密码!

3. 抓取仓库

driver.get(f"https://github.com/{username}?tab=repositories")
repos = []
for repo in driver.find_elements(By.CSS_SELECTOR, "li.public"):name = repo.find_element(By.CSS_SELECTOR, "h3 a").textstars = repo.find_element(By.CSS_SELECTOR, "svg.octicon-star").text.strip()repos.append({"name": name, "stars": stars})

🚀 扩展建议

  • pickle 保存登录后的 Cookie,下次免登录
  • 支持两步验证(需手动扫码或备用码)
  • 并发抓取多个用户(配合 threading

🌟 项目四:异步高并发爬虫(高级)

🎯 目标

并发抓取 100 个网页,比同步快 10 倍以上。

🔧 技术栈

  • asyncio + aiohttp(异步 HTTP)
  • 协程(coroutine)
  • 限流(semaphore)
  • 异常重试机制

📦 功能

  • 读取 URL 列表(如 urls.txt
  • 异步并发请求(控制最大并发数)
  • 成功/失败分别记录
  • 统计耗时

💡 实现要点

1. 异步请求函数

import aiohttp
import asyncioasync def fetch(session, url):try:async with session.get(url, timeout=10) as resp:return await resp.text()except Exception as e:return Noneasync def main():urls = [line.strip() for line in open("urls.txt")]# 限制并发数(防止被封)semaphore = asyncio.Semaphore(20)async def bounded_fetch(url):async with semaphore:return await fetch(session, url)async with aiohttp.ClientSession() as session:tasks = [bounded_fetch(url) for url in urls]results = await asyncio.gather(*tasks)print(f"成功: {len([r for r in results if r])} / {len(urls)}")

🚀 扩展建议

  • 结合 BeautifulSoup 解析内容
  • 将结果存入数据库(异步 ORM 如 databases
  • 集成日志系统(logging

🌟 项目五:Scrapy 专业爬虫 + Web API(工程化)

🎯 目标

构建一个可配置、可扩展、可部署的新闻爬虫系统。

🔧 技术栈

  • Scrapy(核心框架)
  • Scrapy-Splashscrapy-selenium(处理 JS)
  • Item Pipeline(数据清洗 + 存储)
  • FastAPI(提供查询接口)
  • Docker(容器化部署)

📦 功能

  • 爬取多个新闻站点(如 BBC、Reuters)
  • 提取:标题、正文、发布时间、URL
  • 去重(基于 URL 指纹)
  • 存入 PostgreSQL
  • 提供 RESTful API 查询新闻

💡 实现要点

1. Scrapy Spider(多站点)

class NewsSpider(scrapy.Spider):name = "news"start_urls = ["https://www.bbc.com/news","https://www.reuters.com/world/"]def parse(self, response):if "bbc.com" in response.url:yield from self.parse_bbc(response)elif "reuters.com" in response.url:yield from self.parse_reuters(response)

2. Pipeline 存数据库

# pipelines.py
class PostgresPipeline:def open_spider(self, spider):self.conn = psycopg2.connect(...)self.cur = self.conn.cursor()def process_item(self, item, spider):self.cur.execute("INSERT INTO news (title, content, url) VALUES (%s, %s, %s)",(item['title'], item['content'], item['url']))self.conn.commit()return item

3. FastAPI 查询接口

# api.py
from fastapi import FastAPI
import psycopg2app = FastAPI()@app.get("/news")
def get_news(keyword: str = None):# 查询数据库cur.execute("SELECT * FROM news WHERE title ILIKE %s", (f"%{keyword}%",))return cur.fetchall()

4. Dockerfile(一键部署)

FROM python:3.10
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["scrapy", "crawl", "news"]

🚀 扩展建议

  • 添加 Redis 去重(Scrapy-Redis)
  • 部署到云服务器(AWS / 阿里云)
  • 添加定时任务(cron + scrapy crawl)
  • 前端展示(Vue/React)

📌 总结:项目进阶路线图

项目 难度 核心能力
天气 CLI 工具 基础语法 + API 调用
豆瓣电影爬虫 ⭐⭐ 静态页解析 + 数据分析
GitHub 登录爬虫 ⭐⭐⭐ 动态渲染 + 自动化
异步高并发爬虫 ⭐⭐⭐⭐ 异步编程 + 性能优化
Scrapy + API 系统 ⭐⭐⭐⭐⭐ 工程化 + 部署

✅ 动手建议

  1. 从项目一做起​,确保每一步都能运行
  2. 代码提交到 GitHub​,写好 README
  3. 逐步扩展功能​,不要追求一步到位
  4. 遇到问题查文档​:官方文档是最好的老师!

🌈 ​记住​:
编程不是“看会了”,而是“做会了”。
完成一个项目,胜过十篇教程。

后续

由于以上小项目涉及到未学习的内容,比如数据分析等,可以做过渡练习使用。部分代码已经上传至gitee,后续会逐步更新,主要受时间原因限制,当然自己也可以克隆到本地学习拓展。

祝你 coding 快乐,早日成为 Python 高手!🐍✨

资料关注

公众号:咚咚王
gitee:点击

《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen) 》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF2122

CF2122D Traffic Lights 如果只有第一问的话,每个点分 \(\operatorname{deg}\) 个点跑分层图即可,但是在第二问这个就很没有道理了,因为是可以通过来回走来节省等待时间的。 所以每个点必须分成 \(t\) 个点。那么我…

《d2l Chapter4 多层感知机基础内容》

通俗细节讲解多层感知机基础原理,以及实际运用,并附有Latex数学公式与细节代码实现Chapter 4 : 多层感知机(MLP)先看看这个原理简单的嵌套式的“双层”的线性回归 \[\mathbf{X} \in \mathbb{R}^{n \times d} \]表示…

洛谷P2678题解

P2678虽然是黄题,但是只要想通思路,就会变得异常简单。 以下是思路《跳石头》算法思路详解.url100分错1个点代码:点击查看代码 #include<bits/stdc++.h> using namespace std; int L,N,M,d[50005]; bool chec…

【JVM】详解 Class类文件的结构 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实验3_CPP

任务1 源代码 button.hpp #pragma once#include <iostream> #include <string>class Button { public:Button(const std::string &label_);const std::string& get_label() const;void click();pr…

longchain4j 学习系列(4)-mcp调用

继续学习langchain4j,以下是langchain4j 调用MCP的示例: 1、添加pom依赖1 <dependency> 2 <groupId>dev.langchain4j</groupId> 3 <artifactId>langchain4j-mcp</artifactId>…

Java 学习路线可按「基础→进阶→实战→架构」四阶段推进

一、基础入门阶段(1-2个月) 核心目标:掌握Java语法和基本编程思维,能独立写简单程序。 核心知识点: 环境搭建(JDK安装、IDEA使用、环境变量配置) 基础语法(变量、数据类型、运算符、流程控制、数组) 面向对象…

Jetson Orin Nano super -2 烧录概念及必要性

一、什么是烧录?(核心定义) 烧录(又称 “写入”“刷写”)是指 将预先打包好的系统镜像、程序固件或驱动文件,通过专用工具和协议,写入嵌入式设备(如 Jetson 开发板、单片机)的存储介质(如 eMMC、SD 卡、NVMe…

blog搬迁

博客已经搬迁到https://langx1ng.github.io/处我要吃炸鸡

102302122许志安作业3

要求:指定一个网站,爬取这个网站中的所有的所有图片,例如中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。 代码如下: import os import requests from bs4 import BeautifulSoup from u…

iPhone14系列电池容量多少毫安

iPhone 14:3279mAhiPhone 14 Plus:4325mAhiPhone 14 Pro:3200mAhiPhone 14 Pro Max:4323mAh作为对比iPhone 13 / Pro 系列电池容量:iPhone 13 mini:2406mAhiPhone 13:3227mAhiPhone 13 Pro:3095mAhiPhone 13 P…

ipc linux

在 Linux 中,IPC(Inter-Process Communication,进程间通信) 是一种让不同进程之间进行数据交换和协作的机制。常见的 IPC 方式包括:1. 管道(Pipe)用途:用于父子进程之间传递数据。命令示例:cat file1 | grep …

读 《d2l:Chapter3. 线性神经网络 》随笔

讲一下Softmax回归 先说说自带mnist等库中的one-hot encoding 就是:一个向量,分量 (Row) == 类别 如: A、B、C 对应 \((1, 0, 0)\)、\((0, 1, 0)\)、\((0, 0, 1)\) 注:全连接层: 不同层使用线性连接 \(softmax\)运…

错排的

1.关键错排的理解 当1不放在k时 n个元素去掉k而k原来的位置可以看成1现在的位置(不能放的)变成了n-1个元素的错排 2.记忆化搜索 你后面要写函数啊 include <bits/stdc++.h> using namespace std; long long dp…

ipad学linux

iPad 并不是 Linux 系统,它是一款 iOS 设备,运行的是 Apple iOS 操作系统。因此,无法直接在 iPad 上运行 Linux。不过,你可以通过以下几种方式在 iPad 上使用 Linux:? 一、在 iPad 上运行 Linux(通过虚拟机或容…

iPadOS16有什么新功能

1、信息 App 为用户带来高效协作新方式2、一款协作类新 App 全面支持 Apple Pencil,让用户能在同一块灵活的画布上实时进行查看、分享和协作3、邮件 App 推出的全新搜索功能可得到相关性更高、更准确、更完整的搜索结…

ipad linux

您提到的 "iPad Linux" 实际上是 iPad 无法直接运行 Linux 的一个常见误解。iPad 是苹果公司生产的触摸屏设备,基于 iOS 系统,而 Linux 是一个开源操作系统,通常运行在桌面或服务器设备上。如果您是想在 …

ip 查看linux

ip 是一个用于查看和管理网络接口的命令行工具,常用于查看网络接口的状态、配置信息、路由表等。以下是 ip 命令的一些常见用法和示例:一、查看网络接口状态ip a显示所有网络接口的详细信息,包括接口名、IP 地址、子…

从上下文工程到组织知识管理重构——HRBP在人机协同时代的新使命 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:蓝色星球如何打造能与企业共同进化的灵活系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …