[Python] URL 라이브러리 403 에러 해결하기 (urllib/requests)

2024. 11. 14. 21:26Python

서론

안녕하세요! 오늘은 웹 크롤링을 하다 보면 자주 마주치게 되는 403 에러에 대해 이야기해보려고 합니다. 특히 Python의 urllib이나 requests를 사용할 때 자주 발생하는데요, 이 문제를 어떻게 해결할 수 있는지 알아보겠습니다.

무엇이 문제일까?

403 에러가 발생하는 주된 이유는 웹사이트에서 봇이나 자동화된 접근을 차단하기 때문입니다. 특히 다음과 같은 경우에 자주 발생합니다:

  1. 기본 헤더로만 접근할 때
  2. 접근 패턴이 봇처럼 보일 때
  3. 특정 라이브러리의 시그니처가 감지될 때

해결 방법 살펴보기

1. 다양한 헤더 시도하기

import requests

# 여러 가지 헤더를 준비
headers_1 = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

headers_2 = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15'
}

try:
    # 첫 번째 헤더로 시도
    response = requests.get('https://example.com', headers=headers_1)
    print("성공!")
except:
    # 실패하면 두 번째 헤더로 시도
    response = requests.get('https://example.com', headers=headers_2)

2. 가짜 헤더 생성하기

import random

# User-Agent 목록
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...',
    'Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) ...'
]

headers = {
    'User-Agent': random.choice(user_agents),
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3',
}

3. 동적 크롤링 시도하기

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# Selenium 설정
chrome_options = Options()
chrome_options.add_argument('--headless')  # 헤드리스 모드
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

# 브라우저 실행
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://example.com')

# 페이지 내용 가져오기
content = driver.page_source
driver.quit()

4. HTML 직접 파싱하기 (마지막 수단)

from bs4 import BeautifulSoup

# HTML 문자열 (직접 브라우저에서 복사한 HTML)
html_content = """
<html>
    <body>
        <div class="content">
            원하는 내용
        </div>
    </body>
</html>
"""

# BeautifulSoup으로 파싱
soup = BeautifulSoup(html_content, 'html.parser')
content = soup.find('div', class_='content')

주의할 점

  1. 웹사이트의 robots.txt를 반드시 확인하세요.
  2. 과도한 요청은 피해야 합니다.
  3. 웹사이트의 이용약관을 확인하세요.
  4. 필요한 경우 해당 웹사이트 관리자에게 허가를 받으세요.

마치며

403 에러는 크롤링을 하다 보면 정말 자주 마주치게 되는 문제인데요, 위의 방법들을 순차적으로 시도해보면 대부분의 경우 해결할 수 있습니다. 다만, 웹사이트의 정책과 규칙을 준수하면서 크롤링하는 것이 중요합니다.

다음에는 또 다른 크롤링 팁으로 찾아뵙도록 하겠습니다. 감사합니다! 😊