news 2026/8/29 4:40:41

Python爬虫入门实战:从requests请求到数据保存全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python爬虫入门实战:从requests请求到数据保存全流程

很多刚开始接触 Python 的朋友,一听到“爬虫”两个字,总觉得是高阶玩法,既要懂网络协议,又要会写复杂的解析规则。其实爬虫最核心的套路就那么几步:把网页拿下来,从里面提取你要的数据,再按需保存。只要顺着这条主线走,哪怕没有任何编程基础,也能在短时间内写出一个能真正跑起来的爬虫。本文会从 Python 环境安装开始,一步一步带你完成 requests 请求、HTML 解析、数据保存、动态页面处理,最后再用一个完整的实战案例把整条链路串起来。

1. 爬虫到底是什么

1.1 爬虫的本质

爬虫本质上是“模拟浏览器访问网页并提取信息”的自动化程序。普通用户用浏览器打开一个页面,看到的是排版好的图文内容;爬虫程序做的事情,是向目标网站发送 HTTP 请求,拿到 HTML、JSON 或其它格式的响应,再用代码从这些响应里解析出自己关心的数据。

举个例子,你想收集某个电商平台上的商品标题、价格和销量。手动复制粘贴几百条数据不现实,但写一个 Python 脚本,让它循环请求商品列表页,再按标签或字段提取信息,几分钟就能完成。这个自动化过程就是爬虫。

1.2 爬虫的常见应用场景

  • 价格监控:定时抓取商品价格,降价时自动通知。
  • 数据采集:收集新闻、招聘信息、房产信息用于分析。
  • 数据分析:抓取公开数据集,配合 pandas、matplotlib 做可视化。
  • 搜索引擎:蜘蛛程序本质上也是爬虫。
  • 舆情监测:采集评论、微博、贴吧内容做情感分析。

需要注意的是,爬虫技术本身是中性的,但使用场景必须有边界。抓取公开数据时要尊重目标网站的 robots 协议,控制请求频率,避免对服务器造成压力,更不能把抓取的数据用于商业侵权或泄露个人隐私。本文所有案例都只用于技术学习。

1.3 初学者需要掌握的四个核心模块

把爬虫拆开看,其实只需要四个能力:

  • 发起请求:用 Python 模拟浏览器向服务器要数据。
  • 接收响应:拿到服务器返回的 HTML 或 JSON。
  • 解析数据:从响应中提取目标字段。
  • 保存数据:把提取结果写入 CSV、Excel 或数据库。

如果遇到需要点击、滚动才能加载的页面,还需要“动态渲染页面处理”这个额外技能,后面会专门讲。

2. 环境准备与版本说明

2.1 Python 安装

绝大多数爬虫教程推荐 Python 3.8 以上版本。本文示例在 Python 3.10 环境下运行,你本地装 3.9、3.11、3.12 均可,语法和依赖库兼容性没有问题。

Windows 用户去 Python 官网下载安装包时,记得勾选“Add Python to PATH”,否则后续在 cmd 里输入 python 会提示找不到命令。macOS 用户可以通过 Homebrew 安装:

brew install python3

Linux 用户使用系统自带的包管理器即可。安装完成后,在终端输入:

python --version

如果输出了类似Python 3.10.12的版本号,说明安装成功。

2.2 虚拟环境

爬虫会用到多个第三方库,不同项目对库版本要求不同,建议每个项目创建独立虚拟环境,避免依赖冲突。

mkdir python-spider-demo cd python-spider-demo python -m venv venv

Windows 激活:

venv\Scripts\activate

macOS/Linux 激活:

source venv/bin/activate

激活后终端前面会出现(venv)标记,后面安装的依赖都只作用于当前项目。

2.3 编辑器选择

新手推荐 VS Code 或者 PyCharm。VS Code 需要安装 Python 扩展,PyCharm 社区版开箱即用。两个编辑器都能直接运行.py文件,也支持 Jupyter Notebook。如果只写脚本型爬虫,用 VS Code 更轻量。

