告别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 的夜晚,我到底图什么呢?