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.