Seung's Learning Record
[Python] 웹 스크래핑 라이브러리 - beautifulsoup 본문
≣ 목차
지난 포스팅에서는 웹 스크래핑과 웹 크롤링 두 가지 개념에 대해서 간략하게 알아봤었다. 오늘은 웹 스크래핑에 사용되는 Python 라이브러리 중 하나인 BeautifulSoup에 대해서 알아보자.
BeautifulSoup
BeautifulSoup 란?
위에서 말했듯이, BeautifulSoup는 웹 스크래핑을 위한 파이썬 라이브러리이며, 주로 HTML 및 XML 문서에서 데이터를 추출하고 구문을 분석하는 데 사용된다. 일반적으로 requests 메서드를 통해 가져온 값을 HTML로 파싱 후, 변환된 값에 beautifulSoup를 적용하며 사용한다.
사용법
beautifulSoup의 기본적인 사용법은 다음과 같다. 우선 라이브러리를 import한 후 객체를 생성해 메서드들을 사용하기만 하면 되기때문에 간단히 이해할 수 있을것이다.
from bs4 import BeautifulSoup
# BeautifulSoup 객체 생성
soup = BeautifulSoup(html_doc, 'html.parser')
# 원하는 요소 추출하기
title = soup.title
print("타이틀 태그:", title.text)
해당 코드는 작성된 HTML코드를 사용한 것이지만, requests 라이브러리를 통해 URL도 처리 가능하다.
데이터 탐색 및 추출하기
이제 BeautifulSoup의 주된 역할인 데이터 탐색과 추출 방법에 대해 알아보자. 이때 가장 주로 사용하는 메서드는 "find"이다. find만 사용하면 하나의 요소만을 탐색하며, find_all을 사용하면 일치하는 모든 요소를 탐색해준다. 다음은 해당 메서드를 사용한 간단한 예시이다.
import requests
from bs4 import BeautifulSoup
res = requests.get('http://example.com')
ht = response.text
# BeautifulSoup 객체 생성
soup = BeautifulSoup(ht, 'html.parser')
# 단일 태그 찾기
ex1 = soup.find('p')
print(ex1.text)
# 모든 태그 찾기
ex1 = soup.find_all('p')
print(ex1.text)
# 태그와 속성으로 찾기
ex3 = soup.find('div', class_='example')
print(ex3.text)
# 부모 요소 내에서 자식 요소 찾기
ex4 = soup.body.find('p')
print(ex4.text)
# 특정 속성이 있는 태그 찾기
ex5 = soup.find('a', href=True)
print(ex5['href'])
여러 페이지의 요소 탐색
단일 페이지를 처리하는 방법은 이제 잘 이해했는데, 그렇다면 페이지 네이션이 되어있는 사이트들은 어떻게 해야되는걸까?
방법은 생각보다 간단하다. 페이지를 넘길때마다 URL을 확인해보면 가장 링크의 가장 뒷부분에 page라는 글자 뒤의 숫자가 증가함을 알 수 있다. 우리는 그저 그 숫자만 조절해가며 스크래핑을 동일하게 진행하면 되는것이다.
import requests
from bs4 import BeautifulSoup
# 첫 번째 페이지의 URL
base_url = 'https://example.com/page/'
# 페이지 네이션의 페이지 수
num_pages = 5
for page_num in range(1, num_pages + 1):
# 각 페이지의 URL 생성
page_url = base_url + str(page_num)
response = requests.get(page_url)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
print("페이지", page_num, "의 타이틀:", soup.title.text)
'프로그래밍 > Python' 카테고리의 다른 글
[Python] 데이터 시각화 라이브러리 - Seaborn (0) | 2024.04.05 |
---|---|
[Python] 웹 스크래핑 라이브러리 - Selenium (0) | 2024.04.04 |
[Python] PEP8 스타일 (0) | 2024.03.28 |
[Python] 큐(Queue) (0) | 2024.03.28 |
[Python] 리스트 (0) | 2024.03.28 |