Jawaban Cepat: Pada tahun 2026, python web scraping projects modern untuk konsumsi LLM membutuhkan pipeline dua tahap: rendering headless asinkron berkecepatan tinggi (Playwright atau Crawl4AI) yang dikombinasikan dengan pembersihan derau DOM secara algoritmik (menghapus SVG, skrip, dan navigasi). Untuk data terstruktur, gunakan skema Pydantic via Instructor guna menghemat biaya token hingga 75-88%.
1. Pendahuluan: Web Scraping di Era Frontier LLM dan AI Agents
AI Agent otonom dan arsitektur RAG sangat bergantung pada konteks web yang akurat dan real-time. Meskipun model terdepan seperti Claude 3.7 Sonnet, DeepSeek V3/R1, dan GPT-4o memiliki context window hingga 2 juta token, memasukkan HTML mentah langsung ke dalam prompt model adalah pemborosan biaya komputasi yang sangat besar.
Dahulu, untuk scrape website python, solusi standarnya adalah requests dengan BeautifulSoup atau spider Scrapy. Namun, web modern saat ini didominasi oleh Single Page Applications (SPA) dinamis berbasis React dan Next.js yang dilindungi oleh firewall WAF canggih seperti Cloudflare Turnstile, DataDome, dan Akamai.
Tujuan scraping juga telah bergeser:
- Scraping Konvensional (2015–2023): Mengekstrak data ke kolom database relasional menggunakan selektor XPath/CSS.
- Scraping untuk AI & LLM (2026): Menghilangkan kode tidak berguna, mempertahankan struktur Markdown semantik, dan mengekstrak JSON tervalidasi via skema Pydantic.
2. Perbandingan Framework: BeautifulSoup vs Scrapy vs Playwright vs Crawl4AI
| Metrik Evaluasi | BeautifulSoup4 + Requests | Scrapy (Twisted/AsyncIO) | Raw Playwright (Async Python) | Crawl4AI (v0.9.x+) |
|---|---|---|---|---|
| Kasus Utama | Skrip ringan & HTML statis | Crawling skala besar terdistribusi | SPA dinamis & interaksi JS kompleks | AI Agents, RAG & ekstraksi LLM |
| Eksekusi JavaScript | Tidak ada | Tidak ada (butuh Scrapy-Playwright) | Mesin penuh Chromium & WebKit | Chromium yang dioptimalkan untuk LLM |
| Throughput | ~15-25 req/detik per worker | ~150-300 req/detik per spider | ~5-12 hal/detik (16GB RAM) | ~25-45 hal/detik (daur ulang konteks) |
| Konsumsi Memori | Sangat rendah (~40MB) | Rendah (~120MB) | Tinggi (150-350MB per konteks) | Sedang (~80-140MB per tab) |
| Konversi Markdown | Butuh pustaka eksternal | Pipeline kustom | Integrasi manual | Markdown bawaan yang ramah LLM |
| Pembersihan DOM | Filter kode manual | Selektor manual | Skrip evaluasi CDP manual | Fitur bawaan PruningContentFilter |
| Anti-Bot Evasion | Sangat lemah (hanya UA) | Middleware proxy | Sangat baik (playwright-stealth) |
Stealth bawaan & emulasi TLS |
| Dukungan Pydantic | Tidak ada | ItemLoaders | Tidak ada | Mesin ekstraksi skema Pydantic bawaan |
3. Ekonomi Scraping untuk LLM: Pembersihan DOM dan Penghematan Token
HTML mentah terdiri dari 85% hingga 95% kode yang tidak berguna seperti tag CSS, script analitik, dan navigasi menu.
Simulasi penghematan biaya pada 50.000 halaman per hari (GPT-4o @ $2.50 / 1M token)
- Token harian HTML mentah: 50.000 × 55.000 = 2,75 miliar token
- Token harian Markdown bersih: 50.000 × 4.200 = 210 juta token
- Penghematan harian: (2.750 - 210) × $2.50 = $6.350,00 / hari
- Penghematan bulanan: $190.500,00 / bulan
4. Implementasi Python: Async Playwright dan Selectolax
# clean_scraper.py
import asyncio
from playwright.async_api import async_playwright
from selectolax.parser import HTMLParser
import markdownify
async def scrape_clean_markdown(url: str) -> str:
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True, args=["--no-sandbox"])
page = await browser.new_page()
await page.goto(url, wait_until="networkidle", timeout=30000)
raw_html = await page.content()
await browser.close()
parser = HTMLParser(raw_html)
for tag in ["script", "style", "svg", "noscript", "header", "footer", "nav", "aside"]:
for node in parser.css(tag):
node.decompose()
main = parser.css_first("main, article, #content") or parser.css_first("body")
return markdownify.markdownify(main.html if main else parser.html, heading_style="ATX")
5. Ekstraksi Modern Menggunakan Crawl4AI
# crawl4ai_pipeline.py
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.content_filter_strategy import PruningContentFilter
async def run_crawl4ai(url: str) -> str:
async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
config = CrawlerRunConfig(
cache_mode=CacheMode.BYPASS,
content_filter=PruningContentFilter(threshold=0.48),
wait_until="networkidle"
)
res = await crawler.arun(url=url, config=config)
return res.markdown
6. Ekstraksi JSON Terstruktur dengan Pydantic dan Instructor
# pydantic_extractor.py
import os
from typing import List, Optional
from pydantic import BaseModel, Field
import instructor
from openai import OpenAI
class TechSpec(BaseModel):
name: str = Field(description="Nama fitur")
supported: bool = Field(description="Apakah didukung")
class ProductInfo(BaseModel):
product_name: str
price_usd: Optional[float] = None
specs: List[TechSpec]
def extract_data(clean_md: str) -> ProductInfo:
client = instructor.from_openai(OpenAI(api_key=os.environ["OPENAI_API_KEY"]))
return client.chat.completions.create(
model="gpt-4o-mini",
response_model=ProductInfo,
messages=[{"role": "user", "content": clean_md}],
temperature=0.0
)
7. Menghindari WAF dengan curl_cffi
# stealth_requester.py
from curl_cffi import requests
def fetch_stealth(url: str, proxy: str = None) -> str:
proxies = {"http": proxy, "https": proxy} if proxy else None
return requests.get(url, impersonate="chrome124", proxies=proxies, timeout=15).text
8. Perbandingan Biaya Total (Uji Coba 100.000 Halaman)
| Komponen Biaya | Raw Playwright (HTML Mentah) | Playwright + Selectolax | Mesin Crawl4AI Async | Firecrawl Cloud |
|---|---|---|---|---|
| Infrastruktur Komputasi | $48.00 | $22.00 | $16.00 | $0.00 |
| Proxy Residensial | $120.00 | $32.00 | $30.00 | Sudah Termasuk |
| Inferensi LLM (GPT-4o) | $13.750.00 | $1.050.00 | $975.00 | $825.00 |
| Total Biaya | $13.918.00 | $1.104.00 | $1.021.00 | $1.024.00 |
9. Kesimpulan & Rekomendasi Rekayasa
- Strategi Berjenjang: Gunakan
curl_cffiterlebih dahulu, dan beralih ke Crawl4AI hanya untuk SPA dinamis. - Wajib Bersihkan DOM: Jangan pernah mengirim HTML mentah; targetkan kompresi token lebih dari 80%.
- Validasi Skema Pydantic: Terapkan Instructor untuk memastikan keakuratan data secara mutlak.
- Pemisahan Pipeline: Jalankan scraping dan inferensi dalam antrean asinkron terpisah (Celery/ARQ).