Apidog

Platform Pengembangan API Kolaboratif All-in-one

Desain API

Dokumentasi API

Debug API

Mocking API

Pengujian Otomatis API

Tutorial Crawl4AI: Panduan Pemula

Mikael Svenson

Mikael Svenson

Updated on April 30, 2025

Di era AI, mengakses dan memproses data web secara efisien sangatlah penting. Crawl4AI muncul sebagai web crawler dan scraper sumber terbuka (open-source) yang kuat, direkayasa secara cermat untuk pengembang yang bekerja dengan Model Bahasa Besar (LLM), agen AI, dan pipeline data modern. Tutorial ini memberikan panduan mendalam tentang Crawl4AI, mencakup segala hal mulai dari instalasi hingga teknik crawling tingkat lanjut.

💡
Ingin alat Pengujian API yang hebat yang menghasilkan Dokumentasi API yang indah?

Ingin platform All-in-One yang terintegrasi untuk Tim Pengembang Anda agar dapat bekerja sama dengan produktivitas maksimum?

Apidog memenuhi semua kebutuhan Anda, dan menggantikan Postman dengan harga yang jauh lebih terjangkau!
button

Mengapa Memilih Crawl4AI untuk Proyek Anda?

Crawl4AI lebih dari sekadar web scraper standar. Ini dirancang dari awal untuk menjadi **ramah-LLM**. Ini berarti fokus pada:

  • Pembuatan Markdown yang Bersih: Menghasilkan **Markdown** yang terstruktur dengan baik, ringkas, dan dioptimalkan untuk sistem **Retrieval-Augmented Generation (RAG)** dan **fine-tuning** model dengan menghilangkan boilerplate dan noise.
  • Ekstraksi Data Terstruktur: Memungkinkan ekstraksi titik data spesifik ke dalam format seperti JSON menggunakan metode tradisional (**CSS selectors**, XPath) atau memanfaatkan **LLM** untuk tugas ekstraksi semantik yang lebih kompleks.
  • Performa Tinggi: Menggunakan pustaka **asyncio** Python dan framework otomatisasi browser **Playwright** yang kuat untuk **crawling asinkron** yang cepat.
  • Kontrol Browser Tingkat Lanjut: Menawarkan kontrol terperinci atas instance browser, termasuk **eksekusi JavaScript**, penanganan **konten dinamis**, pengelolaan sesi (**cookies**, local storage), penggunaan proxy, dan simulasi lingkungan pengguna yang berbeda (**user agents**, geolokasi).
  • Sumber Terbuka & Fleksibilitas: Sepenuhnya **sumber terbuka** (Apache 2.0 dengan atribusi) tanpa ketergantungan pada kunci API eksternal atau layanan berbayar. Menawarkan fleksibilitas deployment melalui **Docker** atau **instalasi pip** langsung.

Crawl4AI bertujuan untuk mendemokratisasi akses data, memberdayakan pengembang untuk mengumpulkan dan membentuk data web dengan cepat dan efisien.


Menginstal dan Menyiapkan Crawl4AI

Menjalankan Crawl4AI cukup mudah, menawarkan opsi pip dan Docker.

Metode 1: Instalasi Pip (Direkomendasikan untuk Penggunaan Pustaka)

Instal Paket: Buka terminal Anda dan jalankan:

# Instal versi stabil terbaru
pip install -U crawl4ai

# Atau, instal pra-rilis terbaru (untuk fitur mutakhir)
# pip install crawl4ai --pre

Jalankan Penyiapan Pasca-Instalasi: Langkah penting ini menginstal biner browser **Playwright** yang diperlukan (Chromium secara default):

crawl4ai-setup

Verifikasi: Periksa penyiapan Anda menggunakan alat diagnostik:

crawl4ai-doctor

Penyelesaian Masalah: Jika crawl4ai-setup mengalami masalah, instal dependensi browser secara manual:

python -m playwright install --with-deps chromium

Metode 2: Deployment Docker (Ideal untuk Layanan API)

Tarik Image: Dapatkan image Docker resmi (periksa GitHub untuk tag terbaru):

# Contoh tag, ganti jika perlu
docker pull unclecode/crawl4ai:latest

Jalankan Kontainer: Mulai layanan Crawl4AI, mengekspos API-nya (port default 11235):

docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g unclecode/crawl4ai:latest

Ini menjalankan Crawl4AI dengan backend FastAPI, siap menerima permintaan crawl melalui HTTP. Anda dapat mengakses **playground API** interaktif di http://localhost:11235/playground.


Cara Melakukan Crawl Pertama Anda dengan Crawl4AI

Crawl4AI membuat crawling dasar menjadi sangat sederhana menggunakan AsyncWebCrawler.