2.4 核心依赖库

本文实战会用到以下库,在虚拟环境中统一安装:

pip install requests beautifulsoup4 lxml pandas
  • requests:发送 HTTP 请求。
  • beautifulsoup4:解析 HTML 文档。
  • lxml:解析器,解析速度比 Python 内置的 html.parser 更快。
  • pandas:数据清洗和保存 Excel/CSV。

如果之后要抓取动态渲染页面,还需要selenium和浏览器驱动,在第五节单独讲。

3. 第一个可运行的爬虫:requests 请求与响应

3.1 发送 GET 请求

先用一个最简单的例子理解请求-响应过程。在项目目录下创建first_spider.py

import requests url = "https://www.baidu.com" response = requests.get(url) print("状态码:", response.status_code) print("响应内容前500个字符:") print(response.text[:500])

运行后,你会看到状态码200,以及百度首页的 HTML 源码。response.status_code表示服务器返回的 HTTP 状态码,200 代表正常访问,404 代表资源不存在,403 代表禁止访问。response.text是服务器返回的文本内容,通常就是 HTML 代码。

3.2 处理响应编码

很多网站的页面默认使用 UTF-8,但部分网站可能是 GBK 或 GB2312 编码。如果不处理编码,解析结果会出现乱码。建议先通过response.encoding查看实际编码,再显式指定:

import requests url = "https://example.com" response = requests.get(url) print("原始编码:", response.encoding) # 手动指定编码 response.encoding = "utf-8" print(response.text)

如果确定页面是 GBK,比如一些老旧的政府网站或文学网站,可以写成response.encoding = "gbk"

3.3 设置请求头

有些网站会拦截没有 User-Agent 的请求。服务器通过 User-Agent 判断发起请求的是不是真实浏览器。所以爬虫代码里最好设置请求头:

import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } url = "https://www.baidu.com" response = requests.get(url, headers=headers) print(response.status_code)

这里的 User-Agent 是一个 Chrome 浏览器的标识。你可以打开自己浏览器的“开发者工具”,在 Network 面板里查看任意请求的 User-Agent,复制过来使用。

3.4 处理超时与异常

网络请求不稳定时,程序会卡住甚至崩溃。给请求加上超时时间,并用 try-except 捕获异常,是爬虫的基本素养:

import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } url = "https://www.baidu.com" try: response = requests.get(url, headers=headers, timeout=5) response.raise_for_status() print("请求成功:", response.status_code) except requests.RequestException as e: print("请求失败:", e)

timeout=5表示 5 秒内没有响应就抛出异常。raise_for_status()会在状态码不是 200 时主动抛错,方便提前发现问题。

4. 解析 HTML:BeautifulSoup 核心用法

requests 拿到的是 HTML 字符串,不能直接读取“标题”“价格”这样的字段,需要用解析库把 HTML 转换成结构化对象。BeautifulSoup 是新手最友好的选择。

4.1 从 HTML 字符串创建 BeautifulSoup 对象

from bs4 import BeautifulSoup html = """ <html> <body> <h1 class="title">Python爬虫教程</h1> <p id="desc">这是一个示例页面</p> <ul> <li>requests</li> <li>BeautifulSoup</li> <li>pandas</li> </ul> </body> </html> """ soup = BeautifulSoup(html, "lxml") print(soup.title) print(soup.h1.text) print(soup.p.text)

输出:

None Python爬虫教程 这是一个示例页面

lxml作为解析器需要提前安装,上一节已经装好。soup.h1匹配到第一个 h1 标签,.text获取标签内的文本。

4.2 查找单个元素:find

find()返回第一个匹配的标签:

title_tag = soup.find("h1") print(title_tag.text) # 按属性查找 desc_tag = soup.find("p", id="desc") print(desc_tag.text)

4.3 查找多个元素:find_all

find_all()返回所有匹配标签的列表:

items = soup.find_all("li") for item in items: print(item.text)

输出:

requests BeautifulSoup pandas

