crawl4ai

Python 언어로 만든 AI 챗봇·언어모델, AI 에이전트 관련 프로젝트예요. 전 세계 개발자 8.7만 명이 스타(좋아요)를 눌렀어요. 깃허브에 올라온 설치파일이 없는 개발자용 프로젝트예요. 마지막 수정은 3일 전이에요.

👩‍💻 개발자용⭐ 8.7만 AI 챗봇·언어모델AI 에이전트인공지능

원문 소개: Official Crawl4AI Cloud: a hosted web scraping, extraction, and search API for AI agents. Free API key, 1,000 credits a month, no card. Fully open source: this repo is the Apache-2.0 crawler that powers it, and you can self-host it.

바로 쓰기

내 상황에 맞는 방법을 하나 고르세요.

깃허브에는 설치파일이 없어요. 앱으로 배포하는 프로젝트라면 공식 사이트에서 받을 수 있는지 확인해 보세요.

① 설치 명령어 · README에서 찾았어요

pip install -U crawl4ai
pip install -e ".[all]"

윈도우는 'PowerShell', 맥은 '터미널' 앱을 열고 붙여넣은 뒤 Enter를 누르세요.

브라우저에서 바로 열기 · 설치 없음

내 것으로 가져오기

git clone https://github.com/unclecode/crawl4ai.git

git clone: 개발자가 코드를 받는 명령어예요. 수정 내역까지 함께 받아져요.

한눈에 보기

인기⭐ 87,067 스타 · 🍴 9,072 포크
무료 여부Apache-2.0
무료이고 회사·상업용으로 써도 돼요. 출처(저작권 표시)만 남기면 돼요.
만든 언어Python
최신 버전v0.9.5 · 2026년 10월 14일
활동만든 날 2024.5.9 · 최근 수정 3일 전 · 열린 이슈(질문) 316개
공식 사이트crawl4ai.com/?ref=github-about

설명서 (README)

만든 사람이 쓴 원문 설명서예요. 영어가 어렵다면 한국어로 번역해서 보기 →

unclecode%2Fcrawl4ai | TrendshiftCrawl4AI

Crawl4AI Cloud is a hosted web scraping, extraction, and search API for AI agents and data pipelines. Turn pages into clean Markdown for RAG, extract structured JSON, or search the live web with one API key. Crawl4AI runs the browsers and manages the proxies.

Get a free API key · 1,000 free credits every month. No credit card required.

Try a URL in the playground · Set up Crawl4AI Cloud in Claude Code, Cursor, or Codex

This repository is home to the Apache-2.0 crawler that powers Crawl4AI Cloud. Run it yourself with Python or Docker.

Crawl4AI Cloud is live. 1,000 free credits every month, no card. Get your key.

GitHub Stars PyPI version Downloads Discord

Cloud quickstart

Hosted API base URL: https://api.crawl4ai.com.

Cloud API reference · Agent setup and MCP

Set CRAWL4AI_KEY to your API key, then scrape a page as Markdown:

curl -s https://api.crawl4ai.com/scrape \
  -H "Authorization: Bearer $CRAWL4AI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://news.ycombinator.com"}' | jq -r .markdown
Python 3
import json
import os
from urllib.request import Request, urlopen

request = Request(
    "https://api.crawl4ai.com/scrape",
    data=json.dumps({"url": "https://news.ycombinator.com"}).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['CRAWL4AI_KEY']}",
        "Content-Type": "application/json",
    },
    method="POST",
)

with urlopen(request) as response:
    print(json.load(response)["markdown"])
Node.js (18+)
async function main() {
  const key = process.env.CRAWL4AI_KEY;
  if (!key) throw new Error("Set CRAWL4AI_KEY first.");

  const response = await fetch("https://api.crawl4ai.com/scrape", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${key}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ url: "https://news.ycombinator.com" }),
  });

  if (!response.ok) {
    throw new Error(`Scrape failed (HTTP ${response.status}): ${await response.text()}`);
  }

  const { markdown } = await response.json();
  console.log(markdown);
}

main().catch((error) => {
  console.error(error.message);
  process.exitCode = 1;
});

Example Markdown output (illustrative excerpt):

# Hacker News

