Python/Python 심화

웹 스크래핑을 위한 Python BeautifulSoup와 Scrapy

임베디드 친구 2025. 8. 4. 20:10
728x90
반응형

웹 스크래핑을 위한 Python BeautifulSoup와 Scrapy

웹 스크래핑(Web Scraping)은 웹사이트에서 데이터를 추출하는 기술로, 데이터를 분석하거나 저장하려는 목적에서 많이 사용됩니다. 이 포스팅에서는 Python의 인기 있는 웹 스크래핑 도구인 BeautifulSoup와 Scrapy를 사용하여 실전 예제와 함께 웹 스크래핑 방법을 소개합니다.


1. 웹 스크래핑의 기본 개념

웹 스크래핑은 클라이언트가 HTML을 다운로드하여 원하는 데이터를 추출하는 프로세스를 말합니다. 웹 스크래핑은 크롤링(Crawling)과 함께 사용되기도 합니다. 크롤링은 웹 페이지를 탐색하는 작업을 뜻합니다.

웹 스크래핑을 시작하기 전, 다음 사항을 기억해야 합니다:

  • Robots.txt: 웹사이트의 robots.txt 파일을 확인하여 크롤링 허용 여부를 확인합니다.
  • 법적 준수: 스크래핑이 사이트의 약관이나 법적 규제를 위반하지 않도록 주의합니다.

2. BeautifulSoup를 활용한 웹 스크래핑

BeautifulSoup란?

BeautifulSoup는 Python의 웹 스크래핑 라이브러리로, HTML과 XML 파일을 파싱하고 데이터를 추출하는 데 사용됩니다. 이 라이브러리는 간단한 HTML 구조 탐색과 데이터 추출에 적합합니다.

설치하기

pip install beautifulsoup4 requests

기본 사용법

BeautifulSoup를 사용하여 간단히 웹 페이지의 제목을 추출하는 방법을 알아보겠습니다.

예제: 웹 페이지 제목 추출

from bs4 import BeautifulSoup
import requests

# URL 요청
url = "https://example.com"
response = requests.get(url)

# BeautifulSoup 객체 생성
soup = BeautifulSoup(response.text, 'html.parser')

# 제목 추출
title = soup.title.string
print(f"웹 페이지 제목: {title}")

고급 사용법

특정 데이터 추출하기

BeautifulSoup의 findfind_all 메서드를 사용하여 특정 요소를 추출할 수 있습니다.

# 모든 링크 추출하기
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

# 특정 클래스의 요소 추출하기
elements = soup.find_all('div', class_='example-class')
for element in elements:
    print(element.text)

3. Scrapy를 활용한 웹 스크래핑

Scrapy란?

Scrapy는 강력한 웹 크롤링 및 스크래핑 프레임워크입니다. 대량의 데이터를 효율적으로 수집하거나 여러 웹 페이지를 탐색해야 하는 경우에 적합합니다.

설치하기

pip install scrapy

Scrapy 프로젝트 생성

Scrapy를 사용하려면 프로젝트를 생성하고 스파이더(Spider)라는 크롤러를 작성해야 합니다.

프로젝트 생성

scrapy startproject myproject
cd myproject

스파이더 생성

scrapy genspider example example.com

스파이더 코드 작성

아래는 예제 스파이더 코드입니다. 이 코드는 특정 웹사이트의 제목과 링크를 추출합니다.

예제: 제목과 링크 추출하기

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    allowed_domains = ['example.com']
    start_urls = ['https://example.com']

    def parse(self, response):
        # 제목 추출
        title = response.xpath('//title/text()').get()
        print(f"제목: {title}")

        # 링크 추출
        links = response.xpath('//a/@href').getall()
        for link in links:
            print(f"링크: {link}")

실행하기

스파이더를 실행하려면 다음 명령을 입력합니다.

scrapy crawl example

Scrapy의 추가 기능

Scrapy는 데이터 저장, AJAX 처리, 동적 콘텐츠 크롤링 등 다양한 고급 기능을 지원합니다. 데이터를 JSON, CSV 등으로 저장하려면 다음 명령을 사용할 수 있습니다.

scrapy crawl example -o output.json

4. BeautifulSoup vs Scrapy 비교

특징 BeautifulSoup Scrapy
설치 및 사용 간단 상대적으로 복잡
성능 소규모 데이터 스크래핑에 적합 대규모 데이터 크롤링 및 스크래핑에 적합
기능 데이터 파싱에 강점 데이터 크롤링, 저장, 파이프라인 등 통합
학습 곡선 낮음 높음

5. 웹 스크래핑 팁

  1. Request 제한: time.sleep()이나 random 모듈을 사용해 요청 간격을 조정하여 서버에 부담을 줄입니다.
  2. User-Agent 설정: 요청 헤더에 User-Agent를 설정하여 합법적인 사용자처럼 보이도록 합니다.
  3. Proxy 사용: IP 차단을 방지하려면 프록시를 사용합니다.
  4. 데이터 정제: BeautifulSoup와 Scrapy로 추출한 데이터는 필요에 따라 Pandas 등으로 정제합니다.
# Pandas로 데이터 정제
import pandas as pd

# 예제 데이터
data = {'Title': ['Example 1', 'Example 2'], 'Link': ['https://example1.com', 'https://example2.com']}

# 데이터프레임 생성
df = pd.DataFrame(data)
print(df)

6. 결론

이번 포스팅에서는 BeautifulSoup와 Scrapy를 사용하여 웹 스크래핑을 수행하는 방법을 살펴보았습니다. BeautifulSoup는 간단한 작업에 적합하며, Scrapy는 복잡한 크롤링 작업에 유용합니다. 실전에서 적합한 도구를 선택하여 원하는 데이터를 효율적으로 수집해보세요.

728x90
반응형