Crawl4AI 网页转 Markdown 爬虫:从安装到跑通三个典型场景只要 5 分钟
【免费下载链接】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
当你需要把网页变成能直接喂给大模型的 Markdown 时,Crawl4AI 网页转 Markdown 爬虫值得先看一眼。它把"打开页面、等渲染、取正文、清洗、转格式"这一串活打包进一个 Python 接口,你只管给 URL,它把干净的 Markdown 和结构化结果还给你。
为什么选 Crawl4AI 而不是常规爬虫
- 它内置真实浏览器内核,能等 JavaScript 渲染完再取 HTML,普通 requests 抓不到动态内容它抓得到。
- 输出天然是给 LLM 用的:标题、表格、代码块都转成规整 Markdown,省掉你手写清洗脚本。
- 同一套接口从单页、批量到整站深爬都覆盖,不用在 Scrapy、Selenium、自研脚本之间来回切。
- 会话、代理、缓存、反检测都是配置项,不用自己拼。
Crawl4AI 安装与初始化
先装包并装好浏览器内核:
pip install -U crawl4ai crawl4ai-setup crawl4ai-doctor最小可运行示例:
import asyncio from crawl4ai import AsyncWebCrawler async def main(): async with AsyncWebCrawler() as crawler: result = await crawler.arun(url="https://www.nbcnews.com/business") print(result.markdown) asyncio.run(main())跑完你会在终端看到该页面被清洗成带标题层级的 Markdown,广告、导航基本被剥掉,result里还有cleaned_html、media、links、metadata等字段可直接取用。
浏览器报错时手动装内核:python -m playwright install --with-deps chromium。
三个典型场景
Crawl4AI 如何只抓正文
如果你的页面正文和导航、页脚混在一起,用一个 CSS 选择器把范围框住即可。
from crawl4ai import CrawlerRunConfig config = CrawlerRunConfig( css_selector="article", # 只取正文容器 excluded_tags=["nav", "footer", "aside"], ) result = await crawler.arun(url="https://techcrunch.com", config=config)效果:result.markdown只剩article内的内容,体积和 token 消耗都明显下降。
结构化提取:让 LLM 出结构化数据
当页面没有稳定的 DOM 结构、但字段语义清楚时,交给 LLM 按 schema 抽。
from crawl4ai import LLMConfig, LLMExtractionStrategy config = CrawlerRunConfig( extraction_strategy=LLMExtractionStrategy( llm_config=LLMConfig(provider="openai/gpt-4o-mini", api_token=os.getenv("OPENAI_API_KEY")), schema=Product.schema(), instruction="提取每个产品的名称、价格、描述", ) )效果:result.extracted_content直接是符合Product模型的 JSON 列表,省去手写解析。
整站深爬:发现并爬取一整片 URL
要抓的不只是单页,而是从入口页开始把同域内容挖出来,就挂一个深爬策略。
from crawl4ai import BFSDeepCrawlStrategy config = CrawlerRunConfig( deep_crawl_strategy=BFSDeepCrawlStrategy( max_depth=3, max_pages=20, include_external=False ) ) result = await crawler.arun(url="https://docs.crawl4ai.com", config=config)效果:从入口逐层发现链接并按max_depth/max_pages受控展开,避免失控。
进阶能力速览
| 能力 | 什么情况下用它 |
|---|---|
自适应爬取AdaptiveCrawler | 反复抓同类站点,想让它自己学结构、按查询取数时用 |
内容过滤BM25ContentFilter/PruningContentFilter | 正文被大量导航、广告干扰,想自动留相关块时用 |
代理与反检测ProxyConfig/use_undetected_browser | 目标站点有反爬、或需要轮换出口 IP 时用 |
预取模式prefetch=True | URL 发现太慢,想提速数倍时用 |
崩溃恢复resume_state | 长时间深爬中途挂了、想断点续爬时用 |
生产环境工程化建议
- 并发控制:批量用
await crawler.arun_many(urls, config),默认走MemoryAdaptiveDispatcher,可用semaphore_count=10限制同时开页面数。 - 失败重试:
CrawlerRunConfig(max_retries=3, timeout=30000),配合异步调度器做超时兜底。 - 缓存省配额:
cache_mode=CacheMode.ENABLED(默认是BYPASS不走缓存),重复抓同一批 URL 时能显著省时间和带宽。 - 降资源占用:
headless=True、按需关掉screenshot与媒体提取,内存和磁盘都会小一圈。
避坑清单
现象:装完报浏览器内核缺失或崩溃原因:没装 Playwright 对应的 chromium 及系统依赖 解法:跑python -m playwright install --with-deps chromium再crawl4ai-doctor复核
现象:抓回来的内容明显不全原因:页面靠 JS 渲染,默认返回时机太早 解法:CrawlerRunConfig(delay_before_return_html=2),或配wait_for等待关键元素
现象:正文里混入导航、广告、侧栏原因:默认清洗力度不够,选择器没限定 解法:excluded_tags=["nav","footer","aside"]加PruningContentFilter进一步剪枝
现象:重复抓同一批页面浪费内存与配额原因:cache_mode默认BYPASS,每次都在真实请求 解法:改成CacheMode.ENABLED并设合适的cache_ttl
收尾
Crawl4AI 的核心价值是"一个接口同时管好渲染、清洗、抽取、深爬",让你把精力放回数据本身。建议顺着官方核心文档和示例代码往下读,再直接动手:把上面"只抓正文"里的css_selector换成你自己站点的正文选择器,跑一次看看result.markdown的效果。
- 核心与 API 文档:docs/md_v2/core/
- 可直接跑的示例:docs/examples/
- 深度爬取策略源码:crawl4ai/deep_crawling/
【免费下载链接】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),仅供参考