这是解析列表页最常用的方式:先find_all拿到所有列表项,再对每一项提取具体字段。

4.4 CSS 选择器:select

BeautifulSoup 的select()支持 CSS 选择器,写起来更接近前端语法:

# 类选择器 title_tag = soup.select(".title") print(title_tag[0].text) # id 选择器 desc_tag = soup.select("#desc") print(desc_tag[0].text) # 标签选择器 li_tags = soup.select("ul li") for li in li_tags: print(li.text)

无论find还是select,返回的都是 Tag 对象。要获取属性值,比如链接地址,使用中括号取值:

html = '<a href="https://example.com" class="link">点我</a>' soup = BeautifulSoup(html, "lxml") a_tag = soup.find("a") print(a_tag["href"])

4.5 实战:解析一个简单页面

假设有一个本地 HTML 文件book_list.html

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>图书列表</title> </head> <body> <div class="book"> <h2>Python编程从入门到实践</h2> <span class="price">¥89.00</span> <a href="/books/1">详情</a> </div> <div class="book"> <h2>流畅的Python</h2> <span class="price">¥128.00</span> <a href="/books/2">详情</a> </div> </body> </html>

用代码提取所有书名和价格:

from bs4 import BeautifulSoup with open("book_list.html", "r", encoding="utf-8") as f: html = f.read() soup = BeautifulSoup(html, "lxml") books = soup.select(".book") for book in books: title = book.find("h2").text price = book.select_one(".price").text print(f"书名: {title}, 价格: {price}")

输出:

书名: Python编程从入门到实践, 价格: ¥89.00 书名: 流畅的Python, 价格: ¥128.00

5. 动态页面解析:Selenium 入门与常见方案

5.1 什么是动态渲染页面

有些网站的数据不是直接写在 HTML 源码里的,而是通过 JavaScript 动态加载。用 requests 请求只能拿到一个空壳页面,真正的数据要等浏览器执行完 JavaScript 后才出现。最常见的例子是电商页面下拉加载更多、数据大屏、登录后才显示的图表。

简单判断方法:用浏览器右键“查看网页源代码”,如果目标数据不在源码中,那么这个页面就是动态渲染的,直接 requests 解析不到。

5.2 方案一:分析接口(推荐)

动态页面背后往往有一个 ajax 接口返回 JSON 数据。打开浏览器开发者工具 -> Network -> XHR,刷新页面,找到返回数据的请求,直接用 requests 请求该接口,解析 JSON 即可。这样效率最高,也不依赖浏览器。

以常见的数据接口为例:

import requests import json headers = { "User-Agent": "Mozilla/5.0 ...", "Referer": "https://example.com/data.html" } url = "https://example.com/api/data" params = { "page": 1, "pageSize": 10 } response = requests.get(url, headers=headers, params=params, timeout=5) data = response.json() print(json.dumps(data, ensure_ascii=False, indent=2))

注意编码参数ensure_ascii=False,否则中文会变成\u开头的一串字符。

5.3 方案二:Selenium 模拟浏览器

当接口难以分析,或者页面交互复杂时,用 Selenium 模拟真实浏览器是最稳妥的方案。Selenium 需要安装第三方库和浏览器驱动,本文以 Chrome 为例。

安装 selenium:

pip install selenium

还需要安装与本地 Chrome 版本匹配的 ChromeDriver。你可以打开 Chrome,在地址栏输入chrome://version查看版本号,然后去 ChromeDriver 官网下载对应版本,并把驱动所在目录加入 PATH,或者直接把驱动放到项目目录下。

简单示例:

from selenium import webdriver from selenium.webdriver.common.by import By import time # 创建浏览器对象 driver = webdriver.Chrome() # 打开页面 driver.get("https://example.com") # 等待页面加载 time.sleep(3) # 获取页面文本 page_text = driver.find_element(By.TAG_NAME, "body").text print(page_text) # 关闭浏览器 driver.quit()

