写过爬虫的工程师经常会遇到一个问题,就是我们写好的CSS选择器在网站改版后就不能用了。如果使用的是正值表达式匹配,同样会在网站改版后失效。
现在是AI的时代,有了新的办法,那就是让 LLM 来做语义解析。把"用选择器硬扒"变成"让 AI 读懂页面"。
具体到技术选型,Web 自动化测试场景 Selenium 依然是老牌选择,但如果你要搞 JavaScript 重度渲染的动态站点 + AI 增强的数据提取,Crawl4AI + DeepSeek 这套组合拳更合适——Crawl4AI 自带异步并行抓取引擎,资源占用比 Selenium 低一个量级,而且内置了 LLM 友好的 Markdown 转换和内容过滤机制,省去大量预处理工作。
另外,Crawl4AI 的核心优势在于它专为 AI 优化。它能将 HTML 自动转为极其精简的 Markdown,这是减少 DeepSeek Token 消耗的关键。
核心架构:从页面渲染到结构化 JSON
整条数据流并不复杂:
- Crawl4AI 调用 Playwright 驱动无头浏览器完成页面渲染(JS 动态内容也能拿到)
- 内容过滤器 自动清洗导航栏、广告、侧边栏等噪声元素,生成干净的 Markdown
- DeepSeek 接收 Markdown 进行语义解析,按预设 Schema 输出结构化 JSON
关键代码如下:
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig
from crawl4ai.content_filter_strategy import PruningContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator
async def main():
# 1. 浏览器配置:无头模式保障生产效率
browser_config = BrowserConfig(headless=True, verbose=True)
# 2. 内容过滤:自动砍掉无关干扰,为 LLM 节省 Token
content_filter = PruningContentFilter(threshold=0.48, min_word_count=50)
md_generator = DefaultMarkdownGenerator(content_filter=content_filter)
config = CrawlerRunConfig(markdown_generator=md_generator)
async with AsyncWebCrawler(config=browser_config) as crawler:
result = await crawler.arun(url="https://example.com", config=config)
# 此时得到的 result.markdown 是经过高度净化的,极易被 DeepSeek 识别
print(f"提取成功,Markdown 长度: {len(result.markdown)}")
# DeepSeek 提示词策略:锁定 Temperature=0 确保 JSON 结构稳定性
# payload = {"model": "deepseek-chat", "messages": ..., "temperature": 0.0}
这里有个设计细节值得说:PruningContentFilter 自动移除导航栏、广告等噪声内容。这步操作的价值不在于"页面更好看",而在于大幅减少喂给 LLM 的 Token 数量,既省钱又提升解析准确度。
避坑指南:这些坑踩过才知道
坑一:为了绕 WAF 关掉无头模式
把 headless 设成 False 确实能降低一些被检测的概率,但代价是扩展性直接崩掉——运行速度大幅下降,IP 被封杀的风险反而更高。规模化抓取场景下,无头模式才是正道,反检测应该交给更专业的方案去处理。
坑二:System Prompt 写得模棱两可
DeepSeek 输出的 JSON 里面夹带私货(解释性文字、多余字段),99% 是因为提示词不够严格。实战中的有效做法:
- 明确要求"缺失字段用
null填充,禁止省略" - 强调"只输出 JSON,禁止任何解释性文字"
- 给出一个完整的 JSON Schema 示例作为 Few-shot
坑三:忽略成本与数据合规
如果项目对成本敏感或者有数据合规要求(比如不能把数据发到第三方 API),建议在本地基础设施上自托管 DeepSeek-V3.2 等开源模型,隐私和成本都能兼顾。
生产环境工程化要点
性能与并发
Crawl4AI 的异步引擎天然支持高吞吐量并行爬取,配合无头模式砍掉视觉渲染开销,单机吞吐量可以撑到相当可观的量级。
网络与反爬机制
这是整个链路里最容易出问题的环节。为每个请求分配新 IP 是基本操作,用来规避 IP 封禁和验证码挑战。AI 爬虫(尤其是使用了 LLM 语义解析的爬虫)通常运行成本(Token 费)比普通爬虫高。一旦因为 IP 被封导致请求失败,不仅浪费了渲染时间,更浪费了昂贵的 AI 解析次数。 因此,接入像“蜻蜓代理”这样稳定、低延迟的国内代理池,实际上是在“为 AI 预算止损”。
容错与监控
- 引入自动化变更监控工具,提前感知页面布局漂移,别等数据全是脏的才发现
- 代码层做好异常处理:
raise_for_status()检查 HTTP 状态码,网络超时和解析失败都要有兜底逻辑 - 整条流水线的每个环节都应该有独立的错误日志和重试机制
转载请注明
- 蜻蜓代理 - Crawl4AI + DeepSeek AI爬虫搭建实战教程
- 头条号 - 蜻蜓软件
- 微信公众号:蜻蜓软件(qingtingsoft)

