devOmnivore

웹 스크래핑 실패 사례 분석 및 성공 전략 배치 파일과 Python 활용

devOMNIVORE 2025. 1. 2. 16:32
반응형

웹 스크래핑을 배치 파일과 Python을 활용하여 자동화하고 정리하는 것은 효율성을 높이는 좋은 방법입니다. 하지만 구현 과정에서 실패 사례나 문제가 발생할 수 있습니다. 이번 글에서는 배치 파일로 웹 스크래핑을 구현하며 발생할 수 있는 문제, 해결 방법, 주의사항을 중심으로 자세히 살펴보고, 이 작업을 성공적으로 수행하기 위한 팁을 제공합니다.

 

웹 스크래핑 실패 사례 분석 및 성공 전략 배치 파일과 Python 활용


1. 배치 파일로 웹 스크래핑 구현: 기본 설정

배치 파일 작성

배치 파일은 Windows 환경에서 명령어를 자동화하는 스크립트입니다. 아래는 기본적인 웹 스크래핑을 수행하는 배치 파일 예제입니다.

@echo off
setlocal enabledelayedexpansion

rem URL 설정
set "url=http://example.com"

rem User-Agent 설정
set "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"

rem 저장 파일 설정
set "output_file=output.html"

rem curl을 사용하여 URL 요청 및 HTML 저장
curl -A "!user_agent!" "!url!" > "!output_file!"

rem 요청 결과 출력
if exist "!output_file!" (
    echo Scraping successful: Output saved to "!output_file!"
) else (
    echo Scraping failed: Unable to save output.
)

배치 파일 실행 방법

  1. 위 코드를 메모장에 붙여넣고 scrape.bat로 저장합니다.
  2. 명령 프롬프트를 열고 해당 배치 파일이 위치한 디렉토리로 이동합니다.
  3. scrape.bat를 실행합니다.

2. 발생할 수 있는 실패 사례

사례 1: HTTP 요청 실패

문제 상황

  • 잘못된 URL 또는 서버 응답 문제로 인해 요청이 실패할 수 있습니다.
  • HTTP 상태 코드 404(페이지 없음), 500(서버 오류) 등이 반환될 수 있습니다.

해결 방법

  • curl 명령에서 HTTP 상태 코드를 저장하고 이를 분석하여 적절한 처리를 수행합니다.
@echo off
setlocal enabledelayedexpansion

rem URL 설정
set "url=http://example.com/nonexistent"

rem User-Agent 설정
set "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"

rem 상태 코드 저장
curl -A "!user_agent!" -o "output.html" -w "%{http_code}" "!url!" > status.txt

set /p status=

사례 2: 웹 페이지 구조 변경

문제 상황

  • 웹 페이지의 HTML 구조(예: 클래스 이름, 태그)가 변경되면 스크래핑 코드가 제대로 작동하지 않습니다.

해결 방법

  • Python과 BeautifulSoup을 사용하여 HTML 구조를 유연하게 처리하도록 코드를 작성합니다.
  • HTML 구조가 변경되었는지 정기적으로 확인하고 스크립트를 업데이트합니다.
from bs4 import BeautifulSoup
import requests

url = 'http://example.com'

response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    # 데이터 추출 (HTML 구조 변경 시 수정 필요)
    data = soup.select('.target-class')  # 클래스 이름을 동적으로 조정
    for item in data:
        print(item.text)
else:
    print(f"Failed to retrieve webpage: {response.status_code}")

사례 3: 데이터 저장 실패

문제 상황

  • 저장 파일 경로에 대한 권한 부족 또는 디스크 공간 부족으로 저장이 실패할 수 있습니다.

해결 방법

  • 저장 작업에 대한 오류 처리를 추가합니다.
import csv

data = ["example1", "example2", "example3"]

try:
    with open('output.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(["Header"])
        for item in data:
            writer.writerow([item])
    print("Data successfully saved.")
except IOError as e:
    print(f"Failed to save data: {e}")

사례 4: IP 차단 또는 캡차 발생

문제 상황

  • 동일한 IP에서 과도한 요청을 보내면 서버에서 차단되거나 캡차가 요구될 수 있습니다.

해결 방법

  • 대기 시간 추가: 요청 사이에 일정 시간 간격을 둡니다.
  • 프록시 사용: 여러 IP를 순환하여 요청을 보냅니다.
import requests
import time

proxies = ['http://proxy1', 'http://proxy2', 'http://proxy3']

for proxy in proxies:
    try:
        response = requests.get('http://example.com', proxies={"http": proxy, "https": proxy})
        if response.status_code == 200:
            print("Request successful")
            break
        else:
            print(f"Failed with status: {response.status_code}")
    except Exception as e:
        print(f"Proxy {proxy} failed: {e}")
    time.sleep(5)  # 대기 시간 추가

3. 최적화 및 꿀팁

법적 준수

  • robots.txt 확인: 웹사이트의 크롤링 허용 여부를 확인합니다.
  • 데이터 사용 약관 검토: 스크래핑 데이터의 활용 범위를 명확히 합니다.

로그 기록 유지

  • 작업 기록을 남겨 문제 발생 시 원인을 쉽게 추적할 수 있도록 합니다.
rem 로그 파일 작성
echo Scraping started at %date% %time% > scrape.log

API 활용

  • 공식 API가 제공되는 경우 이를 활용하여 안정적으로 데이터를 수집합니다.

4. 결론

배치 파일과 Python을 활용한 웹 스크래핑은 데이터 수집 및 자동화를 구현하는 강력한 도구입니다. 그러나 HTTP 요청 실패, HTML 구조 변경, 저장 실패 등의 문제가 발생할 수 있으므로, 이를 해결하기 위한 오류 처리와 모니터링이 중요합니다.

위의 방법과 꿀팁을 적용하여 안정적이고 효율적인 웹 스크래핑을 구현해 보세요!

반응형