Scarnox · Blog

스크래핑할 때 캡차를 피하는 법 (규칙을 지키면서)

스크래핑 중 나타나는 캡차 대부분은 자동화로 보이는 트래픽에 대한 반응입니다. 가장 저렴한 대응은 캡차를 유발하지 않는 것입니다. 즉, 합법적인 데이터 소스를 먼저 찾고, 사이트의 규칙이 무엇을 허용하는지 확인하고, 요청을 줄이고 천천히 보내며, 같은 페이지를 두 번 가져오지 않는 것입니다. 캡차를 푸는 것은 피할 수 없는 경우를 위한 대비책이지, 계획의 중심이 아닙니다.

먼저 공식 API나 피드가 있는지 확인하세요

스크래핑 대상이 되는 많은 사이트는 캡차 없이 같은 데이터를 얻는 방법을 이미 제공합니다. 공개 API, 데이터 내보내기, RSS나 사이트맵 피드, 파트너 프로그램 등이 그렇습니다. 공식 소스는 더 안정적이고, 예고 없이 바뀔 가능성이 낮으며, 사이트 운영자가 데이터 사용 방식에 대해 의견을 낼 수 있게 해 줍니다. 다음을 찾아보세요.

이 중 하나가 필요한 데이터를 제공한다면 그것을 사용하세요. HTML을 요청하지 않으면 대부분의 캡차를 피할 수 있습니다.

robots.txt와 요청 간격을 존중하세요

robots.txt는 자동화된 클라이언트가 가져올 수 있는 경로를 알려 주고, 때로는 요청 사이에 얼마나 기다려야 하는지도 알려 줍니다. 파이썬 표준 라이브러리로 이 파일을 읽을 수 있습니다.

import time
from urllib.robotparser import RobotFileParser
import requests

USER_AGENT = "ExampleBot/1.0 (+https://example.com/bot)"

parser = RobotFileParser()
parser.set_url("https://example.com/robots.txt")
parser.read()

delay = parser.crawl_delay(USER_AGENT) or 5  # 보수적인 기본값 5초로 대체
urls = [
    "https://example.com/products?page=1",
    "https://example.com/products?page=2",
]

last_request = 0.0
for url in urls:
    if not parser.can_fetch(USER_AGENT, url):
        print("skipped by robots.txt:", url)
        continue
    wait = delay - (time.monotonic() - last_request)
    if wait > 0:
        time.sleep(wait)
    resp = requests.get(url, headers={"User-Agent": USER_AGENT}, timeout=30)
    last_request = time.monotonic()
    print(url, resp.status_code)

robots.txt가 특정 경로를 허용하지 않는다면, 정직한 답은 그 경로를 건드리지 않거나 사이트 운영자에게 문의하는 것입니다. 브라우저로 우회한다고 해서 사이트가 요청한 내용이 바뀌지는 않습니다.

속도를 낮추고 요청을 분산하세요

일정하고 적당한 속도는 캡차를 거의 유발하지 않지만, 짧은 시간에 몰아치는 요청은 거의 항상 캡차를 부릅니다. 몇 가지 습관만으로도 차이가 큽니다.

캐싱하고 다시 가져오지 마세요

요청하지 않은 모든 요청은 사이트가 처리할 필요가 없는 요청입니다. 가져온 페이지를 날짜와 본문 해시와 함께 저장하고, 내용이 바뀌었을 가능성이 높을 때만 다시 가져오세요. If-Modified-Since나 ETag 헤더를 사용한 조건부 요청은, 서버가 지원하는 경우 "변경되지 않음"을 저렴하게 응답하게 해 줍니다.

세션을 재사용하고 일반적인 헤더를 보내세요

요청 사이에 쿠키를 유지하는 세션은, 매번 새로 시작하는 스크립트보다 방문자처럼 동작합니다. 사이트마다 requests.Session()을 사용하고, 봇 이름과 연락처가 드러나는 명확하고 정직한 User-Agent를 보내세요. 규칙을 피하려고 브라우저인 척하지 마세요. 사이트가 콘텐츠를 보여 주기 위해 JavaScript를 필요로 한다면 해당 페이지에는 브라우저 도구를 사용하되, 같은 요청 제한을 지키세요.

그래도 캡차가 나타날 때

아무리 조심스럽게 행동해도 캡차를 띄우는 사이트가 있습니다. 코드에서 이를 감지하고, 페이지를 계속 두드리지 말고 해당 작업을 멈추세요. 감지 방법과 PopularCaptcha를 푸는 선택적 방법은 웹 스크래핑 캡차에서 다룹니다.

시작 전에 크롤링을 계획하세요

모든 것을 매일 가져오는 크롤링은 캡차를 유발하는 가장 쉬운 방법입니다. 작업을 먼저 계획하세요.

이런 계획은 요청 수를 줄여 주며, 이것이 여러분이 가진 가장 큰 수단입니다.

계획은 짧은 설정 파일이나 표로 적어 두세요. 사이트, 섹션, 갱신 주기, 사이트별 일일 요청 예산을 적습니다. 예산을 다 쓰면 다음 시간대까지 작업을 멈춥니다. 예산을 지침이 아닌 엄격한 한계로 다루는 것이, 크롤러가 캡차를 유발하는 트래픽 패턴으로 흘러가지 않게 막아 줍니다. 몇 주에 한 번씩 예산을 다시 검토하세요. 성장하는 사이트는 트래픽도 늘어날 수 있으며, 지난 분기에 적절했던 속도가 지금도 적절하다는 보장은 없습니다.

스크래핑은 책임감 있게

다음 단계