「AI Python 系列」第 01 栏 · AI 时代的 Python 办公自动化
全栏 18 篇 · 零成本跟完 🍃
品牌:梅雅达编程笔记
摘要: 网页上有数据但格式乱七八糟,手动复制太慢。本篇用requests抓取网页、BeautifulSoup提取文本、AI提取结构化JSON。三个实战:产品页提取价格评分、文章页提取作者结论、企业页提取联系方式。内置示例HTML无需联网。传统做法写正则一条条抠,AI做法给字段直接出JSON。
开篇 · 网页数据提取的真实痛点
你有没有遇到过这些场景:
| 竞品价格 | 打开网页 → 手动截图/复制 | 100个产品抄到天亮 |
| 文章信息 | 复制标题 → 复制作者 → 复制日期 | 来回切换复制粘贴 |
| 企业联系方式 | 翻到页面底部 → 找电话邮箱 | 50家公司翻到眼花 |
| 批量提取 | 写正则表达式匹配 | 网页结构一变正则全废 |
核心矛盾: 网页数据是给人看的,不是给程序处理的。HTML 结构千变万化,正则匹配脆弱不堪。
今天用 AI 解决这个问题——抓网页、提文本、AI 理解内容并输出结构化 JSON。
⚠️ 合规提醒
本篇仅用于教学演示。爬取公开数据时请遵守以下原则:
- 遵守 robots.txt:代码中提供 check_robots() 函数自动检查
- 控制频率:每次请求间隔 2 秒以上,别把人家服务器搞崩
- 不用于商业爬取:商用需获得网站授权
- 尊重版权:提取的数据仅供分析参考,不要原样复制分发
一、传统做法 vs AI 时代做法
传统做法:正则表达式 + BeautifulSoup
import re
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
# 手写正则提取价格
price_text = soup.find("p", class_="price").text
price = re.search(r"¥([\\d,]+)", price_text)
if price:
price_num = int(price.group(1).replace(",", ""))
# 每个字段都要单独写正则
# 网页结构一变,全得重写…
能力边界:
- ✅ 能精确匹配特定模式
- ❌ 正则写起来痛苦,调试更痛苦
- ❌ 网页结构变了就全废
- ❌ 无法理解"语义"——不知道哪段文字是价格、哪段是描述
AI 时代做法:提取文本 → AI 理解 → 结构化输出
# 提取纯文本
text = extract_text(html)
# AI 直接提取你要的字段
data = ai_extract(text, fields=["产品名称", "价格", "评分", "库存"])
# {"产品名称": "梅雅达智能客服系统", "价格": "9999", …}
组合优势:
- BeautifulSoup 负责提取文本:把 HTML 标签去掉,只留文字
- AI 负责理解语义:从纯文本中找到你要的信息
- 你只需要说清楚要什么字段
二、代码架构
ai_crawler.py
├── MOCK_PAGES(内置3个示例HTML页面)
│ ├── product:电商产品页
│ ├── article:新闻文章页
│ └── business:企业信息页
├── fetch_page(url):抓取真实网页(需联网)
├── check_robots(url):检查 robots.txt
├── extract_text(html):BeautifulSoup 提取纯文本
├── ai_extract(text, fields):AI 提取结构化 JSON
└── crawl_and_extract(html, fields):完整流程
内置 3 个示例 HTML 页面,无需联网即可跟练。fetch_page() 和 check_robots() 是给真实网站抓取准备的。
三、精简版代码
"""
ai_crawler_simple.py – AI 爬虫精简版
用 requests + BeautifulSoup 抓取网页文本,AI 提取结构化数据
⚠️ 仅抓取公开数据,遵守 robots.txt,教学用途
"""
import os
import sys
import json
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from llm_client import LLMClient
import requests
from bs4 import BeautifulSoup
# ============================================================
# 模拟网页(教学用,无需联网)
# ============================================================
MOCK_HTML = """<!DOCTYPE html>
<html><body>
<h1>梅雅达智能客服系统</h1>
<p class="price">原价12999元/年,优惠价9999元/年</p>
<p class="desc">基于大语言模型的智能客服系统,支持自动分类、智能回复、情感分析。</p>
<ul>
<li>AI 自动分类邮件和工单</li>
<li>智能回复草稿生成</li>
<li>多轮对话上下文记忆</li>
</ul>
<p>用户评分:4.8/5.0(326条评价)</p>
<p>库存:50套 | 电话:400-888-9999 | 邮箱:sales@meiyada.com</p>
</body></html>"""
def fetch_page(url):
"""抓取网页 HTML"""
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=10)
resp.encoding = resp.apparent_encoding
return resp.text
def extract_text(html):
"""用 BeautifulSoup 提取纯文本"""
soup = BeautifulSoup(html, "html.parser")
for tag in soup(["script", "style"]):
tag.decompose()
return soup.get_text(separator="\\n", strip=True)
def ai_extract(text, fields):
"""AI 从文本中提取结构化数据"""
client = LLMClient(provider="glm")
if len(text) > 4000:
text = text[:4000] + "…(截断)"
system_prompt = f"""你是信息提取专家。从网页文本中提取以下字段,输出JSON:
{chr(10).join('- ' + f for f in fields)}
找不到的字段值为 null。只输出 JSON。"""
result = client.chat_json(text, system_prompt=system_prompt, temperature=0.1)
return json.loads(result)
def crawl(html, fields, output_name="result"):
"""完整流程:HTML → 文本 → 结构化数据 → 保存"""
text = extract_text(html)
print(f"提取文本:{len(text)} 字符")
data = ai_extract(text, fields)
print("提取结果:")
print(json.dumps(data, ensure_ascii=False, indent=2))
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), f"{output_name}.json")
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"已保存:{path}")
if __name__ == "__main__":
print("=" * 50)
print(" AI 爬虫:LLM 提取结构化数据(精简版)")
print("=" * 50)
fields = ["产品名称", "原价", "优惠价", "核心功能", "用户评分", "联系电话"]
crawl(MOCK_HTML, fields, "product_info")
运行方式
cd day13_code
pip install -r requirements.txt
python ai_crawler.py
预期输出
============================================================
AI 爬虫:LLM 提取结构化数据(精简版)
==================================================
提取文本:165 字符
提取结果:
{
"产品名称": "梅雅达智能客服系统",
"原价": "12999元/年",
"优惠价": "9999元/年",
"核心功能": [
"基于大语言模型的智能客服系统",
"支持自动分类、智能回复、情感分析",
"AI 自动分类邮件和工单",
"智能回复草稿生成",
"多轮对话上下文记忆"
],
"用户评分": "4.8/5.0(326条评价)",
"联系电话": "400-888-9999"
}
已保存:e:\\CSDN\\01-AI办公自动化\\code\\day13\\product_info.json
完整代码评论区留言领取
四、代码拆解:三步流水线
| ① 提取文本 | extract_text() | — | 正则/CSS选择器 |
| ② AI 提取字段 | ai_extract() | 信息提取专家 | 手写正则匹配 |
| ③ 保存 JSON | crawl_and_extract() | — | 手动整理 |
关键设计:BeautifulSoup 先清洗再给 AI
def extract_text(html):
soup = BeautifulSoup(html, "html.parser")
for tag in soup(["script", "style"]):
tag.decompose()
text = soup.get_text(separator="\\n", strip=True)
return text
先去掉 <script> 和 <style> 标签(JS 代码和 CSS 样式对 AI 理解内容是噪音),再把 HTML 转成纯文本。这样 AI 看到的是干净的文字,而不是一堆标签。
关键设计:字段列表驱动提取
# 你要什么字段,就传什么字段
fields = ["产品名称", "原价", "优惠价", "评分", "库存"]
# AI 按你的字段列表输出 JSON
data = ai_extract(text, fields)
不用写正则,不用找 CSS class 名。你想要什么字段,AI 就帮你提取什么字段。换个网站,字段不变,代码一行都不用改。
关键设计:robots.txt 合规检查
def extract_text(html):
"""用 BeautifulSoup 提取纯文本"""
soup = BeautifulSoup(html, "html.parser")
for tag in soup(["script", "style"]):
tag.decompose()
return soup.get_text(separator="\\n", strip=True)
抓取真实网站前,先检查 robots.txt 是否允许。robots.txt 是网站告诉爬虫"哪些页面可以抓、哪些不能抓"的协议文件。尊重它是爬虫的基本礼仪。
五、真实网站抓取示例
内置示例页面方便跟练,真实使用时只需替换 HTML 来源:
import time
# 抓取真实网站
url = "https://example.com/product/123"
# 1. 检查 robots.txt
if check_robots(url):
# 2. 抓取页面
html = fetch_page(url)
# 3. AI 提取
data = crawl_and_extract(
html,
fields=["产品名称", "价格", "评分", "库存"],
page_type="电商产品页",
output_name="real_product"
)
# 4. 礼貌等待
time.sleep(2)
else:
print("robots.txt 禁止抓取该页面")
注意: 真实网站结构千变万化,AI 提取的准确率取决于页面文本的清晰度。对于 JS 动态渲染的页面(内容需要执行 JavaScript 才能显示),requests 只能拿到空壳 HTML,需要用 Selenium 或 Playwright 等浏览器自动化工具。
📊 本篇成本透明栏
| API 调用次数 | 3 次(3个页面各调 1 次) |
| 消耗 Token | 约 6,000 tokens |
| 成本 | ¥0(GLM-4.7-Flash 永久免费) |
| 免费额度是否够 | ✅ 够用 |
| 商用估算 | ¥0(GLM)/ 约¥0.01(DeepSeek)/ 约¥0.02(Qwen) |
| 抓取100个页面预估 | 约 5 分钟(含等待),成本 ¥0 |
练手改造题
改造 1(基础): 给 ai_extract() 加一个"置信度"字段——让 AI 对每个提取的字段输出一个 0-1 的置信度分数,低于 0.5 的字段标记为"需人工确认"。
提示:在 system_prompt 的 JSON 格式中加 "字段名_confidence": 0.95,输出后筛选低于 0.5 的字段。
改造 2(进阶): 改造 crawl_and_extract() 支持批量抓取——传入 URL 列表,逐个抓取并提取,结果合并保存为一个 JSON 数组文件。
提示:urls = [url1, url2, url3],循环 fetch_page + crawl_and_extract,每次 time.sleep(2)。注意异常处理,单个页面失败不影响整体。
改造 3(挑战): 加一个"数据清洗"步骤——AI 提取后,再调一次 AI 对结果做清洗:去除价格中的"¥"符号转为数字、统一日期格式、补全缺失字段。
提示:在 ai_extract() 后加一个 clean_data(data) 函数,用 chat_json() 让 AI 输出清洗后的 JSON,system_prompt 中说明"价格转为纯数字、日期统一为 YYYY-MM-DD 格式"。
下期预告
Day 14 · 从 Function Calling 到 ReAct Agent
前 13 篇都是"人调 AI"——你写代码调用 AI 的能力。从 Day 14 开始,反转过来——让 AI 自己决定调用什么工具。Function Calling 是 AI 调用外部函数的标准协议,ReAct 是"推理+行动"的 Agent 模式。这是从"工具人"到"智能助手"的转折点。
📚 资源与工具(文末合规集中)
- Python requests 文档: https://docs.python-requests.org/
- BeautifulSoup 文档: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
- Python urllib.robotparser: https://docs.python.org/3/library/urllib.robotparser.html
- 智谱开放平台(GLM,免费 API Key): https://open.bigmodel.cn/
- GLM 模型文档: https://docs.bigmodel.cn/
- 本专栏配套代码: CSDN 下载区(每篇更新)
🍃 作者的话
梅雅达编程笔记,专注 Python + AI 办公自动化实战教程。
AI 爬虫的精髓不在于"爬得快",而在于"提得准"。传统爬虫最痛苦的不是抓数据,而是写正则——每换一个网站,正则就得重写。AI 提取把"写规则"变成"说需求",你告诉它要什么字段,它帮你找。当然,对于大规模爬取场景,还是需要配合分布式队列、代理池等工程化方案,这些属于进阶话题,本专栏不做展开。
往期回顾
Day 01 · 为什么 2026 年办公自动化得“AI 化“了
Day 02 · 环境搭建:一套装备打天下
Day 03 · Prompt 工程 5 大心法
Day 04 · LLM API 横评 已被AI编程社区收录
Day 05 · 让 AI 输出结构化数据:告别“偶尔给你一段散文“
Day 06 · Excel + AI:让电子表格变“聪明“
Day 07 · Word + AI:自动生成文档
Day 08 · PDF 智能提取:让 AI 读懂合同、发票、简历
Day 09 · PPT 自动生成:文字大纲变演示文稿
Day 10 · 邮件 + AI:智能分类与自动回复
Day 11 · 自然语言查数据库(NL2SQL)
Day 12 · 可视化 + AI:让 AI 帮你选图表
专栏推荐
- 「AI Python 系列」第 01 栏 · AI+办公自动化(连载中)
- 「AI Python 系列」第 02 栏 · AI+数据可视化 (连载中)
- 「AI Python 系列」第 03 栏 ·AI+Python 爬虫实战(连载中)
- 「AI Python 系列」第05栏 · AI Agent实战(连载中)
资源领取
- 关注作者获取本栏完整代码和数据集
原创声明:本文为梅雅达编程笔记原创作品,未经允许不得转载。


![[特殊字符]DeepSeek‑Harness(DSH)小白保姆教程-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260816085112-6a817a009aabf-220x150.png)