Selenium 最关键的是等待元素出现。用time.sleep虽简单但不稳定,更推荐显式等待:

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 driver = webdriver.Chrome() driver.get("https://example.com") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "book-title")) ) print(element.text) finally: driver.quit()

WebDriverWait会每隔一段时间检查一次元素是否出现,10 秒超时后抛出异常。这种写法比固定 sleep 更可靠。

5.4 方案三:存储与复用页面数据

动态页面的爬虫运行较慢,如果数据量不大,可以先把页面源码保存到本地,再离线解析,减少重复请求。

from selenium import webdriver import time driver = webdriver.Chrome() driver.get("https://example.com") time.sleep(3) html = driver.page_source with open("page.html", "w", encoding="utf-8") as f: f.write(html) driver.quit()

之后使用 BeautifulSoup 读取本地文件解析即可。

6. 数据保存:CSV、Excel 的简洁写法

爬虫抓到的数据如果不保存,程序一结束就没了。最常见的保存格式是 CSV 和 Excel。CSV 是纯文本表格,通用性最强;Excel 适合后续可视化或交给非技术同事查看。

6.1 保存为 CSV

使用 Python 内置的 csv 模块,不需要额外安装:

import csv data = [ {"书名": "Python编程从入门到实践", "价格": "89.00"}, {"书名": "流畅的Python", "价格": "128.00"}, ] with open("books.csv", "w", encoding="utf-8-sig", newline="") as f: writer = csv.DictWriter(f, fieldnames=["书名", "价格"]) writer.writeheader() writer.writerows(data)

注意编码要写成utf-8-sig,否则用 Excel 打开 CSV 时中文可能乱码。newline=""是为了避免 Windows 下出现多余空行。

6.2 保存为 Excel

使用 pandas,一行代码即可写出 Excel 文件。需要先安装openpyxl

pip install openpyxl

代码:

import pandas as pd df = pd.DataFrame(data) df.to_excel("books.xlsx", index=False)

这也是爬虫与数据分析结合的关键一步:爬下来的数据交给 pandas,可以直接做清洗、筛选和汇总。

6.3 追加写入模式

如果爬虫是多轮运行,需要把新数据追加到已有文件,而不是覆盖,可以改成:

import csv def save_to_csv(file_name, data): with open(file_name, "a", encoding="utf-8-sig", newline="") as f: writer = csv.DictWriter(f, fieldnames=["书名", "价格"]) writer.writerows(data)

如果文件是首次创建,需要先写表头;这里需要结合文件是否存在做判断,更完善的写法建议使用 pandas 读取已有文件后合并再写回,既避免重复表头,也能做去重。

7. 完整实战:抓取一个静态新闻列表

前面所有知识点都很零散,现在用一个完整案例把“请求 -> 解析 -> 保存”串起来。我们以“某公开的测试新闻网站”为例,演示如何抓取文章标题、链接和发布时间。请确保你使用的是可公开访问、允许爬虫测试的站点,这里只演示技术逻辑。

7.1 需求分析

目标:抓取首页新闻列表的前 20 条记录,字段包括:文章标题、文章链接、发布时间。

页面结构假设如下:

<div class="news-list"> <div class="news-item"> <a href="/news/1">标题1</a> <span class="date">2025-01-01 10:00:00</span> </div> <div class="news-item"> <a href="/news/2">标题2</a> <span class="date">2025-01-02 11:00:00</span> </div> </div>

7.2 创建项目文件

项目结构:

python-spider-demo/ ├── venv/ ├── news_spider.py └── news.csv

7.3 编写爬虫代码