1. [Example story title](https://example.com/story)
2. [Another story title](https://example.com/another-story)

The same key works for /extract, /search, /serp, /answer and many URLs at once (/scrape/batch, /scrape/jobs). Pay as you go: live prices. For Claude Code, connect to the hosted MCP server:

claude mcp add --transport http crawl4ai https://api.crawl4ai.com/mcp \
  --header "Authorization: Bearer $CRAWL4AI_KEY"

Run Crawl4AI yourself

Latest: v0.9.5 (14 Oct 2026) · all releases →

pip install -U crawl4ai
crawl4ai-setup        # installs the browser, once
import asyncio
from crawl4ai import AsyncWebCrawler

async def main():
    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(url="https://news.ycombinator.com")
        print(result.markdown)

asyncio.run(main())

Docker server, CLI and every option: Installation · Self-hosted docs

Which one?

☁️ Crawl4AI Cloud 🐍 Library 🐳 Your own server
Runs the browsers we do you, in your Python process you, in Docker on your machine
JS-heavy pages and bot walls handled for you, automatically your settings, your proxies your settings, your proxies
Web search /search, /serp and /answer – –
Price 1,000 free credits a month; plans from $10 Free, Apache-2.0. You cover infrastructure. Free, Apache-2.0. You cover hosting.
🤓 My Personal Story

I grew up on an Amstrad, thanks to my dad, and never stopped building. In grad school I specialized in NLP and built crawlers for research. That’s where I learned how much extraction matters.

In 2023, I needed web-to-Markdown. The “open source” option wanted an account, API token, and $16, and still under-delivered. I went turbo anger mode, built Crawl4AI in days, and it went viral.

I made it open source for availability, anyone can use it without a gate. Now I’m building the platform for affordability, anyone can run serious crawls without breaking the bank. If that resonates, join in, send feedback, or just crawl something amazing.

That platform is live now: Crawl4AI Cloud.

Why developers pick Crawl4AI
  • LLM-ready output: smart Markdown with headings, tables, code and citation hints
  • Fast in practice: async browser pool, caching, minimal hops
  • Full control: sessions, proxies, cookies, user scripts, hooks
  • Adaptive intelligence: learns site patterns, explores only what matters
  • Deploy anywhere: run locally with Python or the CLI, secure your Docker server with a self-managed token, or use a Crawl4AI Cloud API key.

✨ Features

📝 Markdown generation
  • 🧹 Clean Markdown: headings, lists, tables and code blocks, in a structure an LLM reads well.
  • 🎯 Fit Markdown: filters remove menus, footers and boilerplate: PruningContentFilterLXML, BM25ContentFilter (for a query) and LLMContentFilter.
  • 🔗 Citations: page links become a numbered reference list.
  • 🛠️ Your own strategy: plug in a custom Markdown generator.

☁️ Same in the cloud: POST /scrape returns this Markdown, with no browser to run. Docs →

📊 Structured data extraction
  • 🔎 CSS and XPath schemas: fast extraction with no LLM (JsonCssExtractionStrategy, JsonXPathExtractionStrategy, RegexExtractionStrategy).
  • 🪄 Schema generator: describe what you want once; generate_schema writes a reusable schema.
  • 🤖 LLM extraction: any LLM provider, open-source or hosted, into a typed JSON schema (LLMExtractionStrategy).
  • 🧱 Chunking: topic, regex and sentence chunking for long pages.
  • 🌌 Cosine similarity: find the chunks that match a query (CosineStrategy).

☁️ Same in the cloud: POST /extract, with no LLM key of your own. Docs →

🌐 Browser control
  • 🖥️ Your own browser: persistent profiles with saved logins, cookies and settings.
  • 🔄 Remote browsers: connect over the Chrome DevTools Protocol (CDP).
  • 🔒 Sessions: keep a browser state across multi-step crawls.
  • 🧩 Proxies: with authentication and rotation.
  • 🕶️ Stealth mode: enable_stealth, and an undetected-browser adapter for sites that detect automation.
  • ⚙️ Full control: headers, cookies, user agents, viewport.
  • 🌍 Chromium, Firefox and WebKit.
🔎 Crawling and scraping
  • 🕸️ Deep crawl: BFS, DFS and best-first strategies, with crash recovery (resume_state) for long crawls.
  • 🧠 Adaptive crawling: AdaptiveCrawler stops when it has learned enough to answer your query.
  • 🌱 URL discovery: AsyncUrlSeeder (sitemaps, Common Crawl) and DomainMapper; prefetch=True finds URLs 5 to 10 times faster.
  • 🚀 Dynamic pages: run JavaScript, wait for elements, scroll the full page (scan_full_page) for infinite scroll and lazy images.
  • 📸 Screenshots and PDFs of any page.
  • 🖼️ Media and links: images, audio, video, srcset, internal and external links, iframes, metadata.
  • 📂 Raw HTML and local files: raw: and file://.
  • 🛠️ Hooks at every step of a crawl.
  • 💾 Caching to skip repeated fetches.
  • ⚡ Many URLs at once: arun_many with a memory-adaptive dispatcher.

☁️ Same in the cloud: up to 50 URLs in one streamed call, or 10,000 in a background job. Docs →

🐳 Self-hosting (Docker)
  • 🔐 Secure by default: every endpoint needs your CRAWL4AI_API_TOKEN.
  • 🧰 REST API: /md, /html, /crawl, /crawl/stream, /screenshot, /pdf, /execute_js.
  • 🤖 MCP: connect Claude Code and other agents to your own server.
  • 📊 Monitoring dashboard and playground, a browser pool with pre-warmed pages.
  • 🏗️ AMD64 and ARM64 images.

☁️ Rather not run a server? The cloud is the same idea, hosted. Get a key →

☁️ What the cloud adds
  • 🔍 Web search API: GET /search, browser-free, ranked and cleaned. Docs →
  • 📊 SERP API: GET /serp, Google's results page as data: true ranks, every block, localised to a place. Beta. Docs →
  • 💬 Answers: GET /answer gives a direct answer to a question (experimental). Docs →
  • 🧪 Extraction without your own LLM key: POST /extract. Docs →
  • 🧗 JS-heavy pages and bot walls: handled automatically; you never pick an engine. Docs →
  • 🤝 MCP for your agent: one line in Claude Code, Codex, Cursor or OpenCode. Docs →

🛠️ Installation

🐍 pip
pip install -U crawl4ai
crawl4ai-setup      # installs and sets up the browser
crawl4ai-doctor     # checks the installation

If the browser setup fails, install it by hand:

python -m playwright install --with-deps chromium

Pre-release versions: pip install crawl4ai --pre

Development install, for contributors:

git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e ".[all]"     # or: pip install -e .   (the core only)
🐳 Docker server

The server needs a token. Without one it answers only inside its container.

export CRAWL4AI_API_TOKEN="$(openssl rand -hex 32)"
docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g \
  -e CRAWL4AI_API_TOKEN="$CRAWL4AI_API_TOKEN" \
  unclecode/crawl4ai:latest

Test it (allow about 10 seconds for the start):

curl -s http://localhost:11235/md \
  -H "Authorization: Bearer $CRAWL4AI_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://news.ycombinator.com"}' | jq -r .markdown

The dashboard is at http://localhost:11235/dashboard, the playground at http://localhost:11235/playground. LLM keys, MCP and every setting: Self-hosting guide.

⌨️ Command line (`crwl`)
# A page as Markdown
crwl https://news.ycombinator.com -o markdown

# Deep crawl, breadth first, at most 10 pages
crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10

# Ask a question about a page (needs an LLM key: crwl config)
crwl https://www.example.com/products -q "Extract all product prices"

🔬 Advanced usage examples

More in docs/examples.

📝 Clean and fit Markdown
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.content_filter_strategy import PruningContentFilterLXML
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator

async def main():
    run_config = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        markdown_generator=DefaultMarkdownGenerator(
            content_filter=PruningContentFilterLXML(threshold=0.48, threshold_type="fixed", min_word_threshold=0)
        ),
    )
    async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
        result = await crawler.arun(url="https://en.wikipedia.org/wiki/Web_crawler", config=run_config)
        print(len(result.markdown.raw_markdown), "characters of raw Markdown")
        print(len(result.markdown.fit_markdown), "characters after the filter")

