راهنمای کدنویسی برای استخراج ناهمزمان داده‌های وب با استفاده از Crawl4AI: یک ابزار منبع باز وب‌کاوی و خراش‌دهی طراحی‌شده برای گردش‌کارهای LLM

در این آموزش، نحوه استفاده از Crawl4AI، یک ابزار مدرن وب‌کاوی مبتنی بر پایتون، برای استخراج داده‌های ساختاریافته از صفحات وب به طور مستقیم در گوگل کولب را نشان می‌دهیم. با بهره‌گیری از قدرت asyncio برای ورودی/خروجی ناهمزمان، httpx برای درخواست‌های HTTP و AsyncHTTPCrawlerStrategy داخلی Crawl4AI، سربار مرورگرهای بدون رابط کاربری را دور می‌زنیم در حالی که هنوز HTML پیچیده را از طریق JsonCssExtractionStrategy تجزیه می‌کنیم. تنها با چند خط کد، وابستگی‌ها (crawl4ai، httpx) را نصب می‌کنید، HTTPCrawlerConfig را برای درخواست فقط gzip/deflate (جلوگیری از مشکلات Brotli) پیکربندی می‌کنید، طرح CSS به JSON خود را تعریف می‌کنید و خزیدن را از طریق AsyncWebCrawler و CrawlerRunConfig هماهنگ می‌کنید. در نهایت، داده‌های JSON استخراج‌شده برای تجزیه و تحلیل یا خروجی فوری در پانداها بارگذاری می‌شوند.

آنچه Crawl4AI را متمایز می‌کند API یکپارچه آن است که به طور یکپارچه بین استراتژی‌های مبتنی بر مرورگر (Playwright) و فقط HTTP جابجا می‌شود، قلاب‌های قوی مدیریت خطا و طرح‌های استخراج اعلانی آن است. برخلاف گردش‌کارهای سنتی مرورگر بدون رابط کاربری، Crawl4AI به شما امکان می‌دهد سبک‌ترین و کارآمدترین باطن را انتخاب کنید، که آن را برای خطوط لوله داده مقیاس‌پذیر، ETL در لحظه در نوت‌بوک‌ها یا تغذیه LLM‌ها و ابزارهای تجزیه و تحلیل با خروجی‌های JSON/CSV تمیز ایده آل می‌کند.

!pip install -U crawl4ai httpx

ابتدا، Crawl4AI، چارچوب اصلی خزیدن ناهمزمان، را در کنار HTTPX نصب (یا ارتقا) می‌کنیم. این کلاینت HTTP با کارایی بالا تمام بلوک‌های ساختمانی مورد نیاز ما را برای خراش‌دهی وب ناهمزمان و سبک وزن به طور مستقیم در Colab فراهم می‌کند.

import asyncio, json, pandas as pd
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, HTTPCrawlerConfig
from crawl4ai.async_crawler_strategy import AsyncHTTPCrawlerStrategy
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy

ما ماژول‌های اصلی async و مدیریت داده پایتون را وارد می‌کنیم، asyncio برای همزمانی، json برای تجزیه و pandas برای ذخیره‌سازی جدولی، در کنار ملزومات Crawl4AI: AsyncWebCrawler برای هدایت خزیدن، CrawlerRunConfig و HTTPCrawlerConfig برای پیکربندی استخراج و تنظیمات HTTP، AsyncHTTPCrawlerStrategy برای باطن HTTP بدون مرورگر و JsonCssExtractionStrategy برای نگاشت انتخابگرهای CSS به JSON ساختاریافته.

http_cfg = HTTPCrawlerConfig(
    method="GET",
    headers={
        "User-Agent":      "crawl4ai-bot/1.0",
        "Accept-Encoding": "gzip, deflate"
    },
    follow_redirects=True,
    verify_ssl=True
)
crawler_strategy = AsyncHTTPCrawlerStrategy(browser_config=http_cfg)

در اینجا، یک HTTPCrawlerConfig را برای تعریف رفتار خزنده HTTP خود实例化 می‌کنیم، با استفاده از یک درخواست GET با یک User-Agent سفارشی، فقط رمزگذاری gzip/deflate، تغییر مسیرهای خودکار و تأیید SSL. سپس آن را به AsyncHTTPCrawlerStrategy متصل می‌کنیم، که به Crawl4AI اجازه می‌دهد خزیدن را از طریق تماس‌های HTTP خالص و نه یک مرورگر کامل هدایت کند.