import csv import requests from bs4 import BeautifulSoup BASE_URL = "https://example.com/news" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } def fetch_page(url): try: response = requests.get(url, headers=headers, timeout=5) response.raise_for_status() response.encoding = "utf-8" return response.text except requests.RequestException as e: print(f"请求失败: {e}") return None def parse_news(html): soup = BeautifulSoup(html, "lxml") news_items = soup.select(".news-item") result = [] for item in news_items: title_tag = item.find("a") if title_tag is None: continue title = title_tag.text.strip() link = title_tag["href"] date_tag = item.find("span", class_="date") date = date_tag.text.strip() if date_tag else "" result.append({ "标题": title, "链接": link, "发布时间": date }) return result def save_to_csv(data, filename="news.csv"): with open(filename, "w", encoding="utf-8-sig", newline="") as f: writer = csv.DictWriter(f, fieldnames=["标题", "链接", "发布时间"]) writer.writeheader() writer.writerows(data) if __name__ == "__main__": html = fetch_page(BASE_URL) if html: news_data = parse_news(html) save_to_csv(news_data) print(f"成功保存 {len(news_data)} 条新闻到 news.csv") else: print("页面抓取失败")

7.4 运行与验证

在终端运行:

python news_spider.py

如果成功,会输出:

成功保存 20 条新闻到 news.csv

打开news.csv,可以看到整齐的表格数据。这里的parse_news是核心函数,它先用select(".news-item")定位所有新闻块,再在每一块中提取标题、链接和日期。strip()用于去掉首尾空白字符。

7.5 扩展:翻页抓取

如果新闻列表有多页,通常 URL 规律是https://example.com/news?page=2。可以写一个循环:

for page in range(1, 6): url = f"https://example.com/news?page={page}" html = fetch_page(url) if html: data = parse_news(html) all_data.extend(data) save_to_csv(all_data)

注意请求间隔,不要连续快速请求。可以在循环中加入time.sleep(1),避免对服务器造成压力。

8. 常见问题与排查思路

爬虫开发中遇到的报错,80% 都是下面这几类问题。遇到报错不要慌,按表格中的思路逐个排查。

问题现象常见原因解决思路
请求返回 403服务器拒绝了请求,缺少 User-Agent 或被识别为爬虫添加浏览器 UA,必要时增加 Referer、Cookie
返回 404请求的 URL 不存在,或拼接参数错误检查 URL 拼接方式,先用浏览器访问确认
返回 200 但解析不出数据页面内容由 JavaScript 动态渲染改用 Selenium,或直接分析 XHR 接口
结果出现乱码页面编码与 response.encoding 不一致手动设置编码,如 gbk、utf-8
中文写入 CSV 后乱码编码用了 utf-8,Excel 默认不识别写入时使用encoding="utf-8-sig"
Selenium 找不到元素元素未加载完成或选择器错误使用显式等待,先在浏览器 F12 里验证选择器
请求超时目标网站响应慢,或本地网络问题增大 timeout,添加重试机制

8.1 请求头需要带哪些内容

最少要有User-Agent。部分网站会校验Referer,表示请求是从哪个页面跳转过来的。遇到登录后才能查看的数据,还需要在请求头中携带 Cookie。Cookie 可以从浏览器的开发者工具里复制,但要注意 Cookie 有过期时间,长期运行的爬虫需要维护登录态。

8.2 如何提高数据解析的准确率

解析前先用浏览器 F12 查看目标元素最外层容器的 class 或 id,选择稳定的容器节点,再逐层提取。不要直接拿整段文本做字符串截取,那样遇到页面调整就会失效。BeautifulSoup 的select加上完整的父子层级,是通用性较强的写法。

8.3 反爬策略有哪些

常见反爬手段包括:User-Agent 检测、请求频率检测、IP 访问次数限制、验证码、登录限制、动态加密参数。作为初学者,先从最基础的请求头伪装和访问频率控制做起。验证码和加密参数属于进阶内容,不建议刚入门就死磕。

9. 最佳实践与工程建议

9.1 网络请求质量

  • 设置超时时间,防止线程卡死。
  • 对失败的请求做重试,建议最多 2-3 次,间隔至少 1 秒。
  • 控制请求频率,平均每次请求间隔 1-3 秒,并发场景下也要设置限速。
  • 尽量避开目标网站的高峰访问时段,比如大型电商大促期间。

