웹스크래핑이나 크롤링을 할 때 가장 먼저 확인해야 하는 것이 바로 robots.txt (로봇 배제 표준) 파일입니다. 이 사이트에서 어떤 페이지를 긁어가도 되는지, 어떤 페이지는 수집하면 안 되는지 적어둔 일종의 ‘규칙 규약’이죠.
하지만 사이트마다 규칙이 제각각이고 내용이 너무 길어, 이를 일일이 파이썬 코드로 예외 처리하기란 여간 번거로운 일이 아닙니다.
오늘은 파이썬 내장 라이브러리를 활용해 robots.txt 파일을 자동으로 분석하고 규칙을 지켜주는 스마트한 크롤러 제작법을 알아보고, 보안이 까다로운 쿠팡(Coupang)의 로봇 파일에 접근하는 꿀팁까지 모두 정리해 드리겠습니다.
1. robots.txt를 자동으로 읽어주는 robotparser
파이썬에는 표준 라이브러리로 urllib.robotparser 모듈이 기본 포함되어 있습니다. 복잡한 규칙을 직접 파싱할 필요 없이, URL만 지정해 주면 알아서 크롤링 가능 여부를 True 또는 False로 판단해 줍니다.
기본 개념 및 핵심 모듈 불러오기
보통 robots.txt 파일은 도메인 바로 뒤(https://example.com/robots.txt)에 위치합니다. 어떤 주소가 들어오더라도 로봇 파일 경로를 정확하게 매칭하기 위해 urljoin과 RobotFileParser를 함께 사용합니다.
Python
from urllib.parse import urljoin
from urllib.robotparser import RobotFileParser
2. 인프런(Inflearn) 예제로 보는 기본 사용법
먼저 접근이 비교적 자유로운 인프런 강의 페이지를 기준으로 기본 자동화 코드를 작성해 보겠습니다.
Python
# 1. 대상 URL 및 robots.txt 주소 생성
target_url = "https://www.inflearn.com/courses"
# urljoin을 사용하면 도메인 뒤의 세부 경로는 제외하고 자동으로 루트에 robots.txt를 붙여줍니다.
robots_url = urljoin(target_url, "/robots.txt")
# 2. 로봇 파서 초기화 및 파일 읽기
rp = RobotFileParser()
rp.set_url(robots_url)
rp.read()
# 3. 크롤링 가능 여부 판단 (User-Agent 지정)
# 임의의 로봇 이름(mybot)으로 강의 페이지 접근이 가능한지 확인
can_fetch_course = rp.can_fetch("mybot", target_url)
print(f"강의 페이지 크롤링 가능 여부: {can_fetch_course}") # True
# 관리자 페이지처럼 금지된 경로 확인
admin_url = "https://www.inflearn.com/admin"
can_fetch_admin = rp.can_fetch("mybot", admin_url)
print(f"관리자 페이지 크롤링 가능 여부: {can_fetch_admin}") # False
💡 실무 적용 치트키: If문 분기 처리
실제 크롤링 프로그램을 구동할 때는 아래와 같이 if 조건문으로 감싸주면, 사이트 규칙을 절대 위반하지 않는 ‘착한 크롤러’를 만들 수 있습니다.
Python
if rp.can_fetch("mybot", target_url):
# 이곳에 실제 크롤링(BeautifulSoup, Scrapy 등) 코드를 삽입합니다.
print("규칙 통과! 크롤링을 시작합니다.")
else:
print("이 페이지는 해당 봇의 접근이 금지되어 있습니다.")
3. 쿠팡(Coupang) 차단 문제와 해결책 (User-Agent & 헤더 설정)
위 방식으로 쿠팡(https://www.coupang.com)을 시도하면 프로그램이 무한 대기에 빠지거나 응답을 받지 못합니다. 쿠팡은 일반적인 로봇이나 헤더 정보가 없는 접근을 원천 차단하기 때문입니다.
이때는 내장 read() 메소드 대신 requests 라이브러리를 사용해 사람처럼 보이는 브라우저 헤더 정보를 심어서 우회해야 합니다.
해결을 위한 필수 헤더 정보 추가
쿠팡은 단순히 User-Agent만 넣어서는 뚫리지 않는 경우가 많습니다. 브라우저 언어 설정인 Accept-Language를 함께 전송해야 정상적으로 200 OK 응답을 줍니다.
Python
import requests
from urllib.parse import urljoin
from urllib.robotparser import RobotFileParser
target_url = "https://www.coupang.com"
robots_url = urljoin(target_url, "/robots.txt")
# 쿠팡 접근을 위한 웹 브라우저 헤더 설정
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"
}
# requests로 robots.txt 내용 강제 가져오기
response = requests.get(robots_url, headers=headers)
if response.status_code == 200:
rp = RobotFileParser()
# 텍스트를 라인별로 쪼개서 파서에 주입해야 정상 작동합니다.
rp.parse(response.text.splitlines())
# 1) 일반 마이봇으로 검사 시
print("mybot 접근 가능 여부:", rp.can_fetch("mybot", target_url)) # False
# 2) 네이버 검색엔진 봇(NaverBot)으로 검사 시
print("NaverBot 접근 가능 여부:", rp.can_fetch("NaverBot", target_url)) # True
⚠️ 주의 요망: 쿠팡 등 보안이 강력한 사이트는 단시간에 반복적으로 테스트를 요청하면 IP 자체가 차단될 수 있습니다. 테스트 시 요청 간격(Time Sleep)을 넉넉히 두거나 대리 IP(Proxy)를 활용하는 것이 안전합니다.
📌 요약 및 결론
- 사이트마다 다른
robots.txt규칙은 파이썬 내장 모듈RobotFileParser를 쓰면 한 줄로 판단할 수 있다. - 로봇 파일 수집 자체를 차단하는 깐깐한 사이트는
requests모듈과 함께User-Agent,Accept-Language헤더를 조합하여 해결한다. - 가져온 텍스트 데이터는 반드시
.splitlines()를 통해 리스트 형태로 분할하여.parse()에 넘겨주어야 오류가 없다.
합법적이고 안정적인 데이터 수집의 첫걸음은 상호 규약(프로토콜)을 지키는 것입니다. 오늘 배운 템플릿 코드를 여러분의 크롤러 스크립트 상단에 적용하여 안전한 데이터 수집 환경을 구축해 보세요!