[파이썬] Beautiful Soup 4 웹 스크레이핑 오류 처리 및 로깅

Beautiful Soup 4은 파이썬의 웹 스크레이핑 라이브러리로서, HTML 및 XML 문서를 분석하고 데이터를 추출하는 강력한 도구입니다. 그러나 웹 스크레이핑 작업 중 오류가 발생할 수도 있습니다. 이러한 오류를 처리하고 로깅을 추가하여 디버깅과 모니터링을 용이하게 할 수 있습니다.

오류 처리

Beautiful Soup 4로 웹 스크레이핑 작업을 수행하면서 다양한 오류가 발생할 수 있습니다. 그 중 일부 오류에는 다음과 같은 것들이 있습니다:

  1. HTTP 요청 오류 (예: 404 Not Found, 500 Internal Server Error)
  2. HTML 또는 XML 파싱 오류 (예: 스크립트 오류, 형식이 맞지 않는 태그 등)
  3. 웹 페이지 구조 변경으로 인한 선택자 오류 (예: CSS 선택자 또는 XPath 선택자 오류)

이러한 오류를 처리하기 위해 Beautiful Soup 4은 try-except 문을 사용하여 예외를 처리할 수 있습니다. 예를 들어, HTTP 요청 오류가 발생한 경우에는 requests 패키지를 사용하여 예외를 처리할 수 있습니다:

import requests 
from bs4 import BeautifulSoup

try:
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    # 웹 스크레이핑 작업 수행
except requests.exceptions.RequestException as e:
    print("HTTP 요청 오류:", e)

또한, HTML 또는 XML 파싱 오류가 발생한 경우에는 BeautifulSoup 객체 생성 시 try-except 문을 사용하여 예외를 처리할 수 있습니다:

try:
    soup = BeautifulSoup(html, 'html.parser')
    # 웹 스크레이핑 작업 수행
except BeautifulSoup.ParserError as e:
    print("HTML/XML 파싱 오류:", e)

로깅

웹 스크레이핑 작업 중 오류를 식별하고 디버깅하기 위해서는 로깅이 매우 유용합니다. Python은 logging 모듈을 사용하여 로깅을 구현할 수 있습니다. 예를 들어, 다음과 같이 오류 메시지를 기록하는 로깅 설정을 추가할 수 있습니다:

import logging

logging.basicConfig(filename='web_scraping.log', level=logging.ERROR, format='%(asctime)s:%(levelname)s:%(message)s')

try:
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    # 웹 스크레이핑 작업 수행
except requests.exceptions.RequestException as e:
    logging.error("HTTP 요청 오류: %s", e)

위의 예제에서는 logging.basicConfig() 함수를 사용하여 로깅 설정을 구성하고, logging.error() 함수를 사용하여 오류 메시지를 기록합니다. 로그는 ‘web_scraping.log’ 파일에 기록되며, 오류 수준 이상의 메시지만 기록됩니다.

또한, 로그의 형식을 지정하기 위해 format 매개변수를 사용할 수 있습니다. %(asctime)s는 로그 메시지의 작성 시간을 말하고, %(levelname)s는 로그 메시지의 수준을 말합니다.

로그 파일을 확인하여 오류 메시지를 식별하고 디버깅하는 것은 웹 스크레이핑 작업을 향상시키는 데 도움을 줄 수 있습니다.

결론

Beautiful Soup 4을 사용하여 웹 스크레이핑 작업을 수행할 때, 오류 처리와 로깅을 고려하는 것이 중요합니다. 오류 처리를 통해 예외 상황을 처리하고, 로깅을 통해 오류 메시지를 기록할 수 있습니다. 이를 통해 스크레이핑 작업을 안정적으로 수행하고 디버깅하는 것이 가능해집니다.