Crawl4AI menyederhanakan perayapan web asinkron dan ekstraksi data, sehingga dapat diakses oleh model bahasa besar (LLM) dan aplikasi AI. ?
CrawlResult
.srcset
, picture
, dan responsif.file://
jalur dan HTML mentah ( raw:
) secara langsung.Bermain-main dengan ini
Kunjungi Situs Web Dokumentasi kami
Crawl4AI menawarkan opsi instalasi yang fleksibel untuk disesuaikan dengan berbagai kasus penggunaan. Anda dapat menginstalnya sebagai paket Python atau menggunakan Docker.
Pilih opsi instalasi yang paling sesuai dengan kebutuhan Anda:
Untuk tugas perayapan dan pengikisan web dasar:
pip install crawl4ai
Secara default, ini akan menginstal versi Crawl4AI yang tidak sinkron, menggunakan Playwright untuk perayapan web.
Catatan: Saat Anda menginstal Crawl4AI, skrip pengaturan akan secara otomatis menginstal dan mengatur Playwright. Namun, jika Anda menemukan kesalahan terkait Penulis Drama, Anda dapat menginstalnya secara manual menggunakan salah satu metode berikut:
Melalui baris perintah:
playwright install
Jika cara di atas tidak berhasil, coba perintah yang lebih spesifik ini:
python -m playwright install chromium
Cara kedua ini terbukti lebih dapat diandalkan dalam beberapa kasus.
Jika Anda memerlukan versi sinkron menggunakan Selenium:
pip install crawl4ai[sync]
Bagi kontributor yang berencana mengubah kode sumber:
git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e .
Terapkan instance Crawl4AI Anda sendiri dengan satu klik:
Spesifikasi yang disarankan : minimal RAM 4GB. Pilih "profesional-xs" atau lebih tinggi saat menerapkan untuk operasi yang stabil.
Penerapannya akan:
Crawl4AI tersedia sebagai image Docker untuk kemudahan penerapan. Anda dapat menarik langsung dari Docker Hub (disarankan) atau membangun dari repositori.
# Pull and run from Docker Hub (choose one):
docker pull unclecode/crawl4ai:basic # Basic crawling features
docker pull unclecode/crawl4ai:all # Full installation (ML, LLM support)
docker pull unclecode/crawl4ai:gpu # GPU-enabled version
# Run the container
docker run -p 11235:11235 unclecode/crawl4ai:basic # Replace 'basic' with your chosen version
# In case you want to set platform to arm64
docker run --platform linux/arm64 -p 11235:11235 unclecode/crawl4ai:basic
# In case to allocate more shared memory for the container
docker run --shm-size=2gb -p 11235:11235 unclecode/crawl4ai:basic
# Clone the repository
git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
# Build the image
docker build -t crawl4ai:local
--build-arg INSTALL_TYPE=basic # Options: basic, all
.
# In case you want to set platform to arm64
docker build -t crawl4ai:local
--build-arg INSTALL_TYPE=basic # Options: basic, all
--platform linux/arm64
.
# Run your local build
docker run -p 11235:11235 crawl4ai:local
Tes cepat (berfungsi untuk kedua opsi):
import requests
# Submit a crawl job
response = requests . post (
"http://localhost:11235/crawl" ,
json = { "urls" : "https://example.com" , "priority" : 10 }
)
task_id = response . json ()[ "task_id" ]
# Get results
result = requests . get ( f"http://localhost:11235/task/ { task_id } " )
Untuk konfigurasi tingkat lanjut, variabel lingkungan, dan contoh penggunaan, lihat Panduan Penerapan Docker kami.
import asyncio
from crawl4ai import AsyncWebCrawler
async def main ():
async with AsyncWebCrawler ( verbose = True ) as crawler :
result = await crawler . arun ( url = "https://www.nbcnews.com/business" )
print ( result . markdown )
if __name__ == "__main__" :
asyncio . run ( main ())
import asyncio
from crawl4ai import AsyncWebCrawler
async def main ():
async with AsyncWebCrawler ( verbose = True ) as crawler :
js_code = [ "const loadMoreButton = Array.from(document.querySelectorAll('button')).find(button => button.textContent.includes('Load More')); loadMoreButton && loadMoreButton.click();" ]
result = await crawler . arun (
url = "https://www.nbcnews.com/business" ,
js_code = js_code ,
css_selector = ".wide-tease-item__description" ,
bypass_cache = True
)
print ( result . extracted_content )
if __name__ == "__main__" :
asyncio . run ( main ())
import asyncio
from crawl4ai import AsyncWebCrawler
async def main ():
async with AsyncWebCrawler ( verbose = True , proxy = "http://127.0.0.1:7890" ) as crawler :
result = await crawler . arun (
url = "https://www.nbcnews.com/business" ,
bypass_cache = True
)
print ( result . markdown )
if __name__ == "__main__" :
asyncio . run ( main ())
JsonCssExtractionStrategy
memungkinkan ekstraksi data terstruktur secara tepat dari halaman web menggunakan pemilih CSS.
import asyncio
import json
from crawl4ai import AsyncWebCrawler
from crawl4ai . extraction_strategy import JsonCssExtractionStrategy
async def extract_news_teasers ():
schema = {
"name" : "News Teaser Extractor" ,
"baseSelector" : ".wide-tease-item__wrapper" ,
"fields" : [
{
"name" : "category" ,
"selector" : ".unibrow span[data-testid='unibrow-text']" ,
"type" : "text" ,
},
{
"name" : "headline" ,
"selector" : ".wide-tease-item__headline" ,
"type" : "text" ,
},
{
"name" : "summary" ,
"selector" : ".wide-tease-item__description" ,
"type" : "text" ,
},
{
"name" : "time" ,
"selector" : "[data-testid='wide-tease-date']" ,
"type" : "text" ,
},
{
"name" : "image" ,
"type" : "nested" ,
"selector" : "picture.teasePicture img" ,
"fields" : [
{ "name" : "src" , "type" : "attribute" , "attribute" : "src" },
{ "name" : "alt" , "type" : "attribute" , "attribute" : "alt" },
],
},
{
"name" : "link" ,
"selector" : "a[href]" ,
"type" : "attribute" ,
"attribute" : "href" ,
},
],
}
extraction_strategy = JsonCssExtractionStrategy ( schema , verbose = True )
async with AsyncWebCrawler ( verbose = True ) as crawler :
result = await crawler . arun (
url = "https://www.nbcnews.com/business" ,
extraction_strategy = extraction_strategy ,
bypass_cache = True ,
)
assert result . success , "Failed to crawl the page"
news_teasers = json . loads ( result . extracted_content )
print ( f"Successfully extracted { len ( news_teasers ) } news teasers" )
print ( json . dumps ( news_teasers [ 0 ], indent = 2 ))
if __name__ == "__main__" :
asyncio . run ( extract_news_teasers ())
Untuk contoh penggunaan lebih lanjut, lihat bagian Contoh kami di dokumentasi.
import os
import asyncio
from crawl4ai import AsyncWebCrawler
from crawl4ai . extraction_strategy import LLMExtractionStrategy
from pydantic import BaseModel , Field
class OpenAIModelFee ( BaseModel ):
model_name : str = Field (..., description = "Name of the OpenAI model." )
input_fee : str = Field (..., description = "Fee for input token for the OpenAI model." )
output_fee : str = Field (..., description = "Fee for output token for the OpenAI model." )
async def main ():
async with AsyncWebCrawler ( verbose = True ) as crawler :
result = await crawler . arun (
url = 'https://openai.com/api/pricing/' ,
word_count_threshold = 1 ,
extraction_strategy = LLMExtractionStrategy (
provider = "openai/gpt-4o" , api_token = os . getenv ( 'OPENAI_API_KEY' ),
schema = OpenAIModelFee . schema (),
extraction_type = "schema" ,
instruction = """From the crawled content, extract all mentioned model names along with their fees for input and output tokens.
Do not miss any models in the entire content. One extracted model JSON format should look like this:
{"model_name": "GPT-4", "input_fee": "US$10.00 / 1M tokens", "output_fee": "US$30.00 / 1M tokens"}."""
),
bypass_cache = True ,
)
print ( result . extracted_content )
if __name__ == "__main__" :
asyncio . run ( main ())
Crawl4AI unggul dalam menangani skenario kompleks, seperti merayapi beberapa halaman dengan konten dinamis yang dimuat melalui JavaScript. Berikut ini contoh perayapan komitmen GitHub di beberapa halaman:
import asyncio
import re
from bs4 import BeautifulSoup
from crawl4ai import AsyncWebCrawler
async def crawl_typescript_commits ():
first_commit = ""
async def on_execution_started ( page ):
nonlocal first_commit
try :
while True :
await page . wait_for_selector ( 'li.Box-sc-g0xbh4-0 h4' )
commit = await page . query_selector ( 'li.Box-sc-g0xbh4-0 h4' )
commit = await commit . evaluate ( '(element) => element.textContent' )
commit = re . sub ( r's+' , '' , commit )
if commit and commit != first_commit :
first_commit = commit
break
await asyncio . sleep ( 0.5 )
except Exception as e :
print ( f"Warning: New content didn't appear after JavaScript execution: { e } " )
async with AsyncWebCrawler ( verbose = True ) as crawler :
crawler . crawler_strategy . set_hook ( 'on_execution_started' , on_execution_started )
url = "https://github.com/microsoft/TypeScript/commits/main"
session_id = "typescript_commits_session"
all_commits = []
js_next_page = """
const button = document.querySelector('a[data-testid="pagination-next-button"]');
if (button) button.click();
"""
for page in range ( 3 ): # Crawl 3 pages
result = await crawler . arun (
url = url ,
session_id = session_id ,
css_selector = "li.Box-sc-g0xbh4-0" ,
js = js_next_page if page > 0 else None ,
bypass_cache = True ,
js_only = page > 0
)
assert result . success , f"Failed to crawl page { page + 1 } "
soup = BeautifulSoup ( result . cleaned_html , 'html.parser' )
commits = soup . select ( "li" )
all_commits . extend ( commits )
print ( f"Page { page + 1 } : Found { len ( commits ) } commits" )
await crawler . crawler_strategy . kill_session ( session_id )
print ( f"Successfully crawled { len ( all_commits ) } commits across 3 pages" )
if __name__ == "__main__" :
asyncio . run ( crawl_typescript_commits ())
Contoh ini menunjukkan kemampuan Crawl4AI untuk menangani skenario kompleks di mana konten dimuat secara asinkron. Itu merayapi beberapa halaman komitmen GitHub, mengeksekusi JavaScript untuk memuat konten baru dan menggunakan kait khusus untuk memastikan data dimuat sebelum melanjutkan.
Untuk contoh penggunaan lebih lanjut, lihat bagian Contoh kami di dokumentasi.
Crawl4AI dirancang dengan kecepatan sebagai fokus utama. Tujuan kami adalah memberikan respons secepat mungkin dengan ekstraksi data berkualitas tinggi, meminimalkan abstraksi antara data dan pengguna.
Kami telah melakukan perbandingan kecepatan antara Crawl4AI dan Firecrawl, layanan berbayar. Hasilnya menunjukkan kinerja unggul Crawl4AI:
Firecrawl:
Time taken: 7.02 seconds
Content length: 42074 characters
Images found: 49
Crawl4AI (simple crawl):
Time taken: 1.60 seconds
Content length: 18238 characters
Images found: 49
Crawl4AI (with JavaScript execution):
Time taken: 4.64 seconds
Content length: 40869 characters
Images found: 89
Seperti yang Anda lihat, Crawl4AI mengungguli Firecrawl secara signifikan:
Anda dapat menemukan kode perbandingan lengkap di repositori kami di docs/examples/crawl4ai_vs_firecrawl.py
.
Untuk dokumentasi terperinci, termasuk petunjuk instalasi, fitur lanjutan, dan referensi API, kunjungi Situs Web Dokumentasi kami.
Untuk informasi mendetail tentang rencana pengembangan dan fitur mendatang kami, lihat Peta Jalan kami.
Kami menyambut kontribusi dari komunitas sumber terbuka. Lihat pedoman kontribusi kami untuk informasi lebih lanjut.
Crawl4AI dirilis di bawah Lisensi Apache 2.0.
Untuk pertanyaan, saran, atau masukan, silakan menghubungi:
Selamat Merangkak! ?️
Misi kami adalah membuka potensi data pribadi dan perusahaan yang belum dimanfaatkan di era digital. Di dunia saat ini, individu dan organisasi menghasilkan banyak sekali jejak digital yang berharga, namun sebagian besar data tersebut masih belum dimanfaatkan sebagai aset yang sebenarnya.
Solusi sumber terbuka kami memberdayakan pengembang dan inovator untuk membangun alat untuk ekstraksi dan penataan data, sehingga meletakkan dasar bagi era baru kepemilikan data. Dengan mengubah data pribadi dan perusahaan menjadi aset terstruktur dan dapat diperdagangkan, kami menciptakan peluang bagi individu untuk memanfaatkan jejak digital mereka dan bagi organisasi untuk membuka nilai pengetahuan kolektif mereka.
Demokratisasi data ini mewakili langkah pertama menuju ekonomi data bersama, di mana kesediaan berpartisipasi dalam berbagi data mendorong kemajuan AI sekaligus memastikan manfaatnya mengalir kembali ke pembuat data. Melalui pendekatan ini, kami membangun masa depan di mana pengembangan AI didukung oleh pengetahuan asli manusia, bukan alternatif sintetis.
Untuk eksplorasi rinci tentang visi, peluang, dan jalur ke depan kami, silakan lihat pernyataan misi lengkap kami.
Untuk eksplorasi rinci tentang visi, tantangan, dan solusi kami, silakan lihat pernyataan misi lengkap kami.