본문 바로가기
Programming Languages/Python

[Python Examples] BeautifulSoup #01: 웹페이지 텍스트 크롤링

by Henry Cho 2024. 12. 16.

포스트 난이도: HOO_Junior


# BeautifulSoup

BeautifulSoup 패키지는 웹의 데이터를 가져오거나 크롤링, 즉 추출할 때 사용하는 패키지이다. 특히 HTML이나 XML에 특화되어 있다 보니 웹페이지와 관련해서 데이터를 가져오겠다고 한다면 자연스럽게 생각나는 간단한 방법 중 하나가 바로 BeautifulSoup이다. 정말 많이 사용하다보니 브로들도 파이썬을 배우기 시작한다면 대표적인 예제로 배울 확률이 높은 패키지 중 하나이다. MIT 라이선스이기 때문에 편하게 사용하면 된다.


# Crawling, 추출

이번 파이썬 예제코드에서는 가장 기본적인 웹페이지에서 텍스트를 크롤링하는 방법에 대해서 살펴보도록 하자. 이후에 class ID를 설정해줌으로써 html에 안에 있는 특정한 데이터나 키워드만을 추출해 낼 수 있다. 여기에 기능을 추가해서 바로 머신러닝 학습과 데이터 시각화 또한 더해줄 수 있다. 한마디로 BeauthifulSoup에 대해 기본기를 탄탄히 쌓아야 다음 스텝으로 넘어갈 수 있다는 것이다.


# Example Codes

아래의 예제코드는 HOOAI 블로그 메인 페이지에 나와있는 텍스트를 크롤링, 즉 추출해내는 작업을 해보았다. 주요한 부분에 대해서는 코멘트를 넣어놓았으니 참고하면 된다. 텍스트를 크롤링하는 기능은 if 조건문을 통해서 작성해 주면 되지만 그전에 페이지 데이터를 추출하는 것과 데이터를 저장하는 방식, 저장하는 방법 등은 definition  (def) 기능을 통해서 먼저 선언해줘야 한다. 주어진 도메인에 있는 모든 텍스트가 저장되는 기본적인 크롤링 방식이기에 def에 선언된 코드들도 어렵지 않기에 아래의 예제코드를 살펴보고 쉽게 따라 할 수 있다.

 

어렵거나 이해가 되지 않는 부분은 댓글에 남겨주길 바란다.

import requests
from bs4 import BeautifulSoup
import time

# Function to fetch raw HTML data from a single page
def fetch_page_data(url):
    """Fetch raw HTML data from a single page."""
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    else:
        print(f"Failed to fetch page: {url}, Status Code: {response.status_code}")
        return None

# Function to extract string data from a page
def extract_string_data_from_page(html_content):
    """Extract all string data from a page's raw HTML."""
    soup = BeautifulSoup(html_content, 'html.parser')
    all_text = soup.get_text(separator="\n")  # Extract all visible text
    return all_text

# Save raw data to a text file
def save_data_to_file(data, filename):
    """Save scraped string data to a text file."""
    with open(filename, "w", encoding="utf-8") as f:
        f.write(data)

# Script entry point
if __name__ == "__main__":
    base_url = "https://whoishoo.tistory.com/"  # Replace with your target URL
    print(f"Fetching data from {base_url}...")
    
    html_content = fetch_page_data(base_url)
    if html_content:
        page_text = extract_string_data_from_page(html_content)
        output_file = "Tistory_Site_Raw_Data.txt"
        save_data_to_file(page_text, output_file)
        print(f"Scraping completed. Data saved to '{output_file}'.")
    else:
        print("Failed to fetch or process the data.")

Figure 1. 추출되어 txt파일에 저장된 텍스트 데이터 중 일부


 

728x90

댓글