# Crawl4AI Quick Start Guide: Your All-in-One AI-Ready Web Crawling & AI Integration Solution

Crawl4AI, the **#1 trending GitHub repository**, streamlines web content extraction into AI-ready formats. Perfect for AI assistants, semantic search engines, or data pipelines, Crawl4AI transforms raw HTML into structured Markdown or JSON effortlessly. Integrate with LLMs, open-source models, or your own retrieval-augmented generation workflows.

**What Crawl4AI is not:**

Crawl4AI is not a replacement for traditional web scraping libraries, Selenium, or Playwright. It's not designed as a general-purpose web automation tool. Instead, Crawl4AI has a specific, focused goal:

-   To generate perfect, AI-friendly data (particularly for LLMs) from web content
-   To maximize speed and efficiency in data extraction and processing
-   To operate at scale, from Raspberry Pi to cloud infrastructures

Crawl4AI is engineered with a "scale-first" mindset, aiming to handle millions of links while maintaining exceptional performance. It's super efficient and fast, optimized to:

1. Transform raw web content into structured, LLM-ready formats (Markdown/JSON)
2. Implement intelligent extraction strategies to reduce reliance on costly API calls
3. Provide a streamlined pipeline for AI data preparation and ingestion

In essence, Crawl4AI bridges the gap between web content and AI systems, focusing on delivering high-quality, processed data rather than offering broad web automation capabilities.

**Key Links:**

