在 2025 年,Web 爬虫技术正经历一场由大模型驱动的变革。过去,我们依赖 XPath、CSS 选择器等硬编码规则解析网页结构------这种方式不仅繁琐,而且一旦网站改版,爬虫立刻失效。
如今,借助 ChatGPT(GPT 系列大模型) 的强大语义理解能力,我们可以让 AI 直接从原始 HTML 或 Markdown 中提取结构化数据,大幅降低开发复杂度,提升爬虫的鲁棒性与适应性。
本文将手把手教你:
- 如何结合大模型与反反爬代理服务
- 构建一个能自动解析商品信息的 AI 爬虫
- 使用 Python 实现端到端流程(含完整代码)
注:文中涉及的代理服务将以"支持反反爬、返回 Markdown 格式"的通用接口为例,不绑定任何具体厂商。
一、为什么用 ChatGPT 做网页抓取?
传统爬虫的痛点:
- 需手动编写选择器(如
div.price > span) - 网站结构调整后立即失效
- 多语言、动态渲染内容难以处理
AI 爬虫的优势:
- 无需硬编码解析规则:只需提供提示词(prompt),AI 自动识别字段
- 自适应页面变化:即使布局调整,只要内容语义不变,仍可正确提取
- 支持非结构化内容:如从段落中抽取出"颜色""尺寸"等隐含信息
OpenAI等平台已提供专为结构化提取优化的 API 模式(如
response_format),可直接输出 JSON Schema 定义的数据对象。
二、典型应用场景
| 场景 | 说明 |
|---|---|
| 电商价格监控 | 从 Amazon、Shopify 等动态站点提取商品价格、库存、描述,即使页面频繁改版也能稳定抓取 |
| 内容聚合与摘要 | 抓取多源新闻/博客,用 GPT 自动标准化格式或生成摘要 |
| 智能爬虫调度 | 结合 RAG(检索增强生成),让爬虫根据上下文决定下一步抓取哪些链接 |
| 社交媒体数据采集 | 应对 React/Vue 动态渲染、无限滚动等传统爬虫难以处理的场景 |
三、技术架构概览
Matlab
[目标网站]
↓ (通过反反爬代理访问)
[代理服务] → 返回干净的 Markdown/HTML
↓
[ChatGPT/GPT-4o] → 根据 Prompt 提取结构化数据
↓
[Pydantic 模型] → 输出标准化 Python 对象
↓
[JSON/数据库] → 存储结果
关键组件:
- 反反爬代理:绕过 IP 封锁、验证码、浏览器指纹检测
- Markdown 输出:比原始 HTML 更简洁,节省大模型 token 成本
- 结构化输出:通过 JSON Schema 约束,确保数据格式一致
四、实战:用 Python 构建 AI 爬虫
步骤 1:环境准备
bash
mkdir ai-scraper && cd ai-scraper
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install requests openai pydantic beautifulsoup4 markdownify
步骤 2:定义数据模型(Pydantic)
python
# models.py
from pydantic import BaseModel
from typing import List, Optional
class Product(BaseModel):
sku: Optional[str] = None
name: Optional[str] = None
price: Optional[str] = None
description: Optional[str] = None
images: Optional[List[str]] = None
sizes: Optional[List[str]] = None
colors: Optional[List[str]] = None
category: Optional[str] = None
步骤 3:通过代理获取页面内容(通用接口示例)
⚠️ 此处使用伪代码模拟"支持反反爬并返回 Markdown 的代理服务"
python
# fetcher.py
import requests
def fetch_page_markdown(url: str, proxy_api_key: str) -> str:
"""
通过支持反反爬的代理服务获取页面的 Markdown 内容
"""
headers = {
"Authorization": f"Bearer {proxy_api_key}",
"Content-Type": "application/json"
}
payload = {
"url": url,
"format": "raw",
"data_format": "markdown" # 关键:返回 Markdown 而非 HTML
}
response = requests.post(
"https://api.proxy-service.com/unlock", # 通用接口地址
json=payload,
headers=headers,
timeout=30
)
return response.json().get("data", "")
步骤 4:调用大模型提取结构化数据
python
# parser.py
from openai import OpenAI
from models import Product
def extract_product_with_gpt(markdown_content: str, openai_api_key: str) -> Product:
client = OpenAI(api_key=openai_api_key)
messages = [
{"role": "system", "content": "你是一个专业的网页数据提取助手,请从以下内容中提取商品信息。"},
{"role": "user", "content": f"请从以下 Markdown 内容中提取商品数据:\n\n{markdown_content}"}
]
response = client.beta.chat.completions.parse(
model="gpt-4o",
messages=messages,
response_format=Product # 强制输出 Pydantic 模型
)
return response.choices[0].message.parsed
步骤 5:主程序整合
python
# main.py
from fetcher import fetch_page_markdown
from parser import extract_product_with_gpt
import json
import os
if __name__ == "__main__":
URL = "https://example-shop.com/product/123"
PROXY_KEY = os.getenv("PROXY_API_KEY")
OPENAI_KEY = os.getenv("OPENAI_API_KEY")
# 1. 获取页面 Markdown
markdown = fetch_page_markdown(URL, PROXY_KEY)
if not markdown:
raise Exception("Failed to fetch page content")
# 2. 用 GPT 提取结构化数据
product = extract_product_with_gpt(markdown, OPENAI_KEY)
# 3. 保存结果
with open("product.json", "w", encoding="utf-8") as f:
json.dump(product.model_dump(), f, indent=4, ensure_ascii=False)
print("✅ 商品数据已保存至 product.json")
五、关键优势总结
| 技术点 | 价值 |
|---|---|
| Markdown 输出 | 减少 HTML 标签噪声,降低 token 消耗 30%+ |
| 结构化输出(JSON Schema) | 避免后处理,直接获得可用数据对象 |
| 代理服务集成 | 自动处理 CAPTCHA、IP 封锁、JS 渲染等反爬机制 |
| Prompt 工程替代 XPath | 开发效率提升,维护成本大幅下降 |
六、注意事项与最佳实践
- 控制成本:GPT 调用按 token 计费,尽量使用 Markdown 而非原始 HTML
- 错误重试机制:网络波动或模型解析失败时应自动重试
- 合规性 :遵守 robots.txt,避免高频请求,尊重网站版权
- 本地缓存:对相同 URL 的结果可缓存,避免重复调用大模型