웹 스크래핑(Web Scraping)은 웹 페이지에서 데이터를 자동으로 추출하는 유용한 기술입니다.
파이썬에서는 BeautifulSoup과 Selenium 같은 라이브러리를 사용해 다양한 웹 데이터를 크롤링할 수 있습니다.
이번 글에서는 데이터를 수집하고 이를 CSV 파일 또는 데이터베이스에 저장하는 방법을 예제와 함께 알아보겠습니다.
웹 스크래핑을 위한 준비
스크래핑 작업을 시작하기 전에 필요한 라이브러리를 설치해야 합니다.
필요한 라이브러리 설치
pip install beautifulsoup4
pip install selenium
pip install requests
ChromeDriver 설치
Selenium을 사용할 경우, 웹 브라우저를 제어하기 위한 ChromeDriver가 필요합니다.
ChromeDriver 다운로드 페이지에서 현재 사용하는 Chrome 버전에 맞는 드라이버를 다운로드하고 경로를 설정합니다.
BeautifulSoup을 사용한 웹 스크래핑
BeautifulSoup은 HTML과 XML 데이터를 파싱하고, 원하는 요소를 쉽게 추출할 수 있도록 도와주는 라이브러리입니다.
간단한 예제로 뉴스 제목을 추출해 보겠습니다.
예제: 뉴스 제목 스크래핑
import requests
from bs4 import BeautifulSoup
# 웹 페이지 요청
url = "https://news.example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# 뉴스 제목 추출
titles = soup.select("h2.title") # CSS 선택자로 제목 선택
for title in titles:
print("뉴스 제목:", title.text)
위 코드에서는 requests
모듈로 웹 페이지의 HTML을 가져오고, BeautifulSoup으로 파싱하여 <h2>
태그의 제목을 추출합니다.
Selenium을 사용한 동적 웹 스크래핑
Selenium은 자바스크립트로 렌더링되는 동적 웹 페이지를 처리하는 데 유용합니다. 예를 들어, 페이지를 자동으로 스크롤하거나 버튼을 클릭해야 데이터를 볼 수 있는 경우 Selenium을 사용할 수 있습니다.
예제: 동적 웹 페이지에서 데이터 스크래핑
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# ChromeDriver 설정
driver_path = "your/path/to/chromedriver"
driver = webdriver.Chrome(driver_path)
# 웹 페이지 열기
driver.get("https://dynamic.example.com")
# 스크롤 다운 및 데이터 수집
time.sleep(3) # 페이지 로딩 대기
for _ in range(3): # 3번 스크롤
driver.find_element(By.TAG_NAME, "body").send_keys(Keys.END)
time.sleep(2)
# 데이터 추출
titles = driver.find_elements(By.CSS_SELECTOR, "h2.title")
for title in titles:
print("제목:", title.text)
driver.quit()
위 코드에서는 Selenium으로 동적 웹 페이지를 스크롤하며 데이터를 수집합니다.
데이터 저장
수집한 데이터를 CSV 파일로 저장하거나 데이터베이스에 삽입할 수 있습니다.
CSV 파일에 데이터 저장
CSV 파일은 데이터를 저장하고 공유하는 데 널리 사용됩니다. csv
모듈을 사용해 데이터를 저장할 수 있습니다.
예제: CSV 파일에 데이터 저장
import csv
# 수집된 데이터
data = [
{"제목": "뉴스1", "링크": "https://example.com/news1"},
{"제목": "뉴스2", "링크": "https://example.com/news2"},
]
# CSV 파일 저장
with open("news.csv", "w", newline="", encoding="utf-8") as csvfile:
fieldnames = ["제목", "링크"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for row in data:
writer.writerow(row)
print("데이터가 CSV 파일에 저장되었습니다.")
데이터베이스에 데이터 저장
SQLite와 같은 데이터베이스를 사용해 데이터를 저장하면 더 구조적으로 관리할 수 있습니다.
예제: SQLite에 데이터 저장
import sqlite3
# 데이터베이스 연결
conn = sqlite3.connect("news.db")
cursor = conn.cursor()
# 테이블 생성
cursor.execute("""
CREATE TABLE IF NOT EXISTS news (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
link TEXT
)
""")
# 데이터 삽입
data = [("뉴스1", "https://example.com/news1"), ("뉴스2", "https://example.com/news2")]
cursor.executemany("INSERT INTO news (title, link) VALUES (?, ?)", data)
conn.commit()
conn.close()
print("데이터가 데이터베이스에 저장되었습니다.")
전체 예제: 웹 스크래핑 및 CSV 저장
다음은 BeautifulSoup을 사용해 뉴스 제목과 링크를 스크래핑한 후, CSV 파일로 저장하는 전체 예제입니다.
import requests
from bs4 import BeautifulSoup
import csv
# 웹 스크래핑
url = "https://news.example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
data = []
titles = soup.select("h2.title")
links = soup.select("h2.title a")
for title, link in zip(titles, links):
data.append({"제목": title.text, "링크": link["href"]})
# CSV 파일 저장
with open("news.csv", "w", newline="", encoding="utf-8") as csvfile:
fieldnames = ["제목", "링크"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(data)
print("뉴스 데이터가 CSV 파일에 저장되었습니다.")
마무리
이번 글에서는 파이썬의 BeautifulSoup과 Selenium을 사용해 웹 스크래핑을 수행하고 데이터를 저장하는 방법을 살펴보았습니다.
데이터 수집 자동화는 업무 효율성을 높이고, 다양한 데이터를 분석할 수 있는 강력한 도구가 됩니다.
실습을 통해 자신만의 스크래핑 자동화 프로젝트를 구현해 보세요!