- Published on
웹 스크래핑 & 크롤링 도구 2026 — Scrapy / Playwright / Puppeteer / Crawlee (Apify) / Firecrawl / Jina Reader / Stagehand AI 심층 가이드
- Authors

- Name
- Youngju Kim
- @fjvbn20031
프롤로그 — 2026년, 스크래핑은 LLM 학습 데이터의 문제가 되었다
웹 스크래핑은 한때 "마케팅팀이 경쟁사 가격을 모니터링하는" 회색 지대의 작업이었다. 2026년에는 다르다. 모든 LLM 학습이 웹 데이터를 필요로 하면서 스크래핑은 AI 인프라의 1차 입력이 되었고, Common Crawl 한 덤프로는 부족한 시대가 왔다.
이 글은 2026년 5월 현재 살아있는 웹 스크래핑 도구·서비스·전략을 한 번에 훑는다. Python으로 시작해 헤드리스 브라우저로 가고, 클라우드 프록시·API 서비스를 거쳐, LLM 친화 API와 AI 에이전트 브라우저까지 — 어디서 어떤 도구를 골라야 하는지 결정할 수 있도록 정리한다.
1. 2026년 웹 스크래핑 지도 — 4개 분류로 보기
스크래핑 도구는 크게 네 층으로 나뉜다.
[Layer 1: 라이브러리 / 프레임워크 — 직접 코딩]
Scrapy / Playwright / Puppeteer / Selenium / Crawlee
Cheerio / Beautiful Soup 4 / lxml / jsoup / Goutte
[Layer 2: 클라우드 / 매니지드 — SaaS]
Apify / Bright Data / Oxylabs / Smartproxy / SOAX
[Layer 3: API 서비스 — HTTP 한 번으로 끝]
ScrapingBee / Browserless / ZenRows / ScrapingAnt / ScraperAPI
[Layer 4: AI / LLM-friendly — Markdown 출력, 에이전트]
Firecrawl / Jina AI Reader / Diffbot
Stagehand / Browser Use / AnchorBrowser
선택 기준은 단순하다.
- 학습 / 작은 프로젝트 → Scrapy / Playwright / Cheerio 직접
- 수십 사이트, 봇 차단 우회 → Crawlee + 프록시
- 수백 사이트, 운영 부담 최소화 → Apify / ScrapingBee
- LLM 학습 / RAG 인덱싱 → Firecrawl / Jina Reader
- AI 에이전트가 웹을 다루는 → Stagehand / Browser Use
이제 각 도구를 차례대로 본다.
2. Scrapy — Python 클래식 (2008년부터 살아있는)
Scrapy는 2008년에 첫 릴리스된 Python 스크래핑 프레임워크다. 2026년 5월 현재 버전 2.13이며, 여전히 가장 많이 다운로드되는 스크래핑 라이브러리다. PyPI 기준 월간 1,400만 다운로드를 넘는다.
핵심 아키텍처는 비동기 이벤트 루프(Twisted → asyncio 마이그레이션 진행 중) + 스파이더 + 파이프라인 이다. 스파이더가 URL을 큐에 넣고, 응답을 받으면 파싱 함수가 호출되고, 추출된 아이템은 파이프라인을 통과해 저장된다.
import scrapy
class HackerNewsSpider(scrapy.Spider):
name = "hn"
start_urls = ["https://news.ycombinator.com/"]
def parse(self, response):
for item in response.css("tr.athing"):
yield {
"title": item.css("span.titleline > a::text").get(),
"url": item.css("span.titleline > a::attr(href)").get(),
"rank": item.css("span.rank::text").get(),
}
next_page = response.css("a.morelink::attr(href)").get()
if next_page:
yield response.follow(next_page, self.parse)
scrapy crawl hn -o items.jsonl 한 줄로 페이지네이션·아이템 추출·JSONL 저장까지 끝난다.
Scrapy의 강점은 튜닝 가능한 큐(Bloom filter dupefilter, priority queue), 자동 재시도 / 백오프, AutoThrottle, 미들웨어 체인, Items + Item Loaders + ItemAdapter, scrapy-playwright / scrapy-splash 통합이다. 약점은 JavaScript 렌더링이 기본으로 안 된다는 점. 그래서 scrapy-playwright 통합이 사실상 표준이 되었다.
2024~2025년 사이 Scrapy는 큰 리팩토링을 거쳐 asyncio 네이티브 지원(twisted.internet.asyncioreactor)이 들어왔고, Python 3.13의 no-GIL 빌드와도 호환된다. 2026년에도 데이터 엔지니어링 파이프라인의 "기본값"으로 남을 것이다.
3. Playwright (Microsoft) — 헤드리스 브라우저 표준
Playwright는 Microsoft가 2020년에 공개한 헤드리스 브라우저 자동화 도구다. 2026년 5월 현재 버전 1.50이며, 헤드리스 브라우저 분야의 사실상 표준이 되었다. GitHub 스타 71,000 + 을 넘었고, Puppeteer를 누른 지 오래다.
핵심 차이점은 Chrome·Firefox·WebKit 세 엔진을 한 API로 제어한다는 것. Puppeteer가 Chromium 중심이라면, Playwright는 처음부터 멀티 브라우저로 설계되었다.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(
user_agent="Mozilla/5.0 ...",
viewport={"width": 1920, "height": 1080},
locale="ko-KR",
)
page = context.new_page()
page.goto("https://example.com/list")
page.wait_for_selector("article.post")
items = page.eval_on_selector_all(
"article.post",
"elements => elements.map(e => ({title: e.querySelector('h2').innerText, link: e.querySelector('a').href}))"
)
print(items)
browser.close()
Python / Node / Java / .NET 바인딩이 모두 제공된다. 그 중 Python 버전이 데이터 팀에 가장 많이 쓰인다.
Playwright의 2026년 주요 기능은 다음과 같다.
- Auto-wait —
page.click("button")만 써도 클릭 가능해질 때까지 자동 대기.time.sleep지옥에서 해방. - Trace Viewer — 모든 클릭·네트워크·DOM 상태를 시간선으로 재생. 디버깅 도구로는 거의 최강.
- MCP 통합 — 2025년 출시된 Playwright MCP 서버를 통해 Claude·Cursor 등 AI 에이전트가 직접 브라우저를 제어할 수 있다.
- Codegen — 사용자 동작을 녹화해 코드로 출력. 스크래핑 부트스트랩에 유용.
- Component Testing(별도 라이브러리) — React·Vue 컴포넌트를 진짜 브라우저에서 테스트.
스크래핑 용도로 쓸 때는 playwright-extra + puppeteer-extra-plugin-stealth(Node) 또는 playwright-stealth(Python) 조합이 표준이다.
4. Puppeteer (Google) — Chromium의 원조 자동화
Puppeteer는 Google Chrome 팀이 2017년 공개한 Node.js 라이브러리다. 한때 헤드리스 브라우저의 대명사였지만 2020년대 들어 Playwright에 자리를 내주는 분위기다. 2026년 5월 현재 v23이고, 여전히 활발히 유지보수되고 있다.
import puppeteer from 'puppeteer'
const browser = await puppeteer.launch({ headless: 'new' })
const page = await browser.newPage()
await page.goto('https://example.com/list')
await page.waitForSelector('article.post')
const items = await page.$$eval('article.post', (nodes) =>
nodes.map((n) => ({
title: n.querySelector('h2')?.innerText ?? '',
link: (n.querySelector('a') as HTMLAnchorElement)?.href ?? '',
}))
)
console.log(items)
await browser.close()
Playwright와 비교한 Puppeteer의 위치는 명확하다.
- 장점: Chrome DevTools Protocol에 가장 밀착. Lighthouse·web-vitals·PDF 생성 같은 Chrome 전용 기능과의 통합이 가장 매끄럽다.
- 단점: 멀티 브라우저 지원 약함. API 디자인이 Playwright에 비해 옛스럽다.
- 생태계 자산:
puppeteer-extra+puppeteer-extra-plugin-stealth— 스텔스 분야의 표준 플러그인. Playwright 측에서도 이 플러그인을 포팅해 쓴다.
새 프로젝트라면 Playwright를 권장하지만, Chrome 전용 PDF 생성·렌더링 검증이 주 목적이라면 Puppeteer가 여전히 깔끔한 선택지다.
5. Selenium — 여전히 살아있는 (legacy + WebDriver BiDi)
Selenium은 2004년에 시작한 가장 오래된 브라우저 자동화 프로젝트다. 2026년 기준 Selenium 4.x가 안정 버전이며, 5.0이 W3C WebDriver BiDi 표준을 1급 시민으로 받아들여 개발 중이다.
Selenium은 모던 도구들(Playwright / Puppeteer)에 비해 느리고 무겁다는 평이 많지만, 다음 분야에서는 여전히 1등이다.
- QA / 테스트 자동화 — 엔터프라이즈에서 가장 많이 쓰이는 테스트 도구.
- Grid + Selenoid / Moon — 컨테이너 기반 분산 실행 인프라가 가장 성숙.
- 레거시 코드베이스 — 2010년대에 짠 Selenium 스위트가 여전히 돌아간다.
- WebDriver BiDi(양방향 프로토콜) 표준 작업의 중심 — 2026년에는 Chrome·Firefox·Edge가 모두 BiDi를 구현해, 한때 Playwright만의 이점이었던 양방향 이벤트 스트리밍을 Selenium도 제공한다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com/list")
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "article.post"))
)
posts = driver.find_elements(By.CSS_SELECTOR, "article.post")
for p in posts:
title = p.find_element(By.CSS_SELECTOR, "h2").text
link = p.find_element(By.CSS_SELECTOR, "a").get_attribute("href")
print(title, link)
driver.quit()
스크래핑 입장에서는 undetected-chromedriver 조합이 핵심 자산이다. 봇 탐지 우회를 위해 Chrome WebDriver의 지문을 다듬은 포크인데, 9장에서 다룬다.
6. Crawlee (Apify) — 모던 스크래핑 프레임워크
Crawlee는 Apify가 2022년 공개한 오픈소스 프레임워크다. Scrapy의 모던 Node / Python 대체재를 표방한다. 2024년 Crawlee for Python 안정판이 나오면서 Python에서도 쓸 수 있게 되었다.
설계 철학은 명확하다 — "스크래핑에 필요한 모든 것이 박스에 들어 있다."
- 자동 큐 / 재시도 —
RequestQueue가 URL을 영속 저장. 크래시 후 재개 가능. - 자동 프록시 로테이션 —
ProxyConfiguration으로 URL 풀 등록만 하면 끝. - 자동 세션 관리 —
SessionPool이 쿠키·UA·프록시 조합을 관리. - 자동 동시성 조절 —
AutoscaledPool이 CPU·메모리·응답시간 기반으로 동시성 결정. - 다중 크롤러 —
HttpCrawler(fast, no JS),CheerioCrawler,PlaywrightCrawler,PuppeteerCrawler를 같은 API로.
import { PlaywrightCrawler, Dataset } from 'crawlee'
const crawler = new PlaywrightCrawler({
maxRequestsPerCrawl: 1000,
async requestHandler({ page, request, enqueueLinks }) {
await page.waitForSelector('article.post')
const items = await page.$$eval('article.post', (nodes) =>
nodes.map((n) => ({
title: n.querySelector('h2')?.textContent ?? '',
link: (n.querySelector('a') as HTMLAnchorElement)?.href ?? '',
}))
)
await Dataset.pushData(items)
await enqueueLinks({ selector: 'a.next-page' })
},
})
await crawler.run(['https://example.com/list'])
이 코드만으로 페이지네이션 추적·자동 재시도·세션 풀·동시성 자동 조절이 다 작동한다. Scrapy를 Node로 쓰고 싶다면 Crawlee가 답이다.
7. Apify — 매니지드 스크래핑 클라우드
Apify는 Crawlee를 만든 회사가 운영하는 매니지드 스크래핑 플랫폼이다. "Actor" 라고 부르는 컨테이너 단위 작업을 클라우드에서 실행해주고, 입력 정의·저장소·프록시·스케줄러까지 매니지드로 제공한다.
Apify의 매력은 Actor 마켓플레이스다. 2026년 5월 기준 5,000개가 넘는 사전 제작 Actor가 등록되어 있다 — Google 검색 결과 스크래핑, Instagram 프로필, Amazon 상품, LinkedIn 회사, TikTok 영상 등. 마켓플레이스 Actor는 보통 1,000 결과당 5 정도의 종량제다.
import { Actor } from 'apify'
import { PlaywrightCrawler } from 'crawlee'
await Actor.init()
const input = await Actor.getInput()
const crawler = new PlaywrightCrawler({
proxyConfiguration: await Actor.createProxyConfiguration(),
async requestHandler({ page, request }) {
const data = await page.evaluate(() => ({
title: document.querySelector('h1')?.textContent,
content: document.querySelector('article')?.innerText,
}))
await Actor.pushData(data)
},
})
await crawler.run(input.startUrls)
await Actor.exit()
이 Actor를 apify push로 배포하면, 웹 UI에서 입력값을 받아 실행되고, 결과는 Apify Dataset에 저장된다. CLI 없이 cron 스케줄러로 매일 돌릴 수도 있다.
가격은 컴퓨트 시간(예: 1 CU = 약 메모리 1GB × 시간 1h)으로 측정되며, 무료 플랜 $5 / 월 크레딧으로 시작할 수 있다. 프록시는 별도로 청구된다. Apify Proxy는 데이터센터·주거용·SERP·구글 SERP 등 카테고리별 정가가 있다.
8. Bright Data / Oxylabs / Smartproxy — 프록시 + 스크래핑 클라우드
봇 차단의 가장 큰 무기는 IP 기반 차단이다. 한 IP에서 초당 10건 이상 요청이 오면 의심받기 시작한다. 그래서 프록시 회사들이 등장했다.
Bright Data(구 Luminati)는 업계 최대 주거용 프록시 네트워크를 가진 회사다. 1억 5천만 + 의 주거용 IP, 7,200만 + 의 ISP 프록시, 300만 + 의 데이터센터 프록시, 70만 + 의 모바일 프록시를 보유한다고 공시한다. 2026년에는 Web Unlocker(자동 캡차 / 봇 차단 우회 API), SERP API(Google·Bing 검색 결과), Web Scraper IDE(브라우저 안에서 코드 작성), Scraping Browser(원격 헤드리스 브라우저) 등 풀스택 제품을 갖췄다.
가격은 GB당 종량제가 기본이다. 주거용 프록시는 GB당 15, 데이터센터는 GB당 1 수준.
Oxylabs는 리투아니아 본사의 프록시 회사다. Bright Data와 유사한 라인업(주거용·데이터센터·ISP·모바일)에 Real-Time Crawler·E-Commerce Scraper API·Web Unblocker 같은 매니지드 API를 제공한다. 가격대는 Bright Data와 비슷하거나 약간 낮다.
Smartproxy(현재는 Decodo로 리브랜딩)는 좀 더 합리적인 가격대를 노린다. 주거용 프록시 GB당 8 정도, 초보자 친화적인 UI가 강점이다. Apify Proxy 같은 모델보다 자유도가 높다.
스크래핑 입장에서 프록시 선택 기준은 다음과 같다.
- 데이터센터 프록시 — 싸지만 차단 위험 큼. 봇 탐지 약한 사이트에 적합.
- 주거용 프록시 — 비싸지만 차단 거의 없음. 큰 전자상거래·SNS에 적합.
- 모바일 프록시 — 가장 비싸지만 모바일 앱 트래픽 위장 가능. TikTok·Instagram에 효과적.
- ISP 프록시 — 정적 주거용 IP. 세션 유지가 중요한 경우.
9. ScrapingBee / Browserless / ZenRows — API 스크래핑 서비스
프록시 + 헤드리스 브라우저 + 캡차 우회를 모두 묶어 "HTTP 한 번 호출로 끝" 으로 만들어주는 서비스들이다.
ScrapingBee는 프랑스 회사가 만든 가장 잘 알려진 API다. URL을 던지면 렌더링된 HTML을 돌려준다.
curl "https://app.scrapingbee.com/api/v1/?api_key=YOUR_KEY&url=https://example.com&render_js=true&premium_proxy=true"
가격은 크레딧 종량제. JS 렌더링 없으면 1 크레딧, JS 렌더링 있으면 5 크레딧, 프리미엄 프록시는 25 크레딧, 캡차 우회는 100 크레딧 정도가 든다. 1,000 크레딧 패키지가 $9 수준이다. 작은 프로젝트에는 가장 저렴한 옵션.
Browserless는 좀 더 개발자 친화적이다. Puppeteer / Playwright를 WebSocket으로 원격 연결하게 해주는 서비스로, 코드 변경 없이 클라우드의 Chrome을 쓸 수 있다.
import puppeteer from 'puppeteer-core'
const browser = await puppeteer.connect({
browserWSEndpoint: 'wss://chrome.browserless.io?token=YOUR_TOKEN',
})
const page = await browser.newPage()
await page.goto('https://example.com')
const html = await page.content()
await browser.disconnect()
세션당 가격제 + 시간제 혼합으로, 한 달 $50부터 시작한다. 자체 인프라 + Chrome 컨테이너 운영의 부담이 없어진다.
ZenRows는 봇 탐지 우회에 특화한 후발주자다. JavaScript 렌더링 + 프리미엄 프록시 + AntiBot bypass + CSS 셀렉터 추출을 단일 API로 묶어 판다. ScrapingBee와 직접 경쟁한다. 2026년 들어 ZenRows는 Universal Scraper API라는 LLM 친화 출력 모드를 추가해, Markdown / JSON-LD / 메인 콘텐츠 추출까지 자동화한다.
ScrapingAnt / ScraperAPI / Apify Web Scraper는 비슷한 카테고리의 경쟁자들이다.
10. AI / LLM-friendly — Firecrawl / Jina AI Reader / Diffbot
2024년부터 등장한 새로운 카테고리다. "LLM이 읽기 좋은 Markdown으로 변환된 웹 콘텐츠" 를 돌려주는 서비스들. RAG 인덱싱과 LLM 학습 데이터 수집에 특화되어 있다.
Firecrawl은 2024년 출시된 YC 회사다. URL을 던지면 HTML이 아닌 LLM 친화 Markdown을 돌려준다. JS 렌더링·자동 페이지네이션·전체 사이트 크롤링·웹 검색을 단일 API로 제공한다.
curl -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/article",
"formats": ["markdown", "html"]
}'
응답에는 markdown 필드와 함께 metadata(title·description·sourceURL 등)가 포함된다. RAG 데이터셋을 만들 때 Cheerio로 광고·내비게이션·푸터를 직접 떼어낼 필요가 사라진다.
가격은 1,000 페이지당 $0.83 (Standard) 부터 시작한다. crawl API는 사이트 전체를 재귀적으로 끌고 와 pages 배열로 반환한다. 2026년 들어 extract API가 추가되어, LLM에게 추출 스키마를 던지면 JSON으로 정형화된 결과를 받을 수 있다.
Jina AI Reader는 가장 매력적인 무료 옵션이다. https://r.jina.ai/{URL} 형식으로 URL을 prefix만 붙이면 끝.
curl https://r.jina.ai/https://example.com/article
응답은 LLM 친화 Markdown이고, 인증 키 없이도 호출 가능하다 (rate limit 있음). API 키를 등록하면 더 높은 한도와 추가 기능을 얻는다.
Jina의 강점은 자체 학습한 Reader-LM(HTML→Markdown 전용 소형 모델) 을 백엔드로 쓴다는 것이다 (다음 장에서 설명). LLM 학습 데이터셋 만들기, AI 에이전트의 웹 검색·읽기 단계, RAG 인덱싱 모두에 즉시 쓸 수 있다.
Diffbot은 2008년부터 운영되는 베테랑이다. AI 기반 자동 추출 — 어떤 페이지를 던져도 페이지 타입(article / product / discussion / event 등)을 자동 감지하고 구조화된 JSON을 반환한다. 가격은 비싼 편이지만(월 $299부터), 수천 사이트의 추출 로직을 직접 짤 일이 없어진다. 2024년 들어 LLM 친화 출력 모드도 추가했다.
11. Reader-LM (Jina, 2024년 5월) — HTML → Markdown 전용 소형 모델
Jina AI는 2024년 5월 Reader-LM이라는 소형 모델 두 종(0.5B / 1.5B 파라미터)을 공개했다. 입력은 거대한 HTML 문서, 출력은 LLM 친화 Markdown — 그 한 가지 작업만 한다.
왜 별도 모델이 필요한가? regex나 readability.js 같은 규칙 기반 추출은 광고·SPA 마크업·다이내믹 콘텐츠에 약하고, 범용 LLM(GPT-4 / Claude)에게 시키기에는 컨텍스트 256k도 모자라고 비용이 폭발한다. Reader-LM은 이 사이의 구멍을 메우기 위해 만든 태스크 특화 SLM이다.
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("jinaai/reader-lm-1.5b")
model = AutoModelForCausalLM.from_pretrained("jinaai/reader-lm-1.5b")
html = open("page.html").read()
prompt = f"Convert the following HTML to clean Markdown:\n\n{html}"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=4096)
markdown = tokenizer.decode(outputs[0], skip_special_tokens=True)
2026년에는 후속 모델인 Reader-LM-v2가 출시되어, 256k 컨텍스트와 더 깔끔한 표·코드 블록 추출을 지원한다. Hugging Face 모델 카드에서 무료로 받을 수 있다.
이 모델은 Jina AI Reader API의 백엔드이기도 하다. 즉 r.jina.ai를 한 번 호출할 때마다 Reader-LM이 한 번 추론을 돌린다. 자체 호스팅하면 같은 결과를 무료로 얻을 수 있지만, GPU 비용과 운영 부담을 감안할 가치가 있는지가 결정 기준이다.
12. AI Playwright — Stagehand / Browser Use / AnchorBrowser
2025년 후반부터 새로운 카테고리가 떴다. "AI가 브라우저를 자연어로 다루는" 도구들 — Playwright 위에 LLM 레이어를 얹어, 셀렉터를 적지 않고도 작업할 수 있게 한다.
Stagehand는 Browserbase가 만든 오픈소스 라이브러리다. Playwright API에 act · extract · observe 세 가지 AI 메서드를 추가한다.
import { Stagehand } from '@browserbasehq/stagehand'
const stagehand = new Stagehand({ env: 'LOCAL' })
await stagehand.init()
const page = stagehand.page
await page.goto('https://amazon.com')
await page.act({ action: 'search for headphones' })
await page.act({ action: 'click the first result' })
const product = await page.extract({
instruction: 'extract product title, price, and rating',
schema: z.object({
title: z.string(),
price: z.string(),
rating: z.number(),
}),
})
await stagehand.close()
내부적으로 Stagehand는 페이지의 DOM을 LLM에게 보내 "이 버튼이 검색 버튼인가?" 같은 결정을 위임한다. 셀렉터가 변해도 의도가 같으면 작동한다. Browserbase는 같은 회사가 운영하는 매니지드 클라우드 브라우저 서비스로, Stagehand를 로컬에서 / 클라우드에서 같은 코드로 돌릴 수 있게 해준다.
Browser Use는 Python 기반 경쟁 도구다. 에이전트 루프 + LLM + Playwright 조합으로, 사용자가 자연어 목표(예: "Indeed에서 Python 백엔드 채용 10건 가져오기")만 주면 LLM이 알아서 클릭·스크롤·추출을 반복한다.
from browser_use import Agent
from langchain_openai import ChatOpenAI
agent = Agent(
task="Indeed에서 Python 백엔드 채용 10건의 제목과 URL을 가져와줘",
llm=ChatOpenAI(model="gpt-4o"),
)
result = await agent.run()
print(result)
AnchorBrowser는 더 인프라스트럭처에 가까운 서비스다. Stagehand·Browser Use·기존 Playwright 코드를 모두 받아 클라우드 브라우저에서 실행해주는 매니지드 플랫폼이다. Browserbase의 직접 경쟁자.
이 카테고리는 2026년에 가장 빠르게 성장 중이다. AI 에이전트(Claude·GPT) 들이 웹을 "보고" 작업하는 시대가 오면서, 셀렉터 기반 스크래핑은 점점 LLM 결정 + 시각적 그라운딩으로 대체되고 있다.
13. 파싱 — Cheerio / Beautiful Soup 4 / lxml / jsoup / Goutte
HTML을 받았다면 그 다음은 파싱이다. 언어별로 사실상 표준이 정해져 있다.
Cheerio (Node) — jQuery 같은 API로 HTML을 다룬다. 빠르고 가볍다.
import * as cheerio from 'cheerio'
const html = await fetch('https://example.com').then((r) => r.text())
const $ = cheerio.load(html)
$('article.post').each((_i, el) => {
console.log($(el).find('h2').text(), $(el).find('a').attr('href'))
})
Beautiful Soup 4 (Python) — 가장 친숙한 Python HTML 파서.
from bs4 import BeautifulSoup
import requests
soup = BeautifulSoup(requests.get("https://example.com").text, "lxml")
for post in soup.select("article.post"):
print(post.h2.text, post.a["href"])
bs4는 내부 파서로 lxml / html.parser / html5lib를 선택할 수 있다. 속도가 중요하면 lxml을, 표준 준수가 중요하면 html5lib를 쓴다.
lxml (Python) — libxml2 C 바인딩. bs4보다 5~10배 빠르고 XPath 1.0을 지원한다. 대량 처리·XML 작업에 적합하다.
from lxml import html
tree = html.fromstring(open("page.html").read())
titles = tree.xpath("//article[@class='post']/h2/text()")
jsoup (Java) — JVM 진영의 표준. Cheerio와 비슷한 jQuery 셀렉터를 제공한다.
Document doc = Jsoup.connect("https://example.com").get();
for (Element post : doc.select("article.post")) {
System.out.println(post.select("h2").text());
}
Goutte (PHP) — Symfony가 만든 스크래퍼 + 파서 조합. Symfony BrowserKit + DomCrawler를 묶었다. 2023년 즈음 Symfony BrowserKit·HttpClient를 직접 쓰는 방향으로 통합되었지만 Goutte 이름은 여전히 통용된다.
Mechanize (Python / Ruby) — 폼 제출·쿠키 관리에 특화한 "프로그래밍 가능한 브라우저". JS는 안 되지만, 폼 기반 사이트(법원 / 도서관 / 정부)에는 여전히 유용하다.
선택 기준은 단순하다 — 언어 진영의 표준을 따르면 된다. 단 Python에서 대량 처리라면 bs4 대신 lxml 직접 사용을 권한다.
14. 스텔스 — puppeteer-extra-stealth / undetected-chromedriver / Camoufox
봇 탐지는 2020년대 들어 본격적인 군비 경쟁이 되었다. Cloudflare·DataDome·Akamai Bot Manager·PerimeterX 같은 봇 탐지 서비스가 다음을 검사한다.
navigator.webdriver === true(헤드리스 브라우저 표식)- WebGL·Canvas·AudioContext 핑거프린트
- TLS Fingerprint (JA3 / JA4)
- HTTP/2 핑거프린트
- 마우스 / 키보드 이벤트 패턴 (사람처럼 움직이는가)
- CDP(Chrome DevTools Protocol) 사용 흔적
이를 우회하는 도구들이다.
puppeteer-extra-plugin-stealth — Puppeteer / Playwright 둘 다에서 가장 많이 쓰이는 스텔스 플러그인. navigator.webdriver 제거, 가짜 플러그인 등록, WebGL 핑거프린트 위조, Chrome runtime mock 등 20개 이상의 우회 기법을 묶었다.
import puppeteer from 'puppeteer-extra'
import StealthPlugin from 'puppeteer-extra-plugin-stealth'
puppeteer.use(StealthPlugin())
const browser = await puppeteer.launch({ headless: false })
undetected-chromedriver (Python) — Selenium 측의 표준. Chrome WebDriver 드라이버 바이너리를 다시 컴파일해 CDP 검출 사인을 제거한다. Cloudflare 보호 사이트에 가장 효과적인 도구 중 하나로 알려져 있다.
import undetected_chromedriver as uc
driver = uc.Chrome(headless=False)
driver.get("https://cloudflare-protected-site.com")
Camoufox — Firefox 포크 기반의 새로운 스텔스 브라우저. 2024년 출시. Puppeteer / Playwright와 같은 인터페이스를 쓰지만, 브라우저 엔진 자체가 봇 탐지 사인을 제거한 커스텀 빌드다. Mullvad Browser와 비슷한 핑거프린트 저항을 갖추고 있어 가장 강력한 우회 옵션 중 하나로 평가된다.
from camoufox.sync_api import Camoufox
with Camoufox(headless=False) as browser:
page = browser.new_page()
page.goto("https://example.com")
프록시 + 스텔스 + 사람 같은 타이밍은 별개 축이다. 셋 다 갖춰야 봇 탐지의 80%를 통과한다. 그래서 ZenRows·Bright Data Web Unlocker 같은 매니지드 서비스가 등장한 것이다 — 이걸 다 직접 운영하는 비용보다 GB당 요금이 싸기 때문이다.
15. robots.txt + sitemap.xml + 크롤링 윤리
도구를 쓰기 전에 무엇이 허용되는가를 알아야 한다.
robots.txt — 사이트 루트의 /robots.txt에 명시된 크롤러 정책. 모든 크롤러가 따라야 하는 사회적 합의(법은 아님)다.
User-agent: *
Disallow: /admin/
Disallow: /api/internal/
Crawl-delay: 10
User-agent: GPTBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
Sitemap: https://example.com/sitemap.xml
Crawl-delay는 요청 간 최소 간격(초)을 권고한다. User-agent: GPTBot 같은 명시적 LLM 차단은 2023~2024년 폭증했고, 2026년에는 대부분 메이저 사이트가 LLM 학습용 크롤러를 robots.txt로 차단한다.
sitemap.xml — 사이트가 자기 페이지 목록을 명시적으로 알려주는 파일. URL·lastmod·changefreq·priority를 담는다. 사이트맵을 따라가는 크롤링은 BFS로 페이지를 찾는 것보다 훨씬 효율적이고 부담도 적다.
Robots Exclusion Protocol(REP) 2022년 IETF 표준화 이후, robots.txt는 "권고"가 아닌 "준수해야 하는 표준"으로 격상되었다. 미국·EU의 일부 판례는 robots.txt를 무시한 크롤링을 부정 접근으로 판단한 사례가 있다.
크롤링 윤리 체크리스트:
- robots.txt 확인 후 차단 경로 제외.
Crawl-delay준수 (없으면 1초 이상 권장).- 사용자 식별 UA(
Mozilla/5.0 (compatible; YourBotName/1.0; +https://your-site.com/bot)) 설정. - 같은 도메인에 대한 동시 요청 1~4 이하.
- 캐시 헤더(
If-Modified-Since,ETag) 준수. - 개인정보 / 저작권 콘텐츠 수집 시 법무 / DPO 검토.
- 수집한 데이터에 출처를 보존 (LLM 학습용이라면 더더욱).
이 체크리스트를 지키는 봇은 차단당할 가능성도 적다. 차단당하는 봇은 대개 속도가 너무 빠르고, UA가 의심스럽고, robots.txt를 무시한다.
16. 한국 / 일본 — 토스, 카카오, 메르카리 스크래핑 정책
스크래핑 정책은 지역마다 다르다. 한일 사례를 살펴본다.
한국 — 토스 / 토스페이먼츠: 토스는 자사 서비스에 대한 자동화 접근을 약관에서 명시적으로 금지한다. 2023년 토스가 한 핀테크 비교 서비스가 토스 페이지를 크롤링한 것에 대해 법적 대응한 사례가 있다. 한국 대법원은 2017년 사람인 vs 잡코리아 판결에서 "공개된 정보라도 자동화된 대량 수집은 데이터베이스권 침해 가능" 판례를 남겼다. 즉 공개되어 있어도 자동 수집은 법적 위험이 있다.
한국 — 카카오 / 다음: 다음 검색은 한국 사이트의 메타 검색 결과를 인덱싱하는 카카오 검색 봇을 운영한다. 카카오 측 발표에 따르면, 다음 봇은 User-agent: Daum을 사용하고 robots.txt를 엄격히 준수한다. 한국에서 SEO를 한다면 네이버 봇(Yeti)·다음 봇(Daum)·구글 봇(Googlebot) 셋을 다 고려해야 한다.
일본 — 메르카리: 메르카리는 약관 7.1조에서 "API·자동화 도구를 통한 데이터 접근"을 명시적으로 금지한다. 2019년 메르카리는 가격 비교 서비스가 자사 데이터를 스크래핑하는 것에 대해 일본 법원에 가처분을 신청해 인용된 적이 있다. 일본 저작권법은 2018년 개정으로 "정보 분석 목적의 복제" 를 폭넓게 허용했지만(제30조의4), 사이트 약관과 별개로 해석된다.
일본 — 큐레이션 사이트와 NAVER 마토메 사건: 일본 NAVER 마토메(2020년 서비스 종료)는 사용자가 다른 사이트의 콘텐츠를 모아 만든 큐레이션이었다. 다수의 저작권 분쟁 끝에 NAVER 측이 서비스를 종료했다. 자동 스크래핑이 아닌 사용자 큐레이션이었음에도, 출처 표기 부재와 대량 사용이 문제가 되었다.
세 사례의 교훈: 공개되어 있다 ≠ 수집해도 된다. 사이트 약관·robots.txt·해당 국가의 데이터베이스권 / 저작권법을 모두 확인해야 한다. LLM 학습 데이터로 쓸 때는 더욱 그렇다.
17. 누가 무엇을 골라야 하나 — 5가지 시나리오
도구 지도를 다 봤으니 이제 결정 매트릭스다.
시나리오 1: 학생 / 사이드 프로젝트 — 한 사이트, 100~1,000 페이지 → Python + Scrapy 또는 Playwright. 직접 코딩. 무료. 학습 효과 최대.
시나리오 2: 인디 해커 / SaaS 데이터 — 10~50 사이트, 매일 갱신 → Crawlee (Node) 또는 Scrapy + scrapy-playwright. Apify에 배포해 cron으로 돌리거나 자체 VPS. 프록시는 Smartproxy / Bright Data 데이터센터 GB 패키지.
시나리오 3: 모니터링 / 가격 비교 — 봇 차단 강한 사이트 → Crawlee + puppeteer-extra-stealth + Bright Data 주거용 프록시. 또는 ZenRows / ScrapingBee API. 자체 운영 vs SaaS 비용 비교 후 결정.
시나리오 4: LLM 학습 데이터 / RAG — 수천 사이트, Markdown 출력
→ Firecrawl (crawl API) 또는 Jina AI Reader. 둘 다 LLM 친화 Markdown을 돌려준다. 비용 민감하면 Jina, 더 많은 옵션이 필요하면 Firecrawl.
시나리오 5: AI 에이전트가 웹을 직접 다루는 — 셀렉터를 적기 싫다 → Stagehand (TypeScript) + Browserbase. 또는 Browser Use (Python). LLM 비용은 별도로 든다는 점 주의.
비용 감각 (1,000 페이지 기준):
- 자체 운영 (서버 + 프록시 GB): 10
- Apify Actor (마켓플레이스): 5
- ScrapingBee / ZenRows API: 20
- Bright Data Web Unlocker: 10
- Firecrawl: 3
- Jina AI Reader 유료: 약 $0.5
- Jina AI Reader 무료 한도: 분당 20~200 요청
- Stagehand + Browserbase: 50 (LLM API 비용 포함)
가격은 곧 운영 부담의 역수다. 직접 운영하면 싸지만 시간이 든다.
18. 참고 / References
- Scrapy documentation —
https://docs.scrapy.org/ - Scrapy GitHub —
https://github.com/scrapy/scrapy - Playwright Python —
https://playwright.dev/python/ - Playwright Node —
https://playwright.dev/ - Playwright MCP —
https://github.com/microsoft/playwright-mcp - Puppeteer documentation —
https://pptr.dev/ - puppeteer-extra-plugin-stealth —
https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth - Selenium documentation —
https://www.selenium.dev/documentation/ - WebDriver BiDi specification —
https://w3c.github.io/webdriver-bidi/ - undetected-chromedriver —
https://github.com/ultrafunkamsterdam/undetected-chromedriver - Crawlee for Node —
https://crawlee.dev/ - Crawlee for Python —
https://crawlee.dev/python/ - Apify platform —
https://apify.com/ - Apify Store —
https://apify.com/store - Bright Data —
https://brightdata.com/ - Oxylabs —
https://oxylabs.io/ - Smartproxy / Decodo —
https://decodo.com/ - ScrapingBee —
https://www.scrapingbee.com/ - Browserless —
https://www.browserless.io/ - ZenRows —
https://www.zenrows.com/ - ScrapingAnt —
https://scrapingant.com/ - Firecrawl —
https://www.firecrawl.dev/ - Firecrawl GitHub —
https://github.com/mendableai/firecrawl - Jina AI Reader —
https://jina.ai/reader/ - Reader-LM model card —
https://huggingface.co/jinaai/reader-lm-1.5b - Diffbot —
https://www.diffbot.com/ - Stagehand —
https://www.stagehand.dev/ - Stagehand GitHub —
https://github.com/browserbase/stagehand - Browserbase —
https://www.browserbase.com/ - Browser Use —
https://github.com/browser-use/browser-use - AnchorBrowser —
https://anchorbrowser.io/ - Camoufox —
https://github.com/daijro/camoufox - Cheerio —
https://cheerio.js.org/ - Beautiful Soup —
https://www.crummy.com/software/BeautifulSoup/ - lxml —
https://lxml.de/ - jsoup —
https://jsoup.org/ - Goutte —
https://github.com/FriendsOfPHP/Goutte - Mechanize (Python) —
https://github.com/python-mechanize/mechanize - Robots Exclusion Protocol (RFC 9309) —
https://www.rfc-editor.org/rfc/rfc9309.html - Sitemaps XML format —
https://www.sitemaps.org/protocol.html - Common Crawl —
https://commoncrawl.org/ - 토스페이먼츠 약관 —
https://docs.tosspayments.com/ - 일본 저작권법 제30조의4 (情報解析) —
https://www.bunka.go.jp/seisaku/chosakuken/ - メルカリ Terms of Service —
https://www.mercari.com/jp/tos/