예의를 지키는 스크래핑 관행
robots.txt 준수, 사용자 에이전트 헤더, 요청 지연, 캐싱을 다룹니다.
예의를 지키는 스크래핑 관행은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
예의를 지키는 스크래핑이 중요한 이유
웹 스크래핑은 서버에 부담을 주고, 서비스 이용 약관을 위반하며, 에이전트의 IP가 차단되는 원인이 될 수 있습니다. 책임감 있는 스크래퍼는 요청 빈도 제한을 지키고, 자신을 밝히며, 웹사이트가 공개한 규칙을 준수합니다.
이 레슨에서는 윤리적이고 지속 가능한 스크래핑을 위한 도구와 기법을 다룹니다.
robots.txt 확인
모든 웹사이트는 자동화된 에이전트가 접근할 수 있거나 접근할 수 없는 경로를 지정하는 robots.txt 파일을 게시할 수 있습니다. Python 표준 라이브러리에는 이 파일을 파싱하는 urllib.robotparser가 포함되어 있습니다.
사이트를 스크래핑하기 전에 항상 robots.txt를 확인하세요.
import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
# Check if our bot can fetch a specific path
can_fetch = rp.can_fetch('MyAgent/1.0', 'https://example.com/public-data')
print(f'Can fetch: {can_fetch}') # True or False
cannot_fetch = rp.can_fetch('*', 'https://example.com/private/admin')
print(f'Admin allowed: {cannot_fetch}') # Often False설명적인 사용자 에이전트 설정
User-Agent HTTP 헤더는 요청을 보내는 주체를 식별합니다. 정직한 사용자 에이전트를 사용하면 사이트 관리자가 봇의 정체와 문제가 발생했을 때 연락할 방법을 알 수 있습니다. 차단을 피하려고 브라우저로 위장하는 것은 윤리적인 문제를 일으킵니다.
import httpx
headers = {
# Honest, descriptive User-Agent
'User-Agent': 'MyResearchBot/1.0 (contact: me@example.com; purpose: academic research)'
}
response = httpx.get(
'https://example.com/data',
headers=headers,
timeout=10.0
)
print(response.status_code)time.sleep()으로 요청 빈도 제한하기
초당 수백 건의 요청을 보내면 서버가 과부하될 수 있으며, 이러한 행위는 흔히 서비스 거부 공격으로 간주됩니다. time.sleep()을 사용해 요청 사이에 지연 시간을 추가하세요. random.uniform()을 사용하면 지연을 덜 기계적으로 만들어 사람의 동작과 비슷하게 할 수 있습니다.
import time
import random
import httpx
urls = [
'https://example.com/page/1',
'https://example.com/page/2',
'https://example.com/page/3'
]
for url in urls:
response = httpx.get(url, timeout=10.0)
print(f'Fetched {url}: {response.status_code}')
# Wait between 1 and 3 seconds before the next request
delay = random.uniform(1, 3)
print(f'Sleeping {delay:.1f}s...')
time.sleep(delay)재시도 대기 헤더 존중
서버가 429 Too Many Requests로 응답하면, 대개 몇 초를 기다려야 하는지 지정하는 Retry-After 헤더가 포함됩니다. 에이전트는 이를 읽고 즉시 다시 요청하지 말고 지정된 대기 시간을 준수해야 합니다.
import time
import httpx
def fetch_with_retry(url: str) -> httpx.Response:
while True:
response = httpx.get(url, timeout=10.0)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 5))
print(f'Rate limited. Waiting {retry_after}s...')
time.sleep(retry_after)
continue # retry
response.raise_for_status()
return response반복 가져오기를 피하기 위한 응답 캐싱
요청 캐시는 HTTP 응답을 디스크에 자동으로 저장합니다. 에이전트가 같은 주소를 여러 번 가져와야 하는 경우(예: 개발 중 또는 재실행 시), 서버에 다시 요청하지 않고 저장된 응답을 즉시 반환할 수 있습니다.
# pip install requests-cache
import requests_cache
# Install the cache globally — cached responses expire after 1 hour
requests_cache.install_cache(
'agent_cache',
backend='sqlite',
expire_after=3600 # seconds
)
import requests
# First call: fetches from network and caches
response = requests.get('https://api.example.com/data')
print(response.from_cache) # False
# Second call: returns cached result instantly
response2 = requests.get('https://api.example.com/data')
print(response2.from_cache) # Truehttpx를 사용한 수동 파일 기반 캐싱
요청 캐시를 사용하지 않으려면 간단한 파일 기반 캐시가 효과적입니다. 주소의 해시를 키로 사용해 응답을 JSON 파일로 저장하고, 파일이 충분히 최신이면 다시 불러오세요.
import hashlib
import json
import os
import time
import httpx
CACHE_DIR = '/tmp/agent_cache'
os.makedirs(CACHE_DIR, exist_ok=True)
def cached_get(url: str, ttl_seconds: int = 3600) -> dict:
key = hashlib.md5(url.encode()).hexdigest()
cache_file = os.path.join(CACHE_DIR, key + '.json')
if os.path.exists(cache_file):
age = time.time() - os.path.getmtime(cache_file)
if age < ttl_seconds:
with open(cache_file) as f:
return json.load(f)
response = httpx.get(url, timeout=10.0)
response.raise_for_status()
data = response.json()
with open(cache_file, 'w') as f:
json.dump(data, f)
return data서비스 이용 약관 읽기
사이트를 스크래핑하기 전에 해당 사이트의 서비스 이용 약관을 읽으세요. 많은 약관은 자동화된 접근이나 데이터의 상업적 이용을 명시적으로 금지합니다. 서비스 약관을 위반하면 IP 차단뿐 아니라 법적 조치를 받을 수 있습니다.
공식 응용 프로그램 인터페이스가 있다면 HTML을 스크래핑하는 것보다 항상 공식 인터페이스를 우선하세요. 더 빠르고 안정적이며 법적으로도 더 안전합니다.
오류 발생 시 지수 백오프
요청이 실패했을 때 즉시 다시 시도하지 마세요. 지수 백오프를 사용해 1초, 2초, 4초와 같이 대기 시간을 늘리세요. 이렇게 하면 문제가 발생한 서버에 계속 부하를 주는 일을 피할 수 있으며, 실제 운영 에이전트에서 사용하는 전문적인 방식입니다.
import time
import httpx
def fetch_with_backoff(url: str, max_retries: int = 4) -> dict:
for attempt in range(max_retries):
try:
response = httpx.get(url, timeout=10.0)
response.raise_for_status()
return response.json()
except (httpx.HTTPStatusError, httpx.RequestError) as e:
if attempt == max_retries - 1:
raise
wait = 2 ** attempt # 1, 2, 4, 8 seconds
print(f'Attempt {attempt+1} failed: {e}. Retrying in {wait}s...')
time.sleep(wait)
return {}필요한 것만 스크래핑하기
에이전트에 실제로 필요한 것만 가져와 서버 부하를 최소화하세요. 작은 응용 프로그램 인터페이스 끝점에서 같은 데이터를 반환할 수 있다면 전체 페이지를 다운로드하지 마세요. 전체 본문을 가져오기 전에 리소스가 변경되었는지 확인하려면 HEAD 요청을 사용하세요.
import httpx
def has_page_changed(url: str, last_etag: str = None) -> bool:
headers = {}
if last_etag:
headers['If-None-Match'] = last_etag
response = httpx.head(url, headers=headers, timeout=5.0)
if response.status_code == 304: # Not Modified
return False
new_etag = response.headers.get('ETag')
print(f'New ETag: {new_etag}')
return True예의를 지키는 스크래핑 규칙 요약
에이전트가 사이트를 스크래핑하기 전에 확인할 간단한 목록입니다.
robots.txt를 확인하고 접근 금지 규칙을 준수하기- 정직하고 설명이 분명한
User-Agent설정하기 - 요청 사이에 무작위 지연 시간 추가하기(
time.sleep(random.uniform(1,3))) - 429 응답의
Retry-After헤더 준수하기 - 중복 가져오기를 피하도록 응답 캐시하기
- 사이트의 서비스 이용 약관 읽기
- 가능한 경우 HTML 스크래핑보다 공식 응용 프로그램 인터페이스 우선하기
지식 확인: 예의를 지키는 스크래핑
윤리적이고 예의를 지키는 스크래핑 방식에 대한 이해도를 확인해 보세요.
복습: 예의를 지키는 스크래핑 방식
이제 책임감 있게 스크래핑하기 위한 도구를 모두 갖추었습니다.
- 접근이 허용되는 항목을 확인하는
robotparser - 봇을 식별하는 설명이 분명한
User-Agent헤더 - 요청 사이에 사용하는
time.sleep(random.uniform(1,3)) - 중복 가져오기를 피하기 위한
requests-cache또는 수동 캐싱 - 오류 처리를 위한 지수 백오프
- 법적 인식: 항상 서비스 약관을 확인하기
책임감 있는 스크래핑은 더 건강한 웹 환경을 만들고 에이전트가 차단 없이 계속 실행되도록 합니다.
AI 튜터와 함께 AI Agents을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 60
- 레슨
- 239
자주 묻는 질문
“예의를 지키는 스크래핑 관행” 강의는 무료인가요?
네 — “예의를 지키는 스크래핑 관행” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
“예의를 지키는 스크래핑 관행”에서 뭘 배우나요?
robots.txt 준수, 사용자 에이전트 헤더, 요청 지연, 캐싱을 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Agents을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“예의를 지키는 스크래핑 관행” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.