본문 바로가기
파이썬/[파이썬을 활용한 웹 크롤링 완벽 가이드]

📌 4. 크롤링 데이터 정제 및 저장하기

by 배불뚝 아저씨 2025. 2. 11.
반응형

1. 이전 강의 리뷰

이전 강의에서는 selenium을 활용한 동적 웹페이지 크롤링을 학습하며, 다음과 같은 개념을 다뤘습니다.

  • selenium을 이용한 웹 브라우저 자동 제어
  • 네이버 뉴스에서 기사 제목 가져오기
  • 로그인 자동화: 아이디와 비밀번호 입력 후 자동 로그인
  • 스크롤 내리면서 추가 데이터 크롤링

이번 강의에서는 크롤링한 데이터를 정제하고 저장하는 방법을 배워보겠습니다. pandas를 활용한 데이터 가공, 정규 표현식으로 텍스트 필터링, JSON 및 CSV 저장 방법, 그리고 데이터베이스 연동까지 다뤄보겠습니다.


2. 크롤링한 데이터 정제하기

웹에서 가져온 데이터는 불필요한 공백, 특수 문자, HTML 태그 등이 포함될 수 있습니다. pandas와 re(정규 표현식)을 이용해 데이터를 정제하는 방법을 배워봅시다.

✅ 필수 라이브러리 설치

pip install pandas

🔹 pandas를 활용한 데이터 정제 방법

import pandas as pd
import re

# 예제 데이터
data = {
    "title": ["  파이썬 웹 크롤링 완벽 가이드! ", "(핫) 데이터 분석 시작하기", "정규 표현식 101: @기초부터 응용까지!"],
    "url": ["https://example.com/1", "https://example.com/2", "https://example.com/3"]
}

# DataFrame 생성
df = pd.DataFrame(data)

# 텍스트 정제 함수
def clean_text(text):
    text = text.strip()  # 앞뒤 공백 제거
    text = re.sub(r"[^가-힣a-zA-Z0-9 ]", "", text)  # 특수 문자 제거
    return text

# 데이터 정제 적용
df["title"] = df["title"].apply(clean_text)

print(df)

🔹 pandas를 활용한 추가적인 데이터 정제 방법

정제 방법 예제 코드

NaN(결측치) 제거 df.dropna()
중복 데이터 제거 df.drop_duplicates()
소문자로 변환 df["column"].str.lower()
대문자로 변환 df["column"].str.upper()
특정 문자열 포함 필터링 df[df["title"].str.contains("파이썬")]
날짜 데이터 변환 df["date"] = pd.to_datetime(df["date"])
HTML 태그 제거 df["text"] = df["text"].str.replace(r"<.*?>", "", regex=True)
특정 숫자 패턴 제거 df["text"] = df["text"].str.replace(r"\d+", "", regex=True)
공백 제거 df["text"] = df["text"].str.strip()
특정 단어 대체 df["text"] = df["text"].str.replace("Python", "파이썬")
URL 제거 df["text"] = df["text"].str.replace(r"http[s]?://\S+", "", regex=True)
이메일 제거 df["text"] = df["text"].str.replace(r"[\w\.-]+@[\w\.-]+", "", regex=True)
특수 문자 제거 df["text"] = df["text"].str.replace(r"[^가-힣a-zA-Z0-9 ]", "", regex=True)
숫자 변환 df["number"] = pd.to_numeric(df["number"])
문자열 결합 df["new_col"] = df["col1"] + " " + df["col2"]
특정 열 제거 df.drop(columns=["unwanted_column"], inplace=True)
문자열 길이 추가 df["text_length"] = df["text"].str.len()
첫 글자 대문자로 변환 df["text"] = df["text"].str.capitalize()
특정 행 필터링 df[df["column"] > 50]

3. 데이터 저장 방식 비교

저장 방식 장점 단점

CSV 간단한 구조, 대부분의 프로그램에서 지원 대량 데이터 처리 속도가 느림
JSON 계층적 데이터 구조, API 응답 형식과 유사 파일 크기가 커질 수 있음
SQLite 가벼운 데이터베이스, 파일 기반 저장 대용량 데이터 처리에는 부적합
MySQL/PostgreSQL 대량 데이터 처리 가능, 빠른 속도 설정이 필요하며 서버 관리 필요

반응형

4. JSON 및 CSV 파일로 데이터 저장

🔹 pandas를 활용한 CSV 저장

# CSV 파일로 저장
df.to_csv("data.csv", index=False, encoding="utf-8-sig")
print("CSV 파일 저장 완료!")

🔹 pandas를 활용한 JSON 저장

# JSON 파일로 저장
df.to_json("data.json", orient="records", force_ascii=False, indent=4)
print("JSON 파일 저장 완료!")

utf-8-sig 인코딩을 사용하면 한글이 깨지지 않습니다.


5. 데이터베이스(SQLite) 저장 및 조회

SQLite를 활용하여 데이터를 저장하고 조회하는 방법을 배워보겠습니다. 이 부분은 보다 깊이 있는 내용을 다루기 때문에 이후 강좌에서 자세히 설명하겠습니다.

import sqlite3

# 데이터베이스 연결
conn = sqlite3.connect("data.db")
cursor = conn.cursor()

# 테이블 생성
cursor.execute("""
CREATE TABLE IF NOT EXISTS articles (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT,
    url TEXT
)
""")

# 데이터 삽입
df.to_sql("articles", conn, if_exists="replace", index=False)

# 데이터 조회
cursor.execute("SELECT * FROM articles")
rows = cursor.fetchall()
for row in rows:
    print(row)

# 연결 종료
conn.close()

🎯 이번 강의를 마치며

오늘도 여기까지 따라오느라 고생 많으셨습니다! 😊 웹에서 가져온 데이터는 그대로 사용할 수 없는 경우가 많습니다. 이번 강의에서는 데이터를 깔끔하게 정제하고 저장하는 다양한 방법을 배웠습니다.

  • pandas를 이용해 불필요한 데이터 제거 및 정리
  • 정규 표현식을 활용한 텍스트 필터링
  • CSV, JSON 저장 방법
  • SQLite 데이터베이스 저장 (심화 강의 예정)

이제 여러분은 크롤링한 데이터를 원하는 형태로 가공하고 저장할 수 있습니다. 💪

다음 강의에서는 더 강력한 크롤링 프레임워크인 Scrapy를 활용해 대량 데이터 수집 자동화에 대해 배워보겠습니다. 기대해주세요! 🚀


🚀 다음 강의 예고

5부: Scrapy 프레임워크를 활용한 크롤링

  • Scrapy 개요 및 설치
  • Scrapy의 동작 방식 (Spider, Pipeline, Middleware)
  • Scrapy를 이용한 크롤링 기본 예제
  • Scrapy로 대량 데이터 수집 자동화

 

반응형

댓글