9.2 数据存储设计

  • 小数据量用 CSV,便于查看和分享。
  • 结构复杂、需要频繁查询的数据存 SQLite 或 MySQL。
  • 每一条数据最好保留抓取时间和来源 URL,方便溯源。
  • 做增量爬虫时,用主键或标题去重,避免重复入库。

9.3 代码可维护性

  • 把请求、解析、保存拆成独立函数,不要全部塞在 main 里。
  • URL 和请求头等常量统一放在文件顶部。
  • 解析逻辑与页面结构强相关,建议在注释里写明页面示例片段。
  • 多页面爬虫用配置文件管理 URL 规则和字段映射。

9.4 安全与合规边界

强烈建议遵守以下原则:

  • 只抓取明确允许公开访问的数据。
  • 检查目标网站的 robots.txt,了解哪些路径不允许抓取。
  • 不抓取包含个人身份信息、账号密码、非公开交易数据的内容。
  • 抓取频率不要影响目标网站正常服务。
  • 爬取的数据仅用于个人学习和研究,不用于非法用途或商业牟利。
  • 涉及用户数据的项目,先咨询法务或相关合规人员。

10. 进一步学习路线

从零基础到能独立写爬虫,可以按下面顺序推进:

  1. 熟练掌握 requests 请求头和响应处理。
  2. 熟练使用 BeautifulSoup 的 find、find_all、select。
  3. 学习 XHR 接口分析,用 requests 抓 JSON 数据。
  4. 学习 Selenium 处理动态页面。
  5. 学习 scrapy 框架,实现分布式爬虫和更稳定的调度。
  6. 配合正则表达式处理复杂文本。
  7. 掌握数据清洗与可视化,把爬虫结果真正用起来。

如果你能完整跑完本文的案例,说明你已经具备了爬虫的基础链路能力。可以再找一个公开的静态列表网站,自己动手改代码,把标题解析改成图片地址解析,把 CSV 输出改成 Excel 输出,多练几个不同结构的页面,比继续看教程更有效。技术就是这样,看十遍不如自己写一遍。希望这篇 Python 爬虫入门教程能帮你迈出第一步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 4:40:32

IIS3DWB振动传感器:6kHz带宽MEMS如何替代压电式方案

做设备健康监测和预测性维护的朋友&#xff0c;应该都有过这种经历&#xff1a;项目初期选传感器时&#xff0c;一看普通MEMS加速度计带宽只有几百赫兹&#xff0c;直接摇头&#xff1b;转头去选压电式加速度计&#xff08;ICP&#xff09;&#xff0c;性能是够了&#xff0c;但…

作者头像 李华
网站建设 2026/8/29 4:40:02

【单片机课设毕设项目】基于 STM32 的 OLED 可视化多传感安全监测终端设计与开发 基于 STM32 的多风险源融合户外出行智能预警装置设计(013505)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/8/29 4:39:58

【单片机课设毕设项目】基于 STM32 的车载环境感知与自动通风控制系统设计 基于 STM32 单片机的车载多传感器数据采集与智能控制系统设计(013605)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/8/29 4:39:24

大模型投入产出失衡:AI成本结构、ROI测算与工程实践

如果你关注大模型、云基础设施或者 AI 应用落地&#xff0c;最近应该注意到了 Aswath Damodaran 那篇观点非常直白的评论&#xff1a;Big Tech Has No Idea How AI Pays Off。这位纽约大学金融学教授、估值领域公认的权威&#xff0c;直接点名了硅谷大厂在 AI 上“先砸钱再想办…

作者头像 李华
网站建设 2026/8/29 4:39:22

蓝桥杯国赛超声波实时时钟项目:从51单片机到嵌入式系统综合实战

1. 项目概述&#xff1a;从国赛真题到综合实战拿到“第四届国赛超声波实时时钟”这个题目&#xff0c;很多单片机初学者可能会觉得头大&#xff0c;感觉像是把两个不相关的模块硬凑在了一起。但做过之后你就会发现&#xff0c;这恰恰是蓝桥杯国赛题目的典型风格&#xff1a;它不…

作者头像 李华