codingstairs
노트에듀라이프연락
⌕검색⌘K
koen

Navigation

  • Intro
  • Blog
  • Life

연락하기

로그인 없이도 보낼 수 있어요. 답변이 필요하면 이메일을 함께 적어 주세요.

  • 익명 폼으로 의견 남기기 →
  • ✉ warragon112@gmail.com
  • 카카오톡 오픈채팅 ↗

© 2026 codingstairs

  • 노트
  • 에듀
  • 검색
  • 라이프
  • 연락
  • 약관
  • RSS
  • GitHub
노트›backend

크롤러 윤리와 도구

2026-04-28 게시· 2026-05-18 갱신·0회 조회

크롤러 윤리와 도구

공개된 웹 데이터를 수집하는 작업은 기술뿐 아니라 윤리·법규에 닿습니다. 너무 자주 두드리면 상대 서버에 부담을 주고, 약관을 읽지 않으면 법적 문제로 번질 수 있습니다.

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 를 참고합니다.

backend 카테고리의 다른 글

카테고리 전체 보기 →
  • 공공 OpenAPI 는 자체 BFF 로 한 번 감싼다
  • 이메일 발송과 OTP — SMTP
  • 감사로그 — logAdminAction 패턴
  • WebSocket · SSE — 실시간 통신
  • REST API 입문
  • OpenAPI 사양