import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode

async def run_basic_crawl():
    # --- Contoh Dasar ---
    print("--- Menjalankan Crawl Dasar ---")
    # Gunakan 'async with' untuk memulai dan mematikan browser secara otomatis
    async with AsyncWebCrawler() as crawler:
        # Metode arun() melakukan crawl untuk satu URL
        # Ini mengembalikan objek CrawlResult
        result = await crawler.arun(url="https://example.com")

        if result and result.success:
            # Akses Markdown yang dihasilkan (biasanya 'fit_markdown')
            print("Crawl Berhasil!")
            # result.markdown menyediakan markdown mentah dan yang difilter
            print(f"Fit Markdown (300 karakter pertama): {result.markdown.fit_markdown[:300]}...")
        else:
            print(f"Crawl Gagal: {result.error_message}")

    # --- Contoh dengan Konfigurasi Dasar ---
    print("\n--- Menjalankan Crawl dengan Konfigurasi Dasar ---")
    # Konfigurasi perilaku browser (misalnya, jalankan headful untuk debugging)
    browser_conf = BrowserConfig(headless=True) # Atur ke False untuk melihat jendela browser

    # Konfigurasi pengaturan spesifik run (misalnya, bypass cache)
    # CacheMode.ENABLED (default), CacheMode.DISABLED, CacheMode.BYPASS
    run_conf = CrawlerRunConfig(cache_mode=CacheMode.BYPASS)

    async with AsyncWebCrawler(config=browser_conf) as crawler:
        result = await crawler.arun(
            url="https://crawl4ai.com/", # Crawl situs resmi
            config=run_conf # Terapkan konfigurasi run
        )
        if result and result.success:
            print("Crawl Berhasil!")
            print(f"Jumlah Kata Fit Markdown: {result.markdown.word_count}")
            print(f"URL yang Dicrawl: {result.url}")
        else:
            print(f"Crawl Gagal: {result.error_message}")

if __name__ == "__main__":
    asyncio.run(run_basic_crawl())

Konsep Utama Crawl4AI:

  • AsyncWebCrawler: Kelas utama untuk memulai crawl. Menggunakan async with memastikan browser dikelola dengan benar.
  • arun(url, config=None): Metode asinkron inti untuk mencrawl satu URL.
  • BrowserConfig: Mengontrol pengaturan tingkat browser (headless, user agent, proxies). Diteruskan saat inisialisasi AsyncWebCrawler.
  • CrawlerRunConfig: Mengontrol pengaturan untuk pekerjaan crawl spesifik (caching, strategi ekstraksi, timeout, eksekusi JavaScript). Diteruskan ke metode arun.
  • CacheMode: Menentukan bagaimana Crawl4AI berinteraksi dengan cache-nya (ENABLED, DISABLED, BYPASS). BYPASS berguna untuk memastikan data segar selama pengembangan.

Bagaimana Objek CrawlResult Crawl4AI Bekerja?

Setiap panggilan arun atau arun_many yang berhasil mengembalikan satu atau lebih objek CrawlResult, yang merangkum semua informasi yang dikumpulkan selama crawl.

Objek CrawlResult berisi berbagai atribut, termasuk:

  • url: URL akhir yang dicrawl (setelah pengalihan).
  • success: Boolean yang menunjukkan apakah crawl berhasil.
  • error_message: Berisi detail kesalahan jika success adalah False.
  • status_code: Kode status HTTP dari respons.
  • markdown: Objek yang berisi versi Markdown (raw_markdown, fit_markdown, word_count).
  • html: Konten HTML mentah dari halaman.
  • text: Konten teks biasa yang diekstraksi dari halaman.
  • extracted_content: Menyimpan hasil dari **strategi ekstraksi** yang dikonfigurasi (misalnya, string JSON).
  • links: Daftar tautan yang ditemukan di halaman (internal, external).
  • media: Informasi tentang media yang diekstraksi (gambar, tabel, dll.).
  • metadata: Metadata halaman (judul, deskripsi, dll.).
  • cookies: Cookies browser setelah crawl.
  • screenshot_path: Path ke screenshot jika diambil.
  • network_log_path: Path ke file HAR jaringan jika ditangkap.
  • console_log_path: Path ke file log konsol jika ditangkap.

Memeriksa objek ini adalah kunci untuk mengakses data spesifik yang Anda butuhkan dari crawl Crawl4AI.


Cara Menghasilkan Markdown Siap AI dengan Crawl4AI

Kekuatan inti Crawl4AI adalah kemampuannya untuk menghasilkan **Markdown** bersih yang cocok untuk **LLM**.

