Crawl4AI 实战手册:把一个网页变成 LLM 能直接吃的 Markdown
【免费下载链接】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
把一个新闻页 URL 交给 crawl4ai 的 AsyncWebCrawler,拿回来的是去掉导航、广告、弹窗后的干净 Markdown,可以直接喂给 LLM。下面是最小路径:一条命令装好依赖、在动态页面点按钮、用 CSS 选择器抽出列表,最后说几个新手最卡壳的地方。
🧭 能力速览
- Markdown 生成:把 HTML 转成两种口径的 Markdown,raw_markdown 是整页,fit_markdown 裁掉了页头页脚等样板内容。
- JS 执行:arun 时注入 js_code,可以点按钮、展开选项卡、滚动触发懒加载,脚本在抓取 HTML 之前跑完。
- 结构化提取:JsonCssExtractionStrategy 按 CSS 选择器把字段直接写成 JSON,不依赖 LLM,速度快、零 token 成本。
- 语义提取:CosineStrategy 用词共现聚类,从长文里找出和你主题最接近的段落。
- 深度爬取:BFSDeepCrawlStrategy / DFSDeepCrawlStrategy 按深度递归抓站内页面,带过滤器和评分器。
- 异步并发:arun_many 配合 dispatcher 在一个进程里并行爬多组 URL。
🔧 实战任务:从静态页到动态页
一条命令装好依赖并抓到第一份 Markdown
pip install -U crawl4ai # 装核心包 crawl4ai-setup # 顺带下载 Chromium 和系统依赖 crawl4ai-doctor # 验证浏览器是否就绪import asyncio from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode async def main(): async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler: # BYPASS 关掉缓存,避免调试时反复拿到上次抓好的旧内容 config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS) result = await crawler.arun( url="https://www.nbcnews.com/business", config=config ) print(len(result.markdown.raw_markdown), len(result.markdown.fit_markdown)) asyncio.run(main())输出是两个数量级不同的数字,比如几千字符对一两千字符:前者是整页,后者是裁完样板的正文。首次爬取要秒级(浏览器冷启动),之后会快一些。参数怎么配,直接翻 quickstart 里的完整示例。
用 JS 片段点掉"Load More"
新闻聚合站、商品列表页常见一种结构:首屏只有十条,剩下靠按钮加载。写法是把点击脚本交给 js_code:
js_code = """ const btn = Array.from(document.querySelectorAll('button')) .find(b => b.textContent.includes('Load More')); btn && btn.click(); """ config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, js_code=js_code, delay_before_return_html=1, # 点完等 1 秒让新内容渲染出来再抓 ) result = await crawler.arun(url=url, config=config)js_code 在页面加载后、收集 HTML 前执行,所以点击、展开、滚动产生的新内容都会被收进 result.markdown。如果新内容的选择器稳定,把 delay_before_return_html 换成 wait_for=".content-loaded" 更精确,不用盲等。
用 CSS 选择器只抽列表节点
整页抓回来太大时,css_selector 让 Crawl4AI 只收集匹配的节点。以 GitHub 提交列表为例:
config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, css_selector="li.Box-sc-g0xbh4-0", # 只收集匹配该选择器的节点 ) result = await crawler.arun(url=url, config=config)一个几 MB 的页面会被压到几 KB 的 Markdown。需要标题、链接、时间戳这类字段时,把 css_selector 换成 JsonCssExtractionStrategy 配一个 schema,拿到的就是 JSON 字符串,可以 json.loads 直接用。
🕳️ 容易踩的 3 个坑
- 第一次运行卡住或报浏览器启动失败:只装了 pip 包,Playwright 的浏览器还没下载。跑一次 crawl4ai-setup,或手动执行
python -m playwright install chromium。 - 同一个 URL 第二次爬到的是旧内容:默认缓存模式是 ENABLED,命中本地数据库就不再访问网站。调试阶段用 CacheMode.BYPASS;确认稳定后再切回 ENABLED,能省掉大量重复请求。
- 动态内容为空:抓取那一刻页面还没加载完。用 wait_for 等一个具体选择器,或给 delay_before_return_html 加 1~2 秒;如果目标站有反爬检测 headless,在 CrawlerRunConfig 里加 override_navigator=True 抹掉部分浏览器指纹。
适合做 RAG 数据管道、或单纯想把网页批量变 Markdown 的场景;如果你要协议级精细控制浏览器,直接上 Playwright 更省事。下一步就去 docs/examples/ 挑一个最接近你业务的示例跑一遍,比如 深度爬取的完整写法。
【免费下载链接】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),仅供参考