Crawl4AI 爬虫实战指南:三步跑完一次数据采集
【免费下载链接】crawl4ai🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper. Don't be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai
Crawl4AI 是一个开源爬虫(对大语言模型友好的数据采集框架):登录态、JS 动态页面、结构化提取一套搞定,一次跑完数据采集不用多套工具倒手。
你的爬虫为什么总在掉链子
找一个靠谱的 Crawl4AI 使用教程之前,先对号入座,下面三种情况你中了几个:
- 刚登录完,第二天会话就失效了。每个站点的登录流程都不一样,一套一套写脚本写到崩溃。
- 页面是 JS 渲染的,列表只有前几条,剩下全藏在"加载更多"后面,抓下来的原始 HTML 里根本没货。
- 站点换了个类名,你手写的一排选择器全部作废,第二天又开始对着页面扒元素。
这三件事看起来零散,其实是一条流水线上的三道关:先进门、再等数据、最后把数据拿出来。Crawl4AI 的思路是把三道关的机制都内置好,你只需要按顺序配置。下面按采集流水线的真实顺序拆解。
先进门:3步保存登录态,密码再也不用输第二遍
从需要登录的站点采集数据,最磨人的往往不是写选择器,而是让会话一直活着。Crawl4AI 的答案是 Profile(可以理解为"整个浏览器的快照")。
机制用大白话说就是:传统做法只存门票(Cookie),Crawl4AI 则把浏览器指纹、Cookie、LocalStorage 以及用户代理(浏览器告诉网站"我是谁"的那串身份信息)打包成一个独立的配置文件目录。下次启动时带上这个目录,网站就会把你当成上次登录的那个人。整个流程三步:
- 终端执行
crwl profiles create finance-portal,自动弹出一个真实浏览器; - 在里面手动完成登录,验证码、短信码都按平时那样处理;
- 关掉窗口,登录状态自动落盘保存。
之后爬取时挂载这个目录即可:BrowserConfig(user_data_dir="~/.crawl4ai/profiles/finance-portal"),这就是登录态爬虫的全部机制。相比只存 Cookie,浏览器快照多带了指纹和本地缓存这些"人味",被判定为脚本的概率低得多。顺便说一句,别以为 Profile 只适合简单密码登录——只要你能在浏览器里把流程走通,双因素认证、OAuth 授权这些复杂场景同样能一次性固化进去。
收益很直接:从"每天重新登录"变成"一次登录、数周复用",为每个站点维护登录脚本的工作基本消失。
再等数据:让 JS 页面加载完整了你再抓
第二关是时机:页面还在渲染,你的爬虫已经把半成品 HTML 抓走了。靠多 sleep 几秒去赌,既慢又不稳。
Crawl4AI 用"事件驱动等待"替代固定延迟:wait_for盯着一个选择器,等它出现在页面上再走;scan_full_page自动滚动到页面底部,把懒加载的内容一次收齐;virtual_scroll_config(虚拟滚动,专门对付"滚到下面就回收旧元素"的信息流页面)则对指定容器反复滚动,直到新内容不再增长。换句话说,等的是"内容真的到了",而不是"时间到了"。
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig import asyncio config = CrawlerRunConfig(wait_for=".product-card", scan_full_page=True, scroll_delay=0.5) async def run(): async with AsyncWebCrawler() as crawler: r = await crawler.arun("https://shop.example.com/list", config) print(r.markdown) asyncio.run(run())这就是处理 Crawl4AI 动态页面的标准姿势:几行配置替代一堆写死的等待,遇到无限滚动的列表容器,再加一行virtual_scroll_config指定容器选择器和滚动次数就够了。更关键的是,完整性不再依赖你对延迟的猜测——从"等两秒赌一把"变成"内容齐了自动停",采集完整度从时灵时不灵变成稳定拿全。顺带提醒一句:别在智能等待上再叠固定的 sleep,那只会让爬取变慢,不会让内容变全。
后拿数据:CSS 快、LLM 灵,按场景选结构化提取
第三关是把页面变成可用的字段。如果站点改个类名你的规则就集体作废,那你需要的是双保险。
Crawl4AI 内置两种提取模式。第一种是 CSS 模式,用JsonCssExtractionStrategy:你给它选择器和字段 schema(声明要哪些字段、什么类型的模板),它按位置精确提取,速度快、几乎零成本,适合结构稳定的页面。第二种是 LLM 模式,用LLMExtractionStrategy:你写一句自然语言指令加一个 JSON schema,让大语言模型读懂页面语义,把字段找出来,就算标记混乱、类名没规律也能出结果。选型原则一句话:结构固定的用 CSS 求快,结构爱变的用 LLM 求灵。
from crawl4ai import LLMExtractionStrategy, LLMConfig strategy = LLMExtractionStrategy( llm_config=LLMConfig(provider="groq"), instruction="提取每个产品的名称、价格和库存状态", schema={"name": "str", "price": "float", "in_stock": "bool"}, ) # 传给 CrawlerRunConfig(extraction_strategy=strategy) 即可生效用上双模式后,新站点适配从数天压缩到一小时以内:稳定页面写几个选择器就收工,多变页面交给模型读语义。同样提醒一句:别迷信 LLM 永远更好,在结构固定的页面上,CSS 模式快好几倍、结果也更确定,还不用消耗 token。
选型别纠结:一张表看清和 Scrapy 们的差距
| 能力 | Crawl4AI | Scrapy 等传统框架 | 无代码爬虫工具 | 商业 API 服务 |
|---|---|---|---|---|
| 登录态 | 整浏览器 Profile,双因素、OAuth 均可固化 | 登录流程要自己手写维护 | 一般只存 Cookie | 大多不支持 |
| 动态渲染 | 内置浏览器 + 事件驱动等待 + 虚拟滚动 | 需额外集成浏览器组件 | 基础支持,复杂场景吃力 | 取决于服务商 |
| 结构化提取 | CSS+LLM 双模式,按站点切换 | CSS/XPath 全靠手写 | 可视化圈选,改版即失效 | 固定模板,灵活度低 |
| 规模化 | 内置并行与调度器,限速可控 | 分布式要自己搭 | 规模有限 | 按请求计费 |
| 维护成本 | 规则跟场景走,改版改一处配置 | 开发成本高,改动牵一发动全身 | 选择器脆弱,排查靠猜 | 低,但按量长期付费 |
结论其实不复杂:只要你碰到登录、动态渲染和频繁改版这三件事里的任意一件,选其他路线要多写和维护的代码,Crawl4AI 都已经内置好了。
实战小案例:SaaS 团队盯竞品定价页
一个 SaaS 团队的运营想持续跟踪 5 家竞品的订阅方案变化。坑在于:定价页全是单页应用,其中两家要登录销售控制台才能看到完整价格,加上市场团队隔三差五改文案。之前一个人手写选择器维护,第一个月就挂过两次。
换成 Crawl4AI 之后,做法就三步:
- 进门:给两家要登录的站点各跑一次
crwl profiles create,走一遍登录流程,之后所有采集直接复用状态; - 等:配置里给定价卡片写上
wait_for,打开scan_full_page,五个站点交给内置调度器并行跑,请求间隔设成低速,不惊动对方; - 拿:结构稳定的三家用 CSS 选择器提取价格表,剩下两家文案变化大,各写一句自然语言指令让 LLM 按 schema 拉字段。
结果:巡检频率从一周一次提升到每几个小时一次,定价变动的提醒基本在一小时内就能推到群里,而整个系统就是几个配置文件加一个脚本,没有一行登录代码需要维护。
今天就动手
别收藏了不看,直接跑:先给一个需要登录的站点保存 Profile,再按上面三步搭一条小流水线,这就是最快的 Crawl4AI 使用教程。
- 快速上手示例代码
- 虚拟滚动实战示例
- 结构化数据提取与内容选择文档
【免费下载链接】crawl4ai🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper. Don't be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考