asyncio.run(main())
🖥️ A JavaScript page and structured data, without an LLM
import asyncio, json
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode, JsonCssExtractionStrategy

schema = {
    "name": "Quotes",
    "baseSelector": "div.quote",
    "fields": [
        {"name": "text", "selector": "span.text", "type": "text"},
        {"name": "author", "selector": "small.author", "type": "text"},
        {"name": "tags", "selector": "a.tag", "type": "list", "fields": [{"name": "tag", "type": "text"}]},
    ],
}

async def main():
    run_config = CrawlerRunConfig(
        extraction_strategy=JsonCssExtractionStrategy(schema),
        scan_full_page=True,   # scroll to the end, so the page loads every quote
        scroll_delay=0.5,
        cache_mode=CacheMode.BYPASS,
    )
    async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
        result = await crawler.arun(url="https://quotes.toscrape.com/scroll", config=run_config)
        quotes = json.loads(result.extracted_content)
        print(f"Extracted {len(quotes)} quotes")
        print(json.dumps(quotes[0], indent=2))

asyncio.run(main())
📚 Structured data with an LLM
import os, asyncio
from pydantic import BaseModel, Field
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode, LLMConfig, LLMExtractionStrategy

class ModelFee(BaseModel):
    model_name: str = Field(..., description="Name of the model.")
    input_fee: str = Field(..., description="Fee for input tokens.")
    output_fee: str = Field(..., description="Fee for output tokens.")

