크롤러 윤리와 도구
크롤러 윤리와 도구
공개된 웹 데이터를 수집하는 작업은 기술뿐 아니라 윤리·법규에 닿습니다. 너무 자주 두드리면 상대 서버에 부담을 주고, 약관을 읽지 않으면 법적 문제로 번질 수 있습니다.
1. robots.txt
웹 크롤러에게 접근 허용/금지를 알려주는 텍스트 규약입니다. Martijn Koster 가 1994 년에 제안한 사실상의 표준이었고, 2022 년 9 월 RFC 9309 로 IETF 의 공식 표준이 되었습니다.
User-agent: *
Disallow: /private/
Allow: /private/public.html
Crawl-delay: 5
Sitemap: https://example.com/sitemap.xml
robots.txt 는 법적 강제가 아닌 약속이지만 무시 시 차단·법적 분쟁의 근거로 작용할 수 있습니다.
2. 크롤링 윤리
- User-Agent 명시 — 누가 무엇을 위해 수집하는지 식별 가능한 UA + 연락 가능한 URL.
- Rate limit — 동시 연결·초당 요청 수 제한.
Crawl-delay가 있으면 따릅니다. - 캐시 활용 —
ETag·Last-Modified를 보내 304 를 받습니다. - 약관 확인 — 사이트의 이용약관·API 약관에서 자동 수집 정책을 확인합니다.
- 개인정보 — 공개되어 있어도 개인정보보호법 (한국) · GDPR (EU) · CCPA (미국) 등의 적용을 받을 수 있습니다.
3. 브라우저 자동화 도구
| 도구 | 첫 등장 | 제공자 | 특징 |
|---|---|---|---|
| Selenium | 2004 | OSS, SeleniumHQ | 가장 오래된 표준. WebDriver 사양 (W3C). 다언어 지원. |
| Puppeteer | 2017 | Chrome 팀 | Chrome DevTools Protocol (CDP). Node 우선. |
| Playwright | 2020 | Microsoft (전 Puppeteer 멤버 합류) | 다언어 (Node · Python · Java · .NET). Chromium · Firefox · WebKit. 자동 대기 · tracing. |
Playwright 는 비교적 늦게 등장했지만 자동 대기 (auto-wait) · 셀렉터 엔진 · trace 뷰어 같은 운영 편의 기능이 강하다는 평이 있습니다. Puppeteer 는 Chrome 단일 타깃에 최적화돼 있습니다.
4. HTML 파서
| 라이브러리 | 첫 등장 | 메모 |
|---|---|---|
| BeautifulSoup | 2004, Leonard Richardson | Python 표준급. 관용적 HTML 처리에 강함. |
| lxml | 2005 | C 기반 (libxml2). 빠릅니다. XPath. |
| parsel | 2017 경 | Scrapy 의 셀렉터를 별도 패키지화. CSS + XPath. |
| html5lib | 2008 | HTML5 사양에 충실한 파서. 느리지만 호환성. |
| Cheerio | 2012 | Node, jQuery API 와 유사. |
BeautifulSoup 는 내부 파서로 html.parser (표준 라이브러리) · lxml · html5lib 중 선택할 수 있습니다. 속도는 lxml, 호환성은 html5lib.
5. 정적 스크래핑 vs 브라우저 자동화
- 정적 스크래핑 (
httpx+ BeautifulSoup) — 서버가 렌더한 HTML 만 다룹니다. 빠르고 가볍습니다. - 브라우저 자동화 (Playwright) — JS 가 실행된 결과를 봅니다. 느리지만 SPA 에 필수.
가능하면 정적 스크래핑부터 시도하고 JS 의존이 명확한 경우에만 브라우저로 올라가는 편이 비용·속도 면에서 합리적입니다.
6. anti-bot 의 한계
크롤링 차단 기법과 우회는 끊임없이 진화합니다.
- UA 회전 — 효과는 제한적입니다. 다른 신호 (헤더 조합·TLS fingerprint·행동 패턴) 가 더 결정적인 경우가 많습니다.
- 헤드리스 탐지 회피 —
navigator.webdriver· 폰트·캔버스 fingerprint · WebGL renderer 등이 검사 대상입니다.playwright-stealth같은 보조가 있지만 항구적 해법은 아닙니다. - IP 회전 — 데이터센터 IP 는 차단되기 쉽고 주거용 프록시는 비용·법적 회색지대.
- Cloudflare · Akamai · PerimeterX — JS 챌린지·디바이스 fingerprint·머신러닝 기반. 우회 시도는 약관 위반에 가깝습니다.
- CAPTCHA — 자동 풀이 시도는 약관·법규 양쪽에서 위험합니다.
기술적으로 가능한 것과 윤리·법적으로 허용되는 것은 같지 않습니다. 차단은 일반적으로 사이트의 의사 표시로 해석합니다.
7. API 우선
한국의 공공데이터포털 (data.go.kr, 2013 개설) 은 다수의 행정기관 데이터를 OpenAPI 형태로 제공합니다. 같은 데이터를 HTML 에서 긁는 것보다 API 가 가능하면 API 가 답입니다. 안정성·약관·구조화 모두에서 우월합니다. 미국 data.gov, EU data.europa.eu 도 비슷한 위치입니다.
8. robots.txt 존중과 캐시 활용
import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
if rp.can_fetch('MyBot/1.0', url):
fetch(url)
headers = {}
if etag := cache.get(f'etag:{url}'):
headers['If-None-Match'] = etag
r = httpx.get(url, headers=headers)
if r.status_code == 304:
return cache.get(f'body:{url}')
9. 동시성 제한
import asyncio
sem = asyncio.Semaphore(5)
async def fetch(url):
async with sem:
...
도메인별 동시성을 5–10 이하로 두는 정책이 흔합니다. 수집 대상 사이트의 규모·정책에 맞춰 조정합니다.
10. 자주 걸리는 자리
약관 미확인 — 자동 수집 금지 조항이 있을 수 있습니다. 큰 위험은 기술이 아니라 법·약관에서 옵니다.
재시도 폭주 — 5xx 응답에서 무제한 재시도가 DDoS 가 됩니다. 백오프와 최대 재시도 횟수를 둡니다.
세션 쿠키·인증 — 인증 후 데이터를 긁는 것은 약관상 더 엄격할 수 있습니다.
저장한 HTML 의 라이선스 — 크롤링 결과를 재배포할 때 저작권·DB 권리 검토가 필요합니다.
개인정보 — 이메일·연락처 같은 개인정보는 공개되어 있어도 수집·보관에 제약이 있습니다.
하고픈 말
크롤링은 기술 자체보다 법·약관·윤리의 경계가 더 큰 비중입니다. 공공데이터 OpenAPI 가 가능한 자리는 그 자리부터 시작하는 게 안전합니다. anti-bot 우회의 욕망보다 차단된 자리의 의도를 존중하는 편이 길게 갑니다.
Next
- openapi-spec
- rest-api-intro
RFC 9309 — Robots Exclusion Protocol · Playwright 공식 · Puppeteer 공식 · Selenium 공식 · Beautiful Soup · Scrapy · 공공데이터포털 · W3C WebDriver 를 참고합니다.