Atribut result.markdown berisi:

  • result.markdown.raw_markdown: Konversi langsung, tanpa filter dari area konten utama halaman ke Markdown.
  • result.markdown.fit_markdown: Versi Markdown yang *difilter*. Ini seringkali yang paling berguna untuk LLM, karena Crawl4AI menerapkan **filter heuristik** (seperti PruningContentFilter atau BM25ContentFilter) untuk menghapus kekacauan web umum (menu, iklan, footer, sidebar).
  • result.markdown.word_count: Jumlah kata dari fit_markdown.

Anda dapat menyesuaikan proses pemfilteran di Crawl4AI:

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode
# Import strategi spesifik untuk kustomisasi
from crawl4ai.content_filter_strategy import PruningContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator

async def run_custom_markdown_crawl():
    print("\n--- Menjalankan Crawl dengan Pemfilteran Markdown Kustom ---")

    # Konfigurasi generator Markdown dengan filter konten spesifik
    # PruningContentFilter menghapus elemen berdasarkan ambang batas jumlah kata
    markdown_generator_with_filter = DefaultMarkdownGenerator(
        content_filter=PruningContentFilter(
            threshold=0.48, # Sesuaikan ambang batas (0 hingga 1) untuk keketatan
            threshold_type="fixed" # 'fixed' atau 'relative'
            )
    )

    # Terapkan generator ini dalam konfigurasi run
    run_conf = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        markdown_generator=markdown_generator_with_filter
    )

    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(
            url="https://www.nbcnews.com/business", # Situs berita seringkali memiliki kekacauan
            config=run_conf
        )
        if result and result.success:
            print("Crawl Berhasil!")
            print(f"Panjang Raw Markdown: {len(result.markdown.raw_markdown)}")
            print(f"Panjang Fit Markdown: {len(result.markdown.fit_markdown)}") # Biasanya lebih pendek
            # Bandingkan raw_markdown dan fit_markdown untuk melihat efek filter
        else:
            print(f"Crawl Gagal: {result.error_message}")

if __name__ == "__main__":
    asyncio.run(run_custom_markdown_crawl())

Dengan menyetel content_filter di dalam markdown_generator, Anda mengontrol seberapa agresif Crawl4AI membersihkan konten sebelum menghasilkan fit_markdown.


Cara Menggunakan Deep Crawling Crawl4AI

Crawl4AI tidak terbatas pada satu halaman. Ini dapat melakukan **deep crawls**, menavigasi melalui situs web dengan mengikuti tautan.

Gunakan metode adeep_crawl (atau flag --deep-crawl dari CLI crwl):

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode

async def run_deep_crawl():
    print("\n--- Menjalankan Deep Crawl ---")
    # Konfigurasi dapat diterapkan secara global atau per-run seperti biasa
    run_conf = CrawlerRunConfig(cache_mode=CacheMode.ENABLED)

    async with AsyncWebCrawler() as crawler:
        # adeep_crawl mengembalikan generator asinkron, menghasilkan hasil saat halaman selesai
        crawl_generator = await crawler.adeep_crawl(
            start_url="https://docs.crawl4ai.com/", # Titik awal
            strategy="bfs", # 'bfs' (Breadth-First), 'dfs' (Depth-First), 'bestfirst'
            max_depth=2,    # Batasi seberapa dalam tautan diikuti
            max_pages=10,   # Batasi total jumlah halaman yang dicrawl
            config=run_conf
        )

        # Proses hasil saat mereka masuk
        pages_crawled = 0
        async for result in crawl_generator:
            if result.success:
                print(f"[OK] Dicrawl: {result.url} (Kedalaman: {result.depth}, Panjang Fit Markdown: {len(result.markdown.fit_markdown)})")
                pages_crawled += 1
            else:
                print(f"[GAGAL] URL: {result.url}, Kesalahan: {result.error_message}")

        print(f"\nDeep crawl selesai. Total halaman yang berhasil dicrawl: {pages_crawled}")

if __name__ == "__main__":
    asyncio.run(run_deep_crawl())

Parameter Deep Crawl Crawl4AI:

  • start_url: URL awal untuk memulai crawling.
  • strategy: Cara menemukan dan memprioritaskan tautan (bfs, dfs, bestfirst).
  • max_depth: Jarak tautan maksimum dari start_url.
  • max_pages: Jumlah total halaman maksimum yang akan dicrawl dalam pekerjaan ini.
  • include_patterns, exclude_patterns: Gunakan pola regex untuk memfilter URL mana yang diikuti.

Cara Menangani Konten Dinamis dan Interaksi dengan Crawl4AI

Situs web modern sangat bergantung pada **JavaScript** untuk memuat konten. Crawl4AI menangani ini melalui kemampuan **Playwright**.

