Web Scraping & LLMs

Panduan Python Web Scraping & Ekstraksi Data LLM (2026)

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

  1. Strategi Berjenjang: Gunakan curl_cffi terlebih dahulu, dan beralih ke Crawl4AI hanya untuk SPA dinamis.
  2. Wajib Bersihkan DOM: Jangan pernah mengirim HTML mentah; targetkan kompresi token lebih dari 80%.
  3. Validasi Skema Pydantic: Terapkan Instructor untuk memastikan keakuratan data secara mutlak.
  4. Pemisahan Pipeline: Jalankan scraping dan inferensi dalam antrean asinkron terpisah (Celery/ARQ).
← Semua artikel
0 / 4