티스토리 뷰

이번 포스팅에서는 Selenium을 사용해 ‘다나와’(danawa.com)의 검색 페이지에서 제품 정보를 **자동 수집(크롤링)**하고, 그 데이터를 전처리한 뒤, 마지막으로 SeabornMatplotlib 등을 활용해 시각화·분석하는 과정을 다룹니다.
아래 예시는 무선청소기 키워드를 대상으로 진행되었지만, 웹 구조만 파악하면 다른 키워드(예: 노트북, 스마트폰 등)에도 응용 가능합니다.


1. 데이터 수집 (1_Crawling.py)

(1) Selenium을 통한 검색 페이지 제어

  • webdriver.Chrome()으로 크롬 브라우저를 열고, 다나와 검색 결과 URL(무선청소기)로 이동
  • driver.page_source를 사용해 HTML을 가져옴
from selenium import webdriver
driver = webdriver.Chrome()
url = "http://search.danawa.com/dsearch.php?query=무선청소기&tab=main"
driver.get(url)
  • 여기서는 별도 버튼 클릭 없이 단순 검색 URL로 이동
  • 만약 더 많은 페이지를 훑고 싶다면, URL 패턴 분석 후 for문으로 여러 페이지를 방문

(2) BeautifulSoup 파싱 및 상품 정보 추출

  • Selenium으로 띄워진 페이지의 HTML을 BeautifulSoup에 넘겨, .select()나 .find() 계열 함수를 이용해 상품명, 가격, 스펙 등을 가져옵니다.
from bs4 import BeautifulSoup

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

# 예) 검색 결과 목록에서 상품명, 스펙, 가격을 추출
# (코드 내부에서 광고 상품 등 예외처리 필요)

(3) 여러 페이지 크롤링

  • 실제론 10페이지, 20페이지 등 다나와 검색 결과가 많으므로, URL 패턴(&page=2, &page=3 …)을 분석한 뒤 for문으로 반복할 수 있습니다.
  • 크롤링 완료 후에는 pandas로 DataFrame을 만든 뒤, 엑셀(예: danawa_crawling_result.xlsx)로 저장해둡니다.
import pandas as pd

# 예시: 수집된 데이터
# product_list = [ [상품명, 스펙 문자열, 가격], ... ]

df = pd.DataFrame(product_list, columns=["상품명","스펙 목록","가격"])
df.to_excel("danawa_crawling_result.xlsx", index=False)
driver.quit()

여기까지 하면 웹에서 데이터 수집이 완료됩니다.


2. 데이터 전처리 (2_Preprocessing.py)

크롤링 결과에는 여러 형태의 텍스트가 섞여 있습니다. 예를 들어 “흡입력: 140AW / 충전시간: 3시간 …” 식의 긴 스펙 문자열을 분할해서, 분석에 필요한 항목(카테고리, 흡입력, 사용시간 등)만 뽑아내야 합니다.

(1) 상품명을 회사명 + 모델명으로 분할

title = "LG전자 코드제로 A9 A978"
split_info = title.split(' ', 1)  # ['LG전자', '코드제로 A9 A978']
company, product = split_info[0], split_info[1]
  • 브랜드(회사명)와 제품명을 구분

(2) 스펙 목록 파싱

  • 크롤링 때 “핸디/스틱청소기 / 헤파필터 / 흡입력: 140AW / 사용시간: 1시간 …” 형태로 저장된 문자열
  • ' / '로 split → 각 항목을 순회하며 사용시간, 흡입력 등 키워드가 있는지 검사
  • 예:
    • if '사용시간' in spec: use_time = spec.split(' ')[1]
    • if '흡입력' in spec: suction = spec.split(' ')[1]

(3) 단위 통일

  • 예) “3시간 30분” → 210분, “40분” → 40분 …
  • 흡입력의 경우 AW(airwatt), Pa(pascal) 등으로 표기되므로 “1AW == 100Pa” 등 임의 기준으로 변환
  • 이를 통해 숫자형 칼럼으로 사용 가능
