
用 Crawl4AI 把网页批量变成干净 Markdown3 个任务场景的实操笔记【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai给 RAG 知识库喂数据时最耗时的往往不是模型调用而是把散落在新闻站、文档站里的 HTML 变成干净、无导航噪音的 Markdown。Crawl4AI 是一个开源的 LLM 友好型网页爬虫它驱动无头浏览器访问页面把 HTML 自动转换成结构化的 Markdown并支持 CSS 选择器截取和 LLM 结构化提取一次arun()调用就能完成抓取 清洗 转换。一句话定位Crawl4AI 解决的是HTML 脏、结构乱、AI 难用的问题输出以 Markdown 和 JSON 为主直接对接 RAG、Agent 和数据管道。核心能力各对应一个具体入口AsyncWebCrawler.arun()是抓取入口返回的result.markdown即转换后的 Markdown 文本DefaultMarkdownGenerator可挂PruningContentFilter按词密度阈值裁剪导航、页脚等噪音区块CrawlerRunConfig的css_selector参数把处理范围缩到指定 DOM 区域LLMExtractionStrategy按 Pydantic 模型输出结构化 JSON代码在 crawl4ai/extraction_strategy.pydeep_crawl_strategy挂上BFSDeepCrawlStrategy后单次调用即可逐层扩展站点环境准备与首次运行安装分三步装包、装浏览器、体检。全部命令如下# 安装核心包 pip install -U crawl4ai # 下载无头浏览器并初始化配置 crawl4ai-setup # 检查环境依赖是否完整 crawl4ai-doctor运行crawl4ai-doctor后输出里各项应为绿色通过若 Chromium 缺失会明确提示用python -m playwright install --with-deps chromium补装。下面的示例基于 0.9.0 版本异步写法单文件即可跑通。三个任务场景的实操场景 A把文章页转成喂给 RAG 的干净 Markdown任务目标抓一篇长文去掉导航栏、页脚、cookie 弹窗只保留正文。import asyncio from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator from crawl4ai.content_filter_strategy import PruningContentFilter async def main(): config CrawlerRunConfig( cache_modeCacheMode.BYPASS, # 跳过缓存每次都真实抓取 remove_overlay_elementsTrue, # 移除弹窗类覆盖层 markdown_generatorDefaultMarkdownGenerator( content_filterPruningContentFilter(threshold0.48) # 词密度低于阈值的块被裁剪 ) ) async with AsyncWebCrawler() as crawler: result await crawler.arun(urlhttps://en.wikipedia.org/wiki/Apple, configconfig) print(result.markdown.raw_markdown[:500]) asyncio.run(main())运行后终端打印出以标题、正文段落为主的 Markdownnav、footer区块已被过滤fit_markdown字段还能拿到按AI 友好标准进一步压缩后的版本。场景 B列表页只取商品摘要区任务目标一个电商列表页含大量广告位和侧栏只需要.product-item区域的文本。css_selector会先把原始 HTML 收缩到选择器命中的节点后续 Markdown 生成只基于这些节点省时间也省 token。from crawl4ai import CrawlerRunConfig, CacheMode, AsyncWebCrawler config CrawlerRunConfig( cache_modeCacheMode.BYPASS, css_selector.product-item # 只处理命中的元素 ) # 其余与场景 A 相同arun 后打印 result.markdown运行后result.markdown只剩命中元素的转换结果若想保留多组元素可改用target_elements[.product-item, .reviews]传列表语义是只处理这些元素而非第一个匹配就停。场景 C用 LLM 把产品页抽成结构化 JSON任务目标产品页的字段布局不固定CSS 选择器难以覆盖改用 LLM 按 Pydantic 模型抽字段结果直接落 JSON。import os, asyncio from pydantic import BaseModel, Field from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode, LLMConfig, LLMExtractionStrategy class Product(BaseModel): name: str Field(..., description产品名称) price: str Field(..., description价格) rating: str Field(..., description评分) async def main(): strategy LLMExtractionStrategy( llm_configLLMConfig(provideropenai/gpt-4o-mini, api_tokenos.getenv(OPENAI_API_KEY)), schemaProduct.model_json_schema(), instruction提取页面上所有产品信息 ) config CrawlerRunConfig(cache_modeCacheMode.BYPASS, extraction_strategystrategy) async with AsyncWebCrawler() as crawler: result await crawler.arun(urlhttps://www.amazon.com/dp/B0CHWR79ZK, configconfig) print(result.extracted_content) # 已是解析好的 JSON 字符串 asyncio.run(main())运行后result.extracted_content输出形如[{name: ..., price: $1199, rating: 4.5/5}]的数组字段与Product模型一一对应。注意schema接收的是model_json_schema()的字典不是模型类本身。关键参数速查参数默认值何时需要改推荐值cache_modeBYPASS同一 URL 反复抓取、要省钱省时调试用BYPASS生产批量任务用ENABLEDcss_selectorNone全页只关心页面局部或要省 LLM token用开发者工具确认的选择器wait_forNone内容是 JS 延迟渲染的目标节点选择器如.loaded-itemspage_timeout60000ms慢站超时慢站提到90000semaphore_count5arun_many并发批量任务按机器内存调一般 5~10完整字段说明在 crawl4ai/async_configs.py 的CrawlerRunConfig类注释里每个参数都带默认值和用途说明是排查配置问题的第一站。避坑笔记反复抓同一 URL 内容却不更新。原因是浏览器上下文与抓取结果有缓存第二次请求直接命中缓存。解法是在CrawlerRunConfig里显式写cache_modeCacheMode.BYPASS生产环境想兼顾性能可开启check_cache_freshnessTrue让缓存先走 ETag 校验再决定是否重抓。动态页面只拿到首屏列表截断。原因是虚拟滚动列表在滚动前 DOM 里根本没有那些节点等网络空闲也没用。解法是给arun传virtual_scroll_configVirtualScrollConfig(container_selector.feed-list, scroll_count20, wait_after_scroll0.5)它会反复滚动容器并累积去重内容定义同样在 crawl4ai/async_configs.py。装完包却起不了浏览器。原因是crawl4ai-setup只处理配置Playwright 的 Chromium 二进制缺失。解法是手动执行python -m playwright install --with-deps chromiumLinux 下--with-deps会连带装系统库缺这一步无头浏览器会直接启动失败。延伸方向单页之外把deep_crawl_strategyBFSDeepCrawlStrategy(max_depth2, include_externalFalse)挂进同一个CrawlerRunConfig一次调用就能沿链接逐层扩展策略实现和过滤器在 crawl4ai/deep_crawling/ 目录文档入口是 docs/md_v2/core/deep-crawling.md 和 docs/md_v2/core/quickstart.md。如果要做整站抓取服务仓库的deploy/docker/下提供了带监控面板和 REST API 的 Docker 部署方案。下一步建议先用场景 A 的脚本抓一个自己真实要用的站点把PruningContentFilter的阈值在 0.4~0.6 之间各调一次直观感受 Markdown 体积和正文完整度的变化再决定要不要引入场景 C 的 LLM 提取。【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考