schema = {
    "name": "Quotes",
    "baseSelector": "div.quote",
    "fields": [
        {"name": "quote",  "selector": "span.text",      "type": "text"},
        {"name": "author", "selector": "small.author",   "type": "text"},
        {"name": "tags",   "selector": "div.tags a.tag", "type": "text"}
    ]
}
extraction_strategy = JsonCssExtractionStrategy(schema, verbose=False)
run_cfg = CrawlerRunConfig(extraction_strategy=extraction_strategy)

ما یک طرح استخراج JSON-CSS را تعریف می‌کنیم که هر بلوک نقل قول (div.quote) و عناصر فرزند آن (span.text، small.author، div.tags a.tag) را هدف قرار می‌دهد، سپس یک JsonCssExtractionStrategy را با آن طرح اولیه مقداردهی اولیه می‌کند و آن را در یک CrawlerRunConfig می‌پیچد تا Crawl4AI دقیقاً بداند چه داده‌های ساختاریافته‌ای را در هر درخواست بکشد.

async def crawl_quotes_http(max_pages=5):
    all_items = []
    async with AsyncWebCrawler(crawler_strategy=crawler_strategy) as crawler:
        for p in range(1, max_pages+1):
            url = f"https://quotes.toscrape.com/page/{p}/"
            try:
                res = await crawler.arun(url=url, config=run_cfg)
            except Exception as e:
                print(f"❌ Page {p} failed outright: {e}")
                continue

            if not res.extracted_content:
                print(f"❌ Page {p} returned no content, skipping")
                continue

            try:
                items = json.loads(res.extracted_content)
            except Exception as e:
                print(f"❌ Page {p} JSON-parse error: {e}")
                continue

            print(f"✅ Page {p}: {len(items)} quotes")
            all_items.extend(items)

    return pd.DataFrame(all_items)

اکنون، این تابع ناهمزمان خزیدن فقط HTTP را هماهنگ می‌کند: یک AsyncWebCrawler را با AsyncHTTPCrawlerStrategy ما می‌چرخاند، از طریق هر URL صفحه تکرار می‌شود و با خیال راحت منتظر crawler.arun() می‌ماند، هرگونه درخواست یا خطای تجزیه JSON را مدیریت می‌کند و رکوردهای نقل قول استخراج شده را در یک DataFrame پانداها برای تجزیه و تحلیل پایین دستی جمع آوری می‌کند.

df = asyncio.get_event_loop().run_until_complete(crawl_quotes_http(max_pages=3))
df.head()

در نهایت، ما coroutine crawl_quotes_http را در حلقه asyncio موجود Colab شروع می‌کنیم، سه صفحه از نقل قول‌ها را واکشی می‌کنیم و سپس چند ردیف اول DataFrame پانداها را نمایش می‌دهیم تا تأیید کنیم که خزنده ما داده‌های ساختاریافته را طبق انتظار برگردانده است.

در نتیجه، با ترکیب محیط پیکربندی صفر گوگل کولب با اکوسیستم ناهمزمان پایتون و استراتژی‌های خزیدن انعطاف‌پذیر Crawl4AI، اکنون یک خط لوله کاملاً خودکار برای خراش‌دهی و ساختاربندی داده‌های وب در عرض چند دقیقه ایجاد کرده‌ایم. چه نیاز داشته باشید یک مجموعه داده سریع از نقل قول‌ها ایجاد کنید، یک آرشیو مقالات خبری قابل تازه‌سازی بسازید یا یک گردش‌کار RAG را نیرو دهید، ترکیب Crawl4AI از httpx، asyncio، JsonCssExtractionStrategy و AsyncHTTPCrawlerStrategy هم سادگی و هم مقیاس پذیری را ارائه می‌دهد. فراتر از خزیدن HTTP خالص، می‌توانید فوراً بدون بازنویسی منطق استخراج خود، به اتوماسیون مرورگر مبتنی بر Playwright تغییر دهید، که نشان می‌دهد چرا Crawl4AI به عنوان چارچوب مرجع برای استخراج داده‌های وب مدرن و آماده تولید برجسته است.


اینجا نوت بوک Colab است. همچنین، فراموش نکنید که ما را در توییتر دنبال کنید و به کانال تلگرام ما و گروه لینکدین ما بپیوندید. فراموش نکنید که به ساب‌ردیت ۹۰ هزار+ ML ما بپیوندید.