Seung's Learning Record

[Python] 웹 스크래핑 라이브러리 - beautifulsoup 본문

프로그래밍/Python

[Python] 웹 스크래핑 라이브러리 - beautifulsoup

70_0ewd 2024. 4. 3. 14:20

 

 

목차

 

     

    지난 포스팅에서는 웹 스크래핑과 웹 크롤링 두 가지 개념에 대해서 간략하게 알아봤었다. 오늘은 웹 스크래핑에 사용되는 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