async def main():
    run_config = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        extraction_strategy=LLMExtractionStrategy(
            # any provider LiteLLM supports, e.g. "ollama/llama3.3" with api_token="no-token"
            llm_config=LLMConfig(provider="openai/gpt-4o-mini", api_token=os.getenv("OPENAI_API_KEY")),
            schema=ModelFee.model_json_schema(),
            extraction_type="schema",
            instruction="Extract every model name with its input and output token fee.",
        ),
    )
    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(url="https://openai.com/api/pricing/", config=run_config)
        print(result.extracted_content)

asyncio.run(main())
🤖 Your own browser with a saved profile
import os, asyncio
from pathlib import Path
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode

async def main():
    user_data_dir = os.path.join(Path.home(), ".crawl4ai", "browser_profile")
    os.makedirs(user_data_dir, exist_ok=True)
    browser_config = BrowserConfig(headless=True, user_data_dir=user_data_dir, use_persistent_context=True)
    run_config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS, magic=True)
    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(url="ADDRESS_OF_A_CHALLENGING_WEBSITE", config=run_config)
        print(result.success, len(result.markdown))

asyncio.run(main())

📖 Documentation

🤝 Contributing

We welcome contributions from the open-source community. Check out our contribution guidelines for more information.

📄 License & Attribution

This project is licensed under the Apache License 2.0, attribution is recommended via the badges below. See the Apache 2.0 License file for details.

Attribution Requirements

When using Crawl4AI, you must include one of the following attribution methods:

📈 1. Badge Attribution (Recommended) Add one of these badges to your README, documentation, or website:
Theme Badge
Disco Theme (Animated) Powered by Crawl4AI
Night Theme (Dark with Neon) Powered by Crawl4AI
Dark Theme (Classic) Powered by Crawl4AI
Light Theme (Classic) Powered by Crawl4AI

HTML code for adding the badges:

<!-- Disco Theme (Animated) -->
<a href="https://github.com/unclecode/crawl4ai">
  <img src="https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-disco.svg" alt="Powered by Crawl4AI" width="200"/>
</a>

<!-- Night Theme (Dark with Neon) -->
<a href="https://github.com/unclecode/crawl4ai">
  <img src="https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-night.svg" alt="Powered by Crawl4AI" width="200"/>
</a>

<!-- Dark Theme (Classic) -->
<a href="https://github.com/unclecode/crawl4ai">
  <img src="https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-dark.svg" alt="Powered by Crawl4AI" width="200"/>
</a>

<!-- Light Theme (Classic) -->
<a href="https://github.com/unclecode/crawl4ai">
  <img src="https://raw.githubusercontent.com/unclecode/crawl4ai/main/docs/assets/powered-by-light.svg" alt="Powered by Crawl4AI" width="200"/>
</a>

<!-- Simple Shield Badge -->
<a href="https://github.com/unclecode/crawl4ai">
  <img src="https://img.shields.io/badge/Powered%20by-Crawl4AI-blue?style=flat-square" alt="Powered by Crawl4AI"/>
</a>
📖 2. Text Attribution Add this line to your documentation: ``` This project uses Crawl4AI (https://github.com/unclecode/crawl4ai) for web data extraction. ```

