Languages/Python

[Python]BeautifulSoup(bs4)를 사용하여 웹 스크래핑하기

MoonSta 2023. 8. 10. 12:49

이번 포스팅에서는 제가 실제 프로젝트에서 사용했고, 파이썬에서 웹 스크래핑을 할 수 있도록 도와주는 라이브러리 하나를 소개하려 합니다.


Beautiful Soup(bs4) 라이브러리

bs4는 파이썬에서 웹 스크래핑 및 데이터 추출을 위한 라이브러리입니다. HTML 및 XML과 같은 마크업 언어로 작성된 웹 페이지의 내용을 파싱하고 구문을 분석하여 원하는 데이터를 추출하는 데 사용됩니다. bs4는 파이썬에서 웹 페이지에 대한 구문을 분석하고 탐색하는 프로세스를 단순하게 만들어주며, 웹 스크래핑을 더 효율적으로 수행할 수 있도록 도와줍니다.


 

Beautiful Soup(bs4)의 특징

이 라이브러리의 특징은 다음과 같습니다.

 

1. HTML 파싱 : Beautiful Soup는 HTML 문서를 파싱 하여 문서의 구조와 내용을 분석할 수 있습니다. HTML을 구성하고 있는 요소 및 태그 그리고 속성을 이해하고 트리 구조로 변환하여 데이터를 추출할 수 있습니다.

 

2. 데이터 추출 : Beautiful Soup를 사용하여 웹 페이지에서 원하는 데이터를 추출할 수 있습니다. 특정 태그의 내용이나, 속성, 텍스트 등을 선택하여 추출할 수 있습니다.

 

3. 문서 탐색 : Beautiful Soup는 태그 이름, 클래스, ID 등을 기반으로 웹 문서를 탐색하고 필요한 정보를 찾을 수 있는 강력한 기능을 제공합니다.

 

4. 웹 스크래핑 : Beautiful Soup를 활용하여 웹 페이지의 특정 부분이나 전체 내용을 스크래핑하여 데이터를 수집하거나 분석할 수 있습니다.


 

Beautiful Soup(bs4)의 설치 및 사용 방법

우선 Beautiful Soup를 설치해 보도록 하겠습니다. 간단하게 pip를 사용하여 설치할 수 있습니다.

pip install beautifulsoup4

 

이제 설치가 완료되었다면 위에 작성했던 bs4의 특징에 대한 예시 코드를 확인해 보도록 하겠습니다.

from bs4 import BeautifulSoup
import requests

# 웹 페이지 가져오기
url = 'https://example.com'
response = requests.get(url)
html = response.text

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

# 특정 태그에서 데이터 추출
title = soup.title.text
print("웹 페이지 제목:", title)

# 클래스 이름을 기반으로 요소 선택
articles = soup.find_all('div', class_='article')
for article in articles:
    print(article.text)

 

한국을 좋아하는 외국인 이성친구 만드는 "케이메이트"

 

 

실제 프로젝트에서 bs4를 어떻게 활용했을까?

 제가 실제로 사용했던 프로젝트는 SVG 파일에 대한 모든 텍스트를 추출하고, 텍스트의 정합성을 검증하는 프로그램을 만드는 것이었습니다. 개발했던 소스는 공유할 수 없지만 제가 스크래핑한 정보를 바탕으로 데이터를 추출할 때 사용했던 메서드에 대해 알아보도록 하겠습니다.

 

#1. find 
#첫 번째 매치되는 요소를 반환한다.
first_div = soup.find('div')

#2. find_all
#모든 요소를 반환한다/
all_divs = soup.find_all('div')

#3. select
#CSS 선택자를 사용하여 요소를 선택합니다
div_with_class = soup.select('.article')

#4. attrs
#요소의 속성에 접근한다.
div_class = soup.find('div')['class']

#5. parent
#부모 요소에 접근한다.
parent_div = soup.find('h1').parent

#6. find_next(), find_previous()
#다음 요소 혹은 이전 요소를 탐색한다.
next_paragraph = soup.find('p').find_next('p')

#7. find_all_next(), find_all_previous()
#다음 요소 혹은 이전 요소를 모두 탐색한다.
all_next_paragraphs = soup.find('p').find_all_next('p')

#8. strings
#요소 내의 모든 텍스트를 추출한다.
text_pieces = soup.find('div').strings