告别XPath!用 DeepSeek + Crawl4AI 搭建智能爬虫

说实话,我以前真的是被写爬虫搞怕了。尤其是那种看着“简单”的网页,一点进去发现结构跟迷宫一样,想找的内容不是藏在三层 iframe 里,就是用奇奇怪怪的 class 名混淆视听,连鼠标点一下都会触发五六个 JS 请求。每次写 XPath 写得我都开始怀疑人生:我到底是来抓数据的,还是来解谜的?而且有些站点更离谱,页面结构三天两头换,还得天天调代码。干了几年爬虫,现在一看到网页源代码,我下意识手就开始发抖。
后来我开始寻思,大模型都这么卷了,帮人写代码、搞翻译、聊情感问题都不在话下,那能不能也来帮我搞搞爬虫?我不是非得它把代码都写好,起码你告诉我“我要的数据在哪”,是不是也算种福音?然后我就发现了这个组合——DeepSeek + Crawl4AI,真的是改变我写爬虫命运的两位“好兄弟”。

写 XPath 怀疑人生
我印象特别深,有一次我要抓一个做医药中间体的网站的数据。本来以为就是个普通的产品页,进去点个“查看详情”,结果人家搞得像盲盒页面。一个产品一个样,有的用 <table>
,有的用 <div>
,还有的干脆搞个 <canvas>
展示参数。我看着这个站点,心里想的是:“你卖化学品的,搞这么多前端花活干嘛?你这是在炫技还是怕我抓?”
那段时间我基本每天都在跟 XPath 和正则打架,调试多了之后甚至开始怀疑自己是不是选错了行业。
就在这时候,一个朋友把这个工具甩我脸上:Crawl4AI,一个配合大模型使用的浏览器级爬虫工具,还能直接接入 DeepSeek 等大语言模型来提取网页数据。我当时第一反应是:“啥意思?爬虫还能配 AI?你别唬我。”
我抱着试试看的态度上手,用了几天之后我直接破防了,这工具也太懂我了。它可以自动理解网页结构,只要你告诉它你想要什么字段,比如“价格”、“纯度”、“CAS号”,它就自己去找,还能自动提取成干净的 JSON 格式,整整齐齐,像刚洗完澡一样清爽。
DeepSeek + Crawl4AI 怎么一起用?
举个最基础的例子,我想抓某个化学品销售页面的产品信息。传统做法我们都知道,得先抓源码、分析 DOM、写 XPath,还得防动态加载和反爬。这一套搞下来,真的是一个项目能让你瞬间老十岁。
现在用这个组合,只需要这么写:
from crawl4ai import AsyncWebCrawler
from crawl4ai.extraction_strategy import LLMExtractionStrategy
from pydantic import BaseModel
class Product(BaseModel):
CASNo: str
size: str
price: str
stock: str
purity: str
MF: str
MW: str
SMILES: str
strategy = LLMExtractionStrategy(
provider="deepseek/deepseek-chat",
api_token="你的API密钥",
schema=Product.model_json_schema(),
extraction_type="schema",
instruction="从页面主表格提取出产品的 CASNo、purity、MF、MW、SMILES、size、price、stock",
chunk_token_threshold=1000,
apply_chunking=True,
input_format="markdown",
)
async def run():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
url="https://某化学站点地址.com/product-detail",
extraction_strategy=strategy
)
print(result.extracted_content)
整个流程基本就是:你告诉它你想要的字段,它自己“读网页”,然后给你一个结构化的结果。你甚至连“字段在哪”都不用管,它会自动去理解页面的结构和内容,哪怕是合并单元格、隐藏的 DOM,它也有办法挖出来。
DeepSeek 本身是个大语言模型,理解网页的能力非常强,虽然你得自己去申请个 API 密钥(官网不太稳定),但目前稳定的第三方渠道有两个——一个是腾讯云的接口,另一个是国内的“硅基流动”平台,用下来都挺稳定:
动态加载?JavaScript 页面?
我们平时抓数据最烦的就是那种“页面初始加载一堆空白,然后滚动或点击才出现内容”的站点。这种页面用传统方式你根本抓不到有用信息,非得上 Selenium 或 Puppeteer 来模拟浏览器,过程又慢又烦。
但 Crawl4AI 直接就支持执行 JavaScript,你可以写一段 JS,它在爬之前就会在浏览器里跑:
result = await crawler.arun(
url="https://动态内容站点.com",
js_code="window.scrollTo(0, document.body.scrollHeight);",
wait_for="document.querySelector('.loaded')"
)
上面这段是模拟向下滚动,直到页面某个特定元素加载完成。用这种方式抓动态网页,省了多少事你懂的。
关键是你不用管浏览器驱动、环境兼容性这些细节,Crawl4AI 都已经帮你封装好了,你就负责告诉它“什么时候算加载完”,它就给你全套跑下来。配合 DeepSeek 的字段识别能力,动态内容也照样能提取得干干净净。
出错也不怕,能抓能调还能扩展
另一个让我服气的点是,它对错误处理做得很细。这年头做爬虫最怕就是半夜起来一看——一堆报错,全都卡在“结构变了”、“元素没找到”这种莫名其妙的地方。但 Crawl4AI 有非常详细的错误提示,你甚至可以定义自己的钩子函数,在不同阶段做不同的操作:
try:
result = await crawler.arun(url="https://任意页面.com")
except Exception as e:
print("爬虫崩了,兄弟来看一下是啥情况:", e)
除此以外,它还支持在请求前注入 Cookie,模拟登录,甚至自动处理重定向、异常结构清洗。对那种“需要身份验证才能爬”的页面特别有用。
我在项目里经常要抓需要登录才能访问的供应商产品页,用它可以提前设置登录动作,等于完全还原真实用户的访问行为,非常稳。
实战效果真的一眼见真章
最后讲个我自己测的案例。我拿了 ChemShuttle 这个化学合成公司的网站来做测试,里面有大量产品详情页,每个页面的信息格式都不一样,有合并单元格、动态价格加载,甚至还有个别字段直接写在 JS 变量里。
我用了 DeepSeek 配合 Crawl4AI 跑了一次,得到的数据是这样的:
[
{
"CASNo": "269398-78-9",
"size": "1g",
"price": "$150.00",
"stock": "Typically in stock",
"purity": "95%",
"MF": "C25H22N2O6",
"MW": "446.459",
"SMILES": "OC(=O)C[C@@H]..."
}
]
我一开始都准备好了手动清洗,结果模型提得规规整整,完全是数据库可用级别的数据。那一刻我真的是感觉自己从“人工筛网页”的原始人,突然坐上了信息采集的高铁。
用完这套组合之后,我的爬虫思路整个变了。以前做一个页面得花两三天,现在只需要几行代码,剩下的交给模型去搞定。遇到新结构?没事,它自己分析。加载太慢?它自动执行 JS 等待。以前我是“全靠眼睛+手速”硬抗,现在我是“把问题告诉 AI,等结果”。
现在我回头想想,那些天天调 XPath 的夜晚,我到底图什么呢?