def convert_time_minute(time_str):
    # 예: "3시간 30분" -> 210
    #     "1시간" -> 60
    #     "40분" -> 40
    # 예외처리는 try/except
    ...

def get_suction(value):
    # "140AW" -> 140, "22000Pa" -> 220
    ...

(4) 최종 전처리 결과

전처리된 데이터를 다시 엑셀(danawa_data_final.xlsx)로 저장하고, 이제 분석 준비가 끝납니다.

pd_data_final.to_excel("danawa_data_final.xlsx", index=False)

3. 시각화 & 분석 (3_Product_Analysis.py)

마지막 단계에서는 pandas, Matplotlib, Seaborn 등을 활용해 통계량(평균, 최대값 등)과 산점도 등을 그려볼 수 있습니다.

(1) 분석 지표 계산

  • mean(), max(), describe() 등을 통해 가격, 흡입력, 사용시간 분포 확인
  • 예) “평균 가격보다 낮고, 평균 흡입력 이상이며, 평균 사용시간 이상인 모델” 등을 찾아 가성비 모델로 분류
price_mean = data['가격'].mean()
suction_mean = data['흡입력'].mean()
use_time_mean = data['사용시간'].mean()

condition_data = data[
    (data['가격'] <= price_mean) &
    (data['흡입력'] >= suction_mean) &
    (data['사용시간'] >= use_time_mean)
]

(2) Scatter Plot 시각화

  • sns.scatterplot()을 이용해 (흡입력 vs. 사용시간) 좌표에 가격을 size로 나타낼 수 있음
  • 중심선(평균선)을 plt.plot()으로 그려서, 사분면 해석이 가능
import seaborn as sns
import matplotlib.pyplot as plt

sns.scatterplot(x='흡입력', y='사용시간', size='가격',
                hue='회사명', data=data, sizes=(10,1000))
plt.plot([0, max_suction], [mean_use, mean_use], 'r--')
plt.plot([mean_suction, mean_suction], [0, max_use], 'r--')
plt.show()

 

 

이렇게 그리면, 한눈에 흡입력-사용시간 상에서 어떤 제품이 고성능인지, 가격은 어느 정도인지 알 수 있습니다.


4. 확장 아이디어

  1. 크롤링 범위 확대: 여러 키워드(“노트북”, “모니터” 등)에 대해 같은 구조로 데이터를 모을 수 있음
  2. 데이터 병합: 브랜드별로 추가 정보를 가져와, 매출/리뷰/별점 데이터와 연계 가능
  3. 머신러닝/클러스터링: 스펙(흡입력, 소비전력, 브러시 종류, 가격 등)으로 모델들을 분류/군집화
  4. UI 대시보드: Streamlit, Dash 등을 써서 웹 환경에서 필터/정렬을 편리하게 제공

마무리

오늘 오전 수업에서는 이렇게 “1_Crawling.py → 2_Preprocessing.py → 3_Product_Analysis.py” 세 단계로,

  1. 웹 크롤링 (Selenium + BeautifulSoup)
  2. 데이터 전처리 (텍스트 파싱, 단위 변환)
  3. 시각화 & 간단 통계 (가성비 모델 찾기, Scatter Plot)
    을 실습했습니다.

핵심 요점은:

  • Selenium으로 동적 페이지(검색 결과 등)를 열고, BeautifulSoup으로 필요한 태그만 뽑아내기
  • 수집된 텍스트(스펙 문자열)를 꼼꼼하게 파싱해서 숫자형 데이터로 전처리 (단위 통일)
  • pandas DataFrame에서 통계/조건 필터/시각화를 통해 가치 있는 분석 결과 도출

이 과정을 숙지하면, 이후 다른 사이트(가격 비교, 리뷰 플랫폼, 중고거래 등)에서도 비슷한 로직을 재사용해 원하는 정보를 자동화하고, 분석~시각화까지 손쉽게 연결해 볼 수 있습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함