Ana içeriğe geç

Crawl4AI İş Başında: Daha Akıllı Web Kazıma için Gerçek Dünya Kullanım Durumları

https://huyenchip.com/llama-police adresinde Chip Huyen, LLM modelleri etrafında oluşturulan araçlara ve depolara özel olarak odaklanarak açık kaynaklı yapay zeka ekosisteminin güncel bir analizini sunuyor.

Bu araçları keşfetmekten gerçekten keyif alıyorum ve onlarla pratik yapmaya çalışıyorum. Her hafta bir tanesini seçip nasıl çalıştığını daha iyi anlamak için küçük bir oyun projesi oluşturuyorum. Her proje bana yapay zeka ve büyük dil modelleri (LLM) hakkında yeni bir şeyler öğretiyor.

Geçen haftanın aracı Crawler4AI idi. Bunu kullanarak bir oyun projesi oluşturmak istedim ve taranacak web sitesi olarak FactBook'yi seçtim.

Size ne yaptığımı daha ayrıntılı olarak göstereyim!

Yaptığım ilk şey bir Python sanal ortamı kurmak ve aşağıdakileri kullanarak "crawler4ai"yi kurmaktı:

pip install crawl4ai

Sonra bunu çalıştırdım:

crawl4ai-setup

Bu komut, 'crawler4ai'nin bağlı olduğu gerekli Playwright tarayıcılarını yükler veya günceller.


Basit Bir Tarama Örneği

Kurulumu test etmek için temel bir tarama örneği çalıştırdım:

import asyncio
from crawl4ai import AsyncWebCrawler

async def main():
    # Create an instance of AsyncWebCrawler
    async with AsyncWebCrawler() as crawler:
        # Run the crawler on a URL
        result = await crawler.arun(url="https://crawl4ai.com")

        # Print the extracted content
        print(result.markdown)

# Run the async main function
asyncio.run(main())

CIA World Factbook'u taramak

Şimdi daha ilginç bir şeye geçelim; CIA World Factbook'u taramaya. İşte basit bir derin tarama örneği:

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig
from crawl4ai.deep_crawling import BFSDeepCrawlStrategy
from crawl4ai.content_scraping_strategy import LXMLWebScrapingStrategy

async def main():
    config = CrawlerRunConfig(
        deep_crawl_strategy=BFSDeepCrawlStrategy(
            max_depth=2,
            include_external=False
        ),
        scraping_strategy=LXMLWebScrapingStrategy(),
        verbose=True
    )

    async with AsyncWebCrawler() as crawler:
        results = await crawler.arun("https://www.cia.gov/the-world-factbook/", config=config)

        print(f"Crawled {len(results)} pages in total")

        for result in results[:3]:
            print(f"URL: {result.url}")
            print(f"Depth: {result.metadata.get('depth', 0)}")

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

Tarama Sonuçlarını Diske Kaydetme

Sonuçları kaydetmek için bir URL'den güvenli bir dosya adı oluşturan bir yardımcı işlev yazdım:

import re
from urllib.parse import urlparse

def filename_from_url(url, extension=""):
    parsed = urlparse(url)
    base = parsed.netloc + parsed.path
    base = base.rstrip('/')
    base = re.sub(r'[<>:"/\\|?*]', '_', base)
    if parsed.query or parsed.fragment:
        extra = parsed.query + parsed.fragment
        extra = re.sub(r'[<>:"/\\|?*]', '_', extra)
        base += "_" + extra
    if extension and not base.endswith(extension):
        base += extension if extension.startswith('.') else '.' + extension
    return base

Filtre Ekleme ve Taramada İnce Ayar Yapma

Yalnızca alakalı sayfalara odaklanmak ve gereksiz sayfaları hariç tutmak için tarama yapılandırmasında filtreler kullandım:

  • İstisna edilen etiketler: 'form', header'`,footer', ``nav', `img'
  • 'URLPatternFilter' kullanarak URL filtreleme
  • 'ContentTypeFilter' aracılığıyla MIME türü filtreleme

Komut Dosyasının Son Sürümü

İşte World Factbook'u tarayan, sayfaları filtreleyen ve sonuçları Markdown dosyaları olarak kaydeden tam sürüm:

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig
from crawl4ai.deep_crawling import BFSDeepCrawlStrategy, FilterChain, URLPatternFilter, ContentTypeFilter
from crawl4ai.content_scraping_strategy import LXMLWebScrapingStrategy

import os
import re
from urllib.parse import urlparse

def filename_from_url(url, extension=""):
    parsed = urlparse(url)
    # Combine netloc and path
    base = parsed.netloc + parsed.path
    # Remove trailing slashes and unsafe characters
    base = base.rstrip('/')
    base = re.sub(r'[<>:"/\\|?*]', '_', base)  # Windows-safe characters
    # Add query or fragment hash if needed
    if parsed.query or parsed.fragment:
        extra = parsed.query + parsed.fragment
        extra = re.sub(r'[<>:"/\\|?*]', '_', extra)
        base += "_" + extra
    # Add optional file extension
    if extension and not base.endswith(extension):
        base += extension if extension.startswith('.') else '.' + extension
    return base

filter_chain = FilterChain(
    [
        URLPatternFilter(patterns=["*the-world-factbook*"]),
        URLPatternFilter(patterns=["*archives*"],reverse=True),
        ContentTypeFilter(allowed_types=["text/html"])
    ]
)

async def main():
    # Configure a 2-level deep crawl
    config = CrawlerRunConfig(
        deep_crawl_strategy=BFSDeepCrawlStrategy(
            max_depth=200000, 
            include_external=False,
            filter_chain=filter_chain
        ),
        scraping_strategy=LXMLWebScrapingStrategy(),
        verbose=True,
        # Tag exclusions
        excluded_tags=['form', 'header', 'footer', 'nav', 'img'],
        # Link filtering
        exclude_external_links=True,    
        exclude_social_media_links=True,
        exclude_external_images=True,
        wait_for_images=False,
    )
    async with AsyncWebCrawler() as crawler:
        results = await crawler.arun("https://www.cia.gov/the-world-factbook/", config=config)
        print(f"Crawled {len(results)} pages in total")
        # Access individual results
        for result in results:
            filepath = filename_from_url(result.url,"md")
            print(f"URL: {result.url}")
            print(f"Depth: {result.metadata.get('depth', 0)}")
            with open(filepath, "w", encoding="utf-8") as f:
                f.write(result.markdown)

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

LLM projeleriyle ilgili daha fazla bilgi edinmek için https://huyenchip.com/2024/03/14/ai-oss.html adresine bakın.