robots.txt 규칙 지키는 파이썬 웹 크롤링 프로그램 만드는 방법

웹 크롤링, 스크래핑 프로그램을 만들 때 이 웹사이트를 크롤링 해도 되는지, 되더라도 어떤 페이지가 허용되는지 알려면 웹사이트의 robots.txt 파일을 보면 됩니다.
그런데 대부분의 대형 사이트는 robots.txt 파일이 꽤 길고 복잡한 경우도 많고 사이트마다 규칙도 다릅니다. 그렇기 때문에 매번 직접 읽어보고 규칙을 적용하는 건 상당히 번거로운 일이 될 겁니다.
하지만 파이썬에는 robots.txt 파일을 읽고 크롤링 규칙을 알아서 판단해 주는 urllib.robotparser 모듈의 RobotFileParser 클래스가 있습니다.
import requests
from urllib.parse import urljoin
from urllib.robotparser import RobotFileParser
# 크롤링하려는 URL을 설정합니다.
url = "https://kimfl.net"
# robots.txt 파일의 URL을 구성합니다.
robot_url = urljoin(url, "/robots.txt")
print(robot_url)
# robots.txt 파일을 파싱하기 위한 RobotFileParser 객체를 생성합니다.
robot_parser = RobotFileParser()
robot_parser.set_url(robot_url)
# HTTP 요청 헤더를 설정합니다.
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
"Accept-Language": "ko-KR,ko;q=0.9"
}
# robots.txt 파일을 요청하여 응답을 받습니다.
r = requests.get(robot_url, headers=headers)
# 요청이 성공하면 robots.txt 파일을 파싱합니다.
if r.status_code == 200:
# robots.txt 파일의 내용을 한 줄씩 분리하여 파싱합니다.
robot_parser.parse(r.text.splitlines())
# "Mybot"이 해당 URL에 접근할 수 있는지 확인합니다.
if robot_parser.can_fetch("Mybot", url):
print("Allow")
# 크롤링 코드
else:
print("Disallow")
else:
print(r.status_code)
위 코드를 실행하면 url로 설정된 kimfl.net의 robots.txt 파일의 내용을 분석합니다. 규칙에 따라 크롤링이 가능하다면 Allow가 출력되고 불가능하다면 Disallow가 출력됩니다.
# 크롤링하려는 URL을 설정합니다.
url = "https://kimfl.net"
# robots.txt 파일의 URL을 구성합니다.
robot_url = urljoin(url, "/robots.txt")
print(robot_url)
대부분의 웹사이트는 robots.txt 파일이 존재합니다. 하지만 모든 웹사이트 소유자가 이 파일을 작성하는 것은 아니므로 robots.txt 파일이 없는 사이트도 존재합니다. 이런 사이트를 크롤링을 할 때는 항상 해당 사이트의 이용 약관 및 정책을 확인하는 것이 좋습니다.
# HTTP 요청 헤더를 설정합니다.
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
"Accept-Language": "ko-KR,ko;q=0.9"
}
# robots.txt 파일을 요청하여 응답을 받습니다.
r = requests.get(robot_url, headers=headers)
HTTP 요청 헤더는 필수 사항은 아닙니다. 하지만 사이트에 따라서 헤더 값이 없을 때 접속 자체가 불가능한 경우가 있으니 기본으로 설정해놓는 게 좋습니다.
# 요청이 성공하면 robots.txt 파일을 파싱합니다.
if r.status_code == 200:
# robots.txt 파일의 내용을 한 줄씩 분리하여 파싱합니다.
robot_parser.parse(r.text.splitlines())
# "Mybot"이 해당 URL에 접근할 수 있는지 확인합니다.
if robot_parser.can_fetch("Mybot", url):
print("Allow")
# 크롤링 코드
else:
print("Disallow")
else:
print(r.status_code)
보통 robots.txt에는 Googlebot, Yeti 등 대형 검색 엔진의 유명한 로봇들만 명시되어 있기 때문에 코드에서 사용하는 로봇의 이름은 임의로 설정하면 됩니다. 위 코드에서는 Mybot을 사용하였습니다.
만약 크롤링이 허용된다면 Allow가 출력됩니다. # 크롤링 코드 부분에 실제 사용할 크롤링 코드를 작성하고 실행시키면 Allow이 출력 될 때만 크롤링을 진행하게 됩니다.
관련 동영상: robots.txt 규칙 지키는 크롤링 프로그램 만드는 방법