Anda dapat mengeksekusi JavaScript arbitrer atau menunggu kondisi spesifik menggunakan CrawlerRunConfig:

import asyncio
import json
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy # Contoh

async def crawl_dynamic_page():
    print("\n--- Mencrawl Halaman Dinamis dengan Interaksi JS ---")

    # Contoh skema untuk ekstraksi CSS (sesuaikan dengan situs target)
    schema = { "items": { "selector": "div.product-item", "type": "list", "fields": { "title": "h2", "price": ".price" } } }
    css_extractor = JsonCssExtractionStrategy(schema)

    # JavaScript untuk dieksekusi di halaman (misalnya, klik tombol 'Load More')
    # Catatan: Selector perlu sesuai dengan situs web target
    js_to_run = """
    (async () => {
        const loadMoreButton = document.querySelector('button#load-more');
        if (loadMoreButton) {
            console.log('Clicking load more button...');
            loadMoreButton.click();
            // Tunggu sebentar agar konten berpotensi dimuat setelah diklik
            await new Promise(resolve => setTimeout(resolve, 2000));
            console.log('Waited after click.');
        } else {
            console.log('Load more button not found.');
        }
    })();
    """

    run_conf = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        js_code=[js_to_run], # Daftar cuplikan JS untuk dieksekusi
        wait_for_timeout=3000, # Tunggu 3 detik setelah pemuatan awal DAN setelah eksekusi JS
        # wait_for_selector="div.newly-loaded-content", # Atau tunggu elemen spesifik
        extraction_strategy=css_extractor, # Ekstrak data setelah JS berjalan
        output_formats=['markdown', 'extracted_content']
    )

    # Pastikan JS diaktifkan di BrowserConfig (ini defaultnya)
    browser_conf = BrowserConfig(headless=True, java_script_enabled=True)

    async with AsyncWebCrawler(config=browser_conf) as crawler:
        result = await crawler.arun(
            url="URL_HALAMAN_DINAMIS_DI_SINI", # Ganti dengan URL sebenarnya
            config=run_conf
        )

        if result and result.success:
            print("Crawl halaman dinamis berhasil!")
            print(f"Panjang Fit Markdown: {len(result.markdown.fit_markdown)}")
            if result.extracted_content:
                try:
                    extracted_data = json.loads(result.extracted_content)
                    print(f"Pratinjau Konten yang Diekstraksi: {json.dumps(extracted_data, indent=2)[:500]}...")
                except json.JSONDecodeError:
                    print(f"Konten yang Diekstraksi (non-JSON): {result.extracted_content[:500]}...")
        else:
            print(f"Crawl Gagal: {result.error_message}")


if __name__ == "__main__":
    # Ganti dengan URL sebenarnya yang memuat konten secara dinamis untuk pengujian
    # asyncio.run(crawl_dynamic_page())
    print("Silakan ganti 'URL_HALAMAN_DINAMIS_DI_SINI' dan hapus komentar baris di atas untuk menjalankan contoh dinamis.")

Parameter Interaksi Utama Crawl4AI di CrawlerRunConfig:

  • js_code: Daftar string JavaScript untuk dieksekusi dalam konteks halaman.
  • wait_for_timeout: Milidetik untuk menunggu setelah halaman dimuat dan setelah eksekusi JS.
  • wait_for_selector: Selector CSS untuk ditunggu sebelum menganggap halaman dimuat/interaksi selesai.
  • page_interaction_hooks: Hook yang lebih canggih untuk interaksi kompleks.

Kesimpulan Crawl4AI

Crawl4AI menyediakan solusi komprehensif, Pythonic, dan berpusat pada AI untuk web crawling dan scraping. Fokusnya pada pembuatan Markdown yang bersih, ekstraksi data terstruktur yang fleksibel (berbasis CSS dan LLM), penanganan konten dinamis yang kuat, dan operasi asinkron yang efisien menjadikannya pilihan yang sangat baik untuk proyek yang melibatkan RAG, fine-tuning LLM, atau tugas apa pun yang membutuhkan informasi terstruktur dari web. Dengan memanfaatkan API-nya yang jelas, opsi konfigurasi (BrowserConfig, CrawlerRunConfig), dan objek CrawlResult yang terperinci, pengembang dapat membangun alur kerja pengumpulan data yang canggih dan efisien.

💡
Ingin alat Pengujian API yang hebat yang menghasilkan Dokumentasi API yang indah?

Ingin platform All-in-One yang terintegrasi untuk Tim Pengembang Anda agar dapat bekerja sama dengan produktivitas maksimum?

Apidog memenuhi semua kebutuhan Anda, dan menggantikan Postman dengan harga yang jauh lebih terjangkau!
button