-   **Website:** [https://crawl4ai.com](https://crawl4ai.com)
-   **GitHub:** [https://github.com/unclecode/crawl4ai](https://github.com/unclecode/crawl4ai)
-   **Colab Notebook:** [Try on Google Colab](https://colab.research.google.com/drive/1SgRPrByQLzjRfwoRNq1wSGE9nYY_EE8C?usp=sharing)
-   **Quickstart Code Example:** [quickstart_async.config.py](https://github.com/unclecode/crawl4ai/blob/main/docs/examples/quickstart_async.config.py)
-   **Examples Folder:** [Crawl4AI Examples](https://github.com/unclecode/crawl4ai/tree/main/docs/examples)

---

## Table of Contents

- [Crawl4AI Quick Start Guide: Your All-in-One AI-Ready Web Crawling \& AI Integration Solution](#crawl4ai-quick-start-guide-your-all-in-one-ai-ready-web-crawling--ai-integration-solution)
  - [Table of Contents](#table-of-contents)
  - [1. Introduction \& Key Concepts](#1-introduction--key-concepts)
  - [2. Installation \& Environment Setup](#2-installation--environment-setup)
    - [Test Your Installation](#test-your-installation)
  - [3. Core Concepts \& Configuration](#3-core-concepts--configuration)
  - [4. Basic Crawling \& Simple Extraction](#4-basic-crawling--simple-extraction)
  - [5. Markdown Generation \& AI-Optimized Output](#5-markdown-generation--ai-optimized-output)
  - [6. Structured Data Extraction (CSS, XPath, LLM)](#6-structured-data-extraction-css-xpath-llm)
  - [7. Advanced Extraction: LLM \& Open-Source Models](#7-advanced-extraction-llm--open-source-models)
  - [8. Page Interactions, JS Execution, \& Dynamic Content](#8-page-interactions-js-execution--dynamic-content)
  - [9. Media, Links, \& Metadata Handling](#9-media-links--metadata-handling)
  - [10. Authentication \& Identity Preservation](#10-authentication--identity-preservation)
    - [Manual Setup via User Data Directory](#manual-setup-via-user-data-directory)
    - [Using `storage_state`](#using-storage_state)
  - [11. Proxy \& Security Enhancements](#11-proxy--security-enhancements)
  - [12. Screenshots, PDFs \& File Downloads](#12-screenshots-pdfs--file-downloads)
  - [13. Caching \& Performance Optimization](#13-caching--performance-optimization)
  - [14. Hooks for Custom Logic](#14-hooks-for-custom-logic)
  - [15. Dockerization \& Scaling](#15-dockerization--scaling)
  - [16. Troubleshooting \& Common Pitfalls](#16-troubleshooting--common-pitfalls)
  - [17. Comprehensive End-to-End Example](#17-comprehensive-end-to-end-example)
  - [18. Further Resources \& Community](#18-further-resources--community)

---

## 1. Introduction & Key Concepts

Crawl4AI transforms websites into structured, AI-friendly data. It efficiently handles large-scale crawling, integrates with both proprietary and open-source LLMs, and optimizes content for semantic search or RAG pipelines.

**Quick Test:**

```python
import asyncio
from crawl4ai import AsyncWebCrawler

async def test_run():
    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun("https://example.com")
        print(result.markdown)

asyncio.run(test_run())
```

If you see Markdown output, everything is working!

**More info:** [See /docs/introduction](#) or [1_introduction.ex.md](https://github.com/unclecode/crawl4ai/blob/main/introduction.ex.md)

---

## 2. Installation & Environment Setup

```bash
# Install the package
pip install crawl4ai
crawl4ai-setup

# Install Playwright with system dependencies (recommended)
playwright install --with-deps  # Installs all browsers

# Or install specific browsers:
playwright install --with-deps chrome  # Recommended for Colab/Linux
playwright install --with-deps firefox
playwright install --with-deps webkit
playwright install --with-deps chromium

# Keep Playwright updated periodically
playwright install
```

> **Note**: For Google Colab and some Linux environments, use `chrome` instead of `chromium` - it tends to work more reliably.

### Test Your Installation
Try these one-liners:

```python
# Visible browser test
python -c "from playwright.sync_api import sync_playwright; p = sync_playwright().start(); browser = p.chromium.launch(headless=False); page = browser.new_page(); page.goto('https://example.com'); input('Press Enter to close...')"

# Headless test (for servers/CI)
python -c "from playwright.sync_api import sync_playwright; p = sync_playwright().start(); browser = p.chromium.launch(headless=True); page = browser.new_page(); page.goto('https://example.com'); print(f'Title: {page.title()}'); browser.close()"
```

You should see a browser window (in visible test) loading example.com. If you get errors, try with Firefox using `playwright install --with-deps firefox`.


**Try in Colab:**  
[Open Colab Notebook](https://colab.research.google.com/drive/1SgRPrByQLzjRfwoRNq1wSGE9nYY_EE8C?usp=sharing)

**More info:** [See /docs/configuration](#) or [2_configuration.md](https://github.com/unclecode/crawl4ai/blob/main/configuration.md)

---

## 3. Core Concepts & Configuration

Use `AsyncWebCrawler`, `CrawlerRunConfig`, and `BrowserConfig` to control crawling.

**Example config:**

```python
from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig

browser_config = BrowserConfig(
    headless=True,
    verbose=True,
    viewport_width=1080,
    viewport_height=600,
    text_mode=False,
    ignore_https_errors=True,
    java_script_enabled=True
)

run_config = CrawlerRunConfig(
    css_selector="article.main",
    word_count_threshold=50,
    excluded_tags=['nav','footer'],
    exclude_external_links=True,
    wait_for="css:.article-loaded",
    page_timeout=60000,
    delay_before_return_html=1.0,
    mean_delay=0.1,
    max_range=0.3,
    process_iframes=True,
    remove_overlay_elements=True,
    js_code="""
        (async () => {
            window.scrollTo(0, document.body.scrollHeight);
            await new Promise(r => setTimeout(r, 2000));
            document.querySelector('.load-more')?.click();
        })();
    """
)

# Use: ENABLED, DISABLED, BYPASS, READ_ONLY, WRITE_ONLY
# run_config.cache_mode = CacheMode.ENABLED
```

**Prefixes:**

-   `http://` or `https://` for live pages
-   `file://local.html` for local
-   `raw:<html>` for raw HTML strings

**More info:** [See /docs/async_webcrawler](#) or [3_async_webcrawler.ex.md](https://github.com/unclecode/crawl4ai/blob/main/async_webcrawler.ex.md)

---

## 4. Basic Crawling & Simple Extraction

```python
async with AsyncWebCrawler(config=browser_config) as crawler:
    result = await crawler.arun("https://news.example.com/article", config=run_config)
    print(result.markdown) # Basic markdown content
```

**More info:** [See /docs/browser_context_page](#) or [4_browser_context_page.ex.md](https://github.com/unclecode/crawl4ai/blob/main/browser_context_page.ex.md)

---

## 5. Markdown Generation & AI-Optimized Output

After crawling, `result.markdown_v2` provides:

-   `raw_markdown`: Unfiltered markdown
-   `markdown_with_citations`: Links as references at the bottom
-   `references_markdown`: A separate list of reference links
-   `fit_markdown`: Filtered, relevant markdown (e.g., after BM25)
-   `fit_html`: The HTML used to produce `fit_markdown`

**Example:**

```python
print("RAW:", result.markdown_v2.raw_markdown[:200])
print("CITED:", result.markdown_v2.markdown_with_citations[:200])
print("REFERENCES:", result.markdown_v2.references_markdown)
print("FIT MARKDOWN:", result.markdown_v2.fit_markdown)
```

For AI training, `fit_markdown` focuses on the most relevant content.

**More info:** [See /docs/markdown_generation](#) or [5_markdown_generation.ex.md](https://github.com/unclecode/crawl4ai/blob/main/markdown_generation.ex.md)

---

## 6. Structured Data Extraction (CSS, XPath, LLM)

Extract JSON data without LLMs:

**CSS:**

```python
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy

schema = {
  "name": "Products",
  "baseSelector": ".product",
  "fields": [
    {"name": "title", "selector": "h2", "type": "text"},
    {"name": "price", "selector": ".price", "type": "text"}
  ]
}
run_config.extraction_strategy = JsonCssExtractionStrategy(schema)
```

**XPath:**

```python
from crawl4ai.extraction_strategy import JsonXPathExtractionStrategy

xpath_schema = {
  "name": "Articles",
  "baseSelector": "//div[@class='article']",
  "fields": [
    {"name":"headline","selector":".//h1","type":"text"},
    {"name":"summary","selector":".//p[@class='summary']","type":"text"}
  ]
}
run_config.extraction_strategy = JsonXPathExtractionStrategy(xpath_schema)
```

**More info:** [See /docs/extraction_strategies](#) or [7_extraction_strategies.ex.md](https://github.com/unclecode/crawl4ai/blob/main/extraction_strategies.ex.md)

---

## 7. Advanced Extraction: LLM & Open-Source Models

Use LLMExtractionStrategy for complex tasks. Works with OpenAI or open-source models (e.g., Ollama).

```python
from pydantic import BaseModel
from crawl4ai.extraction_strategy import LLMExtractionStrategy

class TravelData(BaseModel):
    destination: str
    attractions: list

run_config.extraction_strategy = LLMExtractionStrategy(
    provider="ollama/nemotron",
    schema=TravelData.schema(),
    instruction="Extract destination and top attractions."
)
```

**More info:** [See /docs/extraction_strategies](#) or [7_extraction_strategies.ex.md](https://github.com/unclecode/crawl4ai/blob/main/extraction_strategies.ex.md)

---

## 8. Page Interactions, JS Execution, & Dynamic Content

Insert `js_code` and use `wait_for` to ensure content loads. Example:

```python
run_config.js_code = """
(async () => {
   document.querySelector('.load-more')?.click();
   await new Promise(r => setTimeout(r, 2000));
})();
"""
run_config.wait_for = "css:.item-loaded"
```

**More info:** [See /docs/page_interaction](#) or [11_page_interaction.md](https://github.com/unclecode/crawl4ai/blob/main/page_interaction.md)

---

## 9. Media, Links, & Metadata Handling

`result.media["images"]`: List of images with `src`, `score`, `alt`. Score indicates relevance.

`result.media["videos"]`, `result.media["audios"]` similarly hold media info.

`result.links["internal"]`, `result.links["external"]`, `result.links["social"]`: Categorized links. Each link has `href`, `text`, `context`, `type`.

`result.metadata`: Title, description, keywords, author.

**Example:**

```python
# Images
for img in result.media["images"]:
    print("Image:", img["src"], "Score:", img["score"], "Alt:", img.get("alt","N/A"))

# Links
for link in result.links["external"]:
    print("External Link:", link["href"], "Text:", link["text"])

# Metadata
print("Page Title:", result.metadata["title"])
print("Description:", result.metadata["description"])
```

**More info:** [See /docs/content_selection](#) or [8_content_selection.ex.md](https://github.com/unclecode/crawl4ai/blob/main/content_selection.ex.md)

---

## 10. Authentication & Identity Preservation

### Manual Setup via User Data Directory

1. **Open Chrome with a custom user data dir:**

    ```bash
    "C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\MyChromeProfile"
    ```

    On macOS:

    ```bash
    "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --user-data-dir="/Users/username/ChromeProfiles/MyProfile"
    ```

2. **Log in to sites, solve CAPTCHAs, adjust settings manually.**  
   The browser saves cookies/localStorage in that directory.

3. **Use `user_data_dir` in `BrowserConfig`:**

    ```python
    browser_config = BrowserConfig(
        headless=True,
        user_data_dir="/Users/username/ChromeProfiles/MyProfile"
    )
    ```

    Now the crawler starts with those cookies, sessions, etc.

### Using `storage_state`

Alternatively, export and reuse storage states:

```python
browser_config = BrowserConfig(
    headless=True,
    storage_state="mystate.json"  # Pre-saved state
)
```

No repeated logins needed.

**More info:** [See /docs/storage_state](#) or [16_storage_state.md](https://github.com/unclecode/crawl4ai/blob/main/storage_state.md)

---

## 11. Proxy & Security Enhancements

Use `proxy_config` for authenticated proxies:

```python
browser_config.proxy_config = {
    "server": "http://proxy.example.com:8080",
    "username": "proxyuser",
    "password": "proxypass"
}
```

Combine with `headers` or `ignore_https_errors` as needed.

**More info:** [See /docs/proxy_security](#) or [14_proxy_security.md](https://github.com/unclecode/crawl4ai/blob/main/proxy_security.md)

---

## 12. Screenshots, PDFs & File Downloads

Enable `screenshot=True` or `pdf=True` in `CrawlerRunConfig`:

```python
run_config.screenshot = True
run_config.pdf = True
```

After crawling:

```python
if result.screenshot:
    with open("page.png", "wb") as f:
        f.write(result.screenshot)

if result.pdf:
    with open("page.pdf", "wb") as f:
        f.write(result.pdf)
```

**File Downloads:**

```python
browser_config.accept_downloads = True
browser_config.downloads_path = "./downloads"
run_config.js_code = """document.querySelector('a.download')?.click();"""

# After crawl:
print("Downloaded files:", result.downloaded_files)
```

**More info:** [See /docs/screenshot_and_pdf_export](#) or [15_screenshot_and_pdf_export.md](https://github.com/unclecode/crawl4ai/blob/main/screenshot_and_pdf_export.md)  
Also [10_file_download.md](https://github.com/unclecode/crawl4ai/blob/main/file_download.md)

---

## 13. Caching & Performance Optimization

Set `cache_mode` to reuse fetch results:

```python
from crawl4ai import CacheMode
run_config.cache_mode = CacheMode.ENABLED
```

Adjust delays, increase concurrency, or use `text_mode=True` for faster extraction.

**More info:** [See /docs/cache_modes](#) or [9_cache_modes.md](https://github.com/unclecode/crawl4ai/blob/main/cache_modes.md)

---

## 14. Hooks for Custom Logic

Hooks let you run code at specific lifecycle events without creating pages manually in `on_browser_created`.

Use `on_page_context_created` to apply routing or modify page contexts before crawling the URL:

**Example Hook:**

```python
async def on_page_context_created_hook(context, page, **kwargs):
    # Block all images to speed up load
    await context.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
    print("[HOOK] Image requests blocked")

async with AsyncWebCrawler(config=browser_config) as crawler:
    crawler.crawler_strategy.set_hook("on_page_context_created", on_page_context_created_hook)
    result = await crawler.arun("https://imageheavy.example.com", config=run_config)
    print("Crawl finished with images blocked.")
```

This hook is clean and doesn’t create a separate page itself—it just modifies the current context/page setup.

**More info:** [See /docs/hooks_auth](#) or [13_hooks_auth.md](https://github.com/unclecode/crawl4ai/blob/main/hooks_auth.md)

---

## 15. Dockerization & Scaling

Use Docker images:

-   AMD64 basic:

```bash
docker pull unclecode/crawl4ai:basic-amd64
docker run -p 11235:11235 unclecode/crawl4ai:basic-amd64
```

-   ARM64 for M1/M2:

```bash
docker pull unclecode/crawl4ai:basic-arm64
docker run -p 11235:11235 unclecode/crawl4ai:basic-arm64
```

-   GPU support:

```bash
docker pull unclecode/crawl4ai:gpu-amd64
docker run --gpus all -p 11235:11235 unclecode/crawl4ai:gpu-amd64
```

Scale with load balancers or Kubernetes.

**More info:** [See /docs/proxy_security (for proxy) or relevant Docker instructions in README](#)

---

## 16. Troubleshooting & Common Pitfalls

-   Empty results? Relax filters, check selectors.
-   Timeouts? Increase `page_timeout` or refine `wait_for`.
-   CAPTCHAs? Use `user_data_dir` or `storage_state` after manual solving.
-   JS errors? Try headful mode for debugging.

Check [examples](https://github.com/unclecode/crawl4ai/tree/main/docs/examples) & [quickstart_async.config.py](https://github.com/unclecode/crawl4ai/blob/main/docs/examples/quickstart_async.config.py) for more code.

---

## 17. Comprehensive End-to-End Example

Combine hooks, JS execution, PDF saving, LLM extraction—see [quickstart_async.config.py](https://github.com/unclecode/crawl4ai/blob/main/docs/examples/quickstart_async.config.py) for a full example.

---

## 18. Further Resources & Community

-   **Docs:** [https://crawl4ai.com](https://crawl4ai.com)
-   **Issues & PRs:** [https://github.com/unclecode/crawl4ai/issues](https://github.com/unclecode/crawl4ai/issues)

Follow [@unclecode](https://x.com/unclecode) for news & community updates.

**Happy Crawling!**  
Leverage Crawl4AI to feed your AI models with clean, structured web data today.
