Web Scraping และ LLMs

คู่มือ Python Web Scraping และการสกัดข้อมูลสำหรับ LLM (2026)

คำตอบด่วน: ในปี 2026 โปรเจกต์ python web scraping projects สำหรับ LLM ต้องใช้กระบวนการ 2 ขั้นตอน: การเรนเดอร์แบบอะซิงโครนัสด้วย Headless Browser (Playwright หรือ Crawl4AI) ควบคู่กับการตัดสัญญาณรบกวน DOM (ลบ SVG, สคริปต์ และเมนู) ก่อนส่งให้โมเดลประมวลผล สำหรับข้อมูลที่มีโครงสร้าง ให้บังคับใช้ Pydantic schemas ร่วมกับ Instructor เพื่อประหยัดโทเค็นได้ถึง 75-88%


1. บทนำ: การดึงข้อมูลเว็บในยุคของ Frontier LLM และ AI Agents

AI Agent อัตโนมัติและระบบ RAG ต้องการบริบทของเว็บที่สดใหม่และตรวจสอบได้ แม้ว่าโมเดลระดับแนวหน้าอย่าง Claude 3.7 Sonnet, DeepSeek V3/R1 และ GPT-4o จะรองรับบริบทได้ถึง 2 ล้านโทเค็น แต่การส่ง HTML ดิบเข้าไปยังระบบ Attention ถือเป็นความสูญเสียทางงบประมาณอย่างมหาศาล

ในอดีต การ scrape website python มักใช้ requests ร่วมกับ BeautifulSoup หรือ Scrapy แต่เว็บปัจจุบันถูกพัฒนาเป็น Single Page Application (SPA) ด้วย React และ Next.js ที่มีการป้องกันด้วย WAF ขั้นสูงอย่าง Cloudflare Turnstile และ Akamai

เป้าหมายของการดึงข้อมูลจึงเปลี่ยนไป:

  • การขูดข้อมูลแบบเดิม (2015–2023): สกัดฟิลด์ข้อมูลลงฐานข้อมูลโดยใช้ตัวเลือก XPath หรือ CSS
  • การขูดข้อมูลสำหรับ AI (2026): ตัดโค้ดส่วนเกิน รักษาโครงสร้าง Markdown และสกัด JSON ที่แม่นยำผ่าน Pydantic schemas

2. เปรียบเทียบเฟรมเวิร์ก: BeautifulSoup vs Scrapy vs Playwright vs Crawl4AI

ตัวชี้วัด BeautifulSoup4 + Requests Scrapy (Twisted/AsyncIO) Raw Playwright (Async Python) Crawl4AI (v0.9.x+)
การใช้งานหลัก สคริปต์ขนาดเล็กและ HTML นิ่ง การขูดข้อมูลแบบกระจายศูนย์ขนาดใหญ่ SPA ไดนามิกและการโต้ตอบ JS AI Agents, RAG และการสกัดสำหรับ LLM
การรัน JavaScript ไม่รองรับ ไม่รองรับ (ต้องใช้ Scrapy-Playwright) รองรับเต็มรูปแบบ (Chromium, WebKit) Chromium ที่ปรับแต่งมาเพื่อ LLM
ความเร็ว (Throughput) ~15-25 req/s ต่อ Worker ~150-300 req/s ต่อ Spider ~5-12 หน้า/s (RAM 16GB) ~25-45 หน้า/s (นำ Context กลับมาใช้)
การใช้หน่วยความจำ ต่ำมาก (~40MB) ต่ำ (~120MB) สูง (150-350MB ต่อ Context) ปานกลาง (~80-140MB ต่อแท็บ)
การแปลง Markdown ต้องใช้ไลบรารีภายนอก ต้องเขียน Pipeline เพิ่มเติม ต้องเชื่อมต่อด้วยตนเอง แปลงเป็น Markdown คุณภาพสูงในตัว
การตัดสัญญาณรบกวน เขียนโค้ดกรองเอง กำหนดตัวเลือกเอง ประเมิน DOM ผ่าน CDP มี PruningContentFilter ในตัว
การหลบเลี่ยงบอท ต่ำมาก (เปลี่ยนได้แค่ UA) ใช้มิดเดิลแวร์พร็อกซี ยอดเยี่ยม (playwright-stealth) มีโหมด Stealth และจำลอง TLS ในตัว
การรองรับ Pydantic ไม่รองรับ มี ItemLoaders ไม่รองรับ มีเอนจินสกัดโครงสร้าง Pydantic ในตัว

3. เศรษฐศาสตร์การสกัดข้อมูล: การตัดสัญญาณรบกวน DOM เพื่อประหยัดโทเค็น

HTML ดิบมีข้อมูลที่ไม่จำเป็นสูงถึง 85-95% เช่น คลาส CSS สคริปต์ติดตาม และองค์ประกอบตกแต่ง

ผลลัพธ์ทางการเงินเมื่อประมวลผล 50,000 หน้าต่อวัน (GPT-4o ที่ $2.50 / 1M โทเค็น)

  • โทเค็น HTML ดิบต่อวัน: 50,000 × 55,000 = 2.75 พันล้านโทเค็น
  • โทเค็น Markdown สะอาดต่อวัน: 50,000 × 4,200 = 210 ล้านโทเค็น
  • ประหยัดค่าใช้จ่ายต่อวัน: (2,750 - 210) × $2.50 = $6,350.00 / วัน
  • ประหยัดค่าใช้จ่ายต่อเดือน: $190,500.00 / เดือน

4. โค้ดตัวอย่างการใช้งาน: Async Playwright และ 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. การสกัดข้อมูลด้วย 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. การสกัด JSON โครงสร้างแม่นยำด้วย Pydantic และ 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="ชื่อฟีเจอร์")
    supported: bool = Field(description="รองรับหรือไม่")

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. การหลบเลี่ยง WAF ด้วย 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. สรุปเปรียบเทียบต้นทุนรวม (ทดสอบ 100,000 หน้า)

องค์ประกอบต้นทุน Raw Playwright (HTML ดิบ) Playwright + Selectolax Crawl4AI Async Firecrawl Cloud
ค่าเซิร์ฟเวอร์ $48.00 $22.00 $16.00 $0.00
ค่าพร็อกซีบ้าน $120.00 $32.00 $30.00 รวมในแพ็กเกจ
ค่าโทเค็น LLM $13,750.00 $1,050.00 $975.00 $825.00
ต้นทุนรวม $13,918.00 $1,104.00 $1,021.00 $1,024.00

9. ข้อเสนอแนะเชิงสถาปัตยกรรม

  1. กลยุทธ์ตามลำดับขั้น: เริ่มจาก curl_cffi เสมอ และใช้ Crawl4AI เฉพาะหน้า SPA ที่ต้องรันสคริปต์
  2. ตัดสัญญาณรบกวนอย่างเคร่งครัด: ห้ามส่ง HTML ดิบเข้าโมเดล รักษาอัตราการบีบอัดเกิน 80%
  3. ความถูกต้องด้วย Pydantic: ใช้ Instructor ควบคุมโครงสร้างข้อมูลให้ปราศจากความคลาดเคลื่อน
  4. แยกคิวการทำงาน: ใช้ระบบคิวอะซิงโครนัส (Celery/ARQ) แยกส่วนการขูดข้อมูลออกจากโมเดล
← บทความทั้งหมด
0 / 4