📚 Citation

If you use Crawl4AI in your research or project, please cite:

@software{crawl4ai2024,
  author = {UncleCode},
  title = {Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper},
  year = {2024},
  publisher = {GitHub},
  journal = {GitHub Repository},
  howpublished = {\url{https://github.com/unclecode/crawl4ai}},
  commit = {Please use the commit hash you're working with}
}

Text citation format:

UncleCode. (2024). Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper [Computer software]. 
GitHub. https://github.com/unclecode/crawl4ai

🗾 Mission

Our mission is to unlock the value of personal and enterprise data by turning digital footprints into structured, useful assets. Crawl4AI gives individuals and organizations open-source tools to extract and structure data, and a fair way to benefit from it. Full mission statement →

💖 Support Crawl4AI

  1. ⭐ Star the repo: it helps more people find it.
  2. ☁️ Use the cloud: crawl4ai.com. It funds the library.
  3. 💝 Sponsor on GitHub: github.com/sponsors/unclecode
  4. 🏢 Companies: the sponsor tiers and benefits are in SPONSORS.md.

🌟 Current Sponsors

🤝 Strategic Partners

These companies provide core infrastructure and technology that power Crawl4AI’s capabilities — from web access and proxy networks to AI tooling and data pipelines.

Company About
Massive Massive provides a web access API for AI agents and data pipelines. Partnership details.

🏢 Enterprise Sponsors

Our enterprise sponsors support Crawl4AI and help scale it to power production-grade data pipelines.

Company About Sponsorship Tier
DataSync Helps engineers and buyers find, compare, and source electronic & industrial parts in seconds, with specs, pricing, lead times & alternatives. 🥇 Gold
Kidocode Kidocode is a hybrid technology and entrepreneurship school for kids aged 5–18, offering both online and on-campus education. 🥇 Gold
Aleph null Singapore-based Aleph Null is Asia’s leading edtech hub, dedicated to student-centric, AI-driven education—empowering learners with the tools to thrive in a fast-changing world. 🥇 Gold

💼 Become a Strategic Partner or Sponsor

Interested in partnering with Crawl4AI?

Whether you’re a proxy provider, AI infrastructure company, cloud platform, or an organization looking to support the Crawl4AI ecosystem, we’d love to hear from you.

📩 Contact: hello@crawl4ai.com

🧑‍🤝 Individual Sponsors

A heartfelt thanks to our individual supporters! Every contribution helps us keep our opensource mission alive and thriving!

Want to join them? Sponsor Crawl4AI →

📧 Contact

Discord · X @unclecode · GitHub @unclecode · hello@crawl4ai.com

  • Building crawlers or AI agents for a living? DM me on X. I want to work with people like you, and we are hiring.
  • From a company? We have an enterprise offer and we tailor it to your business. See our security and compliance page for current details. Write to hello@crawl4ai.com.

GitHub Forks Python Version GitHub Sponsors Follow on X Follow on LinkedIn

Happy crawling! 🕸️🚀

Star History

Star History Chart

자주 묻는 질문

crawl4ai 무료로 쓸 수 있나요?

네, Apache-2.0 라이선스로 공개된 오픈소스예요. 무료이고 회사·상업용으로 써도 돼요. 출처(저작권 표시)만 남기면 돼요. 깃허브 저장소에서 누구나 내려받을 수 있어요.

crawl4ai 설치는 어떻게 하나요?

터미널에 `pip install -U crawl4ai` 명령을 붙여넣으면 설치돼요. 이 페이지 '설치 명령어'에서 복사 버튼을 누르면 1초 만에 복사돼요. 자세한 옵션은 아래 README 설명서에 있어요.

코딩을 몰라도 crawl4ai 쓸 수 있나요?

조금 어려울 수 있어요. 완성된 설치파일이 없는 개발자용 프로젝트라서 터미널 명령어나 개발 환경이 필요해요. 처음이라면 Codespaces로 브라우저에서 먼저 실행해 보세요.

crawl4ai 인기는 어느 정도인가요?

깃허브 스타 87,067개, 포크 9,072개를 받은 프로젝트예요. 2024년에 만들어졌고 마지막 수정은 3일 전이에요. 스타가 1만 개를 넘으면 전 세계적으로 검증된 인기 프로젝트로 봐요.

복사했어요