楼主: small/lemon
211 0

[其他] 人工智能之编程进阶 Python高级:第十一章 过渡项目 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-2-5
最后登录
2018-2-5

楼主
small/lemon 发表于 2025-11-13 16:49:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

人工智能之编程进阶 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 argparse
    parser = 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)

总结:项目进阶路线图

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

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

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

后续

  • 资料关注

soup = BeautifulSoup(resp.text, "lxml")
for item in soup.select(".item"):
title = item.select_one(".title").text
rating = item.select_one(".rating_num").text
year = 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 pd
df = 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 EC
options = 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").text
stars = 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 asyncio
    async def fetch(session, url):
    try:
    async with session.get(url, timeout=10) as resp:
    return await resp.text()
    except Exception as e:
    return None
    async 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-Splash
    scrapy-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 psycopg2
    app = 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 系统 ????? 工程化 + 部署
动手建议
  • 从项目一做起,确保每一步都能运行
  • 代码提交到 GitHub,写好 README
  • 逐步扩展功能,不要追求一步到位
  • 遇到问题查文档:官方文档是最好的老师!
记住

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

后续

由于以上小项目涉及未学习的内容,比如数据分析等,可以作为过渡练习使用。部分代码已上传至 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》
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 人工智能 Requirements Description Requirement

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-28 13:28