Chapter 3 Kream 크롤링, 웹스크래핑 프로젝트

2025. 4. 16. 13:22·프로젝트
목차
  1. 📌 개념 정리
  2. 🚦 동작 원리 및 구조
  3. 💻 코드 예시 및 흐름 분석
  4. 🧪 실전 사례
  5. 🧠 고급 팁 or 자주 하는 실수
  6. ✅ 마무리 요약 및 복습 포인트

📌 개념 정리

이 코드에서는 웹 스크래핑을 사용하여 네이버에서 특정 키워드에 대한 제품 정보를 검색하고, 해당 제품의 상세 정보를 추출하여 출력합니다. 주요 도구로는 Selenium과 BeautifulSoup을 사용하며, 자동화된 브라우저 조작과 HTML 페이지 파싱을 통해 데이터를 수집합니다.

 

import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time  # 파이썬 기본 패키지
#class, id를 css_select를 이용해서 컨트롤하기 위한 패키지 (Selenium에서 웹 요소를 찾을 때 사용하는 By 모듈을 임포트하는 코드)
from selenium.webdriver.common.by import By
#키보드의 입력형태를 코드로 작성해서 열려있는 크롬에게 전달하기 위한 패키지
from selenium.webdriver.common.keys import Keys

# 검색어 입력 받기
keyword = input("검색을 원하시는 브랜드 또는 제품명을 입력해주세요 : ")

# URL에 입력된 검색어를 적용하여 네이버 검색 URL 생성
url = "https://kream.co.kr/"

# User-Agent 설정
header_user = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"
options_ = Options()
options_.add_argument(f"User-Agent={header_user}")
options_.add_experimental_option("detach", True)  # 브라우저 종료되지 않게 설정
options_.add_experimental_option('excludeSwitches', ["enable-logging"])  # 불필요한 로그 제거


# Chrome WebDriver에 옵션 추가
driver = webdriver.Chrome(options=options_)  # options_를 전달하여 브라우저 설정을 적용

# 네이버 검색 URL로 접속
driver.get(url)
time.sleep(1)

driver.find_element(By.CSS_SELECTOR, ".btn_search.header-search-button.search-button-margin").click()
time.sleep(1.5)

# #리팩토리(개선작업)
# driver.find_element(By.CSS_SELECTOR, ".input_search.show_placeholder_on_focus").send_keys("슈프림")
# time.sleep(1)
# driver.find_element(By.CSS_SELECTOR, ".input_search.show_placeholder_on_focus").send_keys(Keys.ENTER)

#리팩토리(개선작업후)
# 검색 입력 필드 찾아서 작업
search_input = driver.find_element(By.CSS_SELECTOR, ".input_search.show_placeholder_on_focus")

# 검색어 입력 후 Enter 키 누르기
search_input.send_keys(keyword)
time.sleep(1)
search_input.send_keys(Keys.ENTER)

for i in range(20):
    driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_DOWN)
    time.sleep(0.3)

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

items = soup.select(".item_inner")  #select/find -> select로 찾아서 나오는 결과는 리스트와 동일한 형태다

for item in items: 
    product_name = item.select_one(".translated_name").text
   
    if "후드" in product_name:
        
        category = "상의"
        brand = item.select_one(".brand-name").text
        price = item.select_one(".amount").text
        print(f"카테고리  : {category}")
        print(f"브랜드  : {brand}")
        print(f"제품명  : {product_name}")
        print(f"가격  : {price}")

driver.quit()

🚦 동작 원리 및 구조

이 코드는 다음과 같은 흐름으로 동작합니다:

  1. 웹 드라이버 설정 및 브라우저 실행: Selenium을 사용해 Chrome 브라우저를 띄우고, 브라우저에 필요한 옵션을 설정합니다.
  2. 검색어 입력: 사용자로부터 검색어를 입력받고, 해당 키워드를 네이버 검색에 적용합니다.
  3. 페이지 스크롤 및 페이지 소스 추출: 페이지를 스크롤하여 필요한 정보를 모두 로드하고, HTML 소스를 BeautifulSoup을 이용해 파싱합니다.
  4. 제품 정보 추출: 파싱된 HTML에서 특정 CSS 선택자를 사용하여 원하는 데이터를 추출합니다.
  5. 조건에 맞는 정보 출력: 제품명이 "후드"가 포함된 제품만 필터링하여 카테고리, 브랜드, 가격 등을 출력합니다.
  6. 브라우저 종료: 작업이 끝나면 브라우저를 종료합니다.

💻 코드 예시 및 흐름 분석

아래는 코드를 순차적으로 설명한 부분입니다.

1. 라이브러리 및 패키지 불러오기

import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
  • requests: 웹 요청을 보내는 라이브러리입니다. 이 코드에서는 사용되지 않지만, 일반적으로 웹 스크래핑에서 HTTP 요청을 보낼 때 사용됩니다.
  • selenium: 웹 브라우저를 자동화하는 라이브러리입니다. webdriver로 크롬 브라우저를 실행하고, By와 Keys를 이용해 웹 페이지에서 요소를 찾고, 키보드 입력을 자동화합니다.
  • BeautifulSoup: HTML 소스를 파싱하여 원하는 데이터를 추출하는 데 사용됩니다.
  • time: 코드 실행 중 잠시 멈추기 위해 사용됩니다.

2. 검색어 입력 및 URL 생성

keyword = input("검색을 원하시는 브랜드 또는 제품명을 입력해주세요 : ")
url = "https://kream.co.kr/"
  • 사용자로부터 검색어를 입력받고, 해당 키워드를 이용해 검색을 수행할 URL을 설정합니다.

3. 웹 드라이버 옵션 설정

header_user = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"
options_ = Options()
options_.add_argument(f"User-Agent={header_user}")
options_.add_experimental_option("detach", True)
options_.add_experimental_option('excludeSwitches', ["enable-logging"])
  • User-Agent를 설정하여 웹 페이지가 브라우저에서 요청을 보내는 것처럼 보이도록 합니다.
  • detach: 브라우저를 종료하지 않고 유지하도록 설정합니다.
  • excludeSwitches: 불필요한 로그를 제거하는 옵션입니다.

4. 브라우저 실행 및 크림 접속

driver = webdriver.Chrome(options=options_)
driver.get(url)
time.sleep(1)
  • Selenium을 사용하여 설정된 옵션을 적용한 Chrome 브라우저를 실행하고, 크림 검색 페이지에 접속합니다.

5. 검색 버튼 클릭 및 검색어 입력

driver.find_element(By.CSS_SELECTOR, ".btn_search.header-search-button.search-button-margin").click()
time.sleep(1.5)

search_input = driver.find_element(By.CSS_SELECTOR, ".input_search.show_placeholder_on_focus")
search_input.send_keys(keyword)
time.sleep(1)
search_input.send_keys(Keys.ENTER)
  • 검색 버튼을 클릭한 후, 검색어 입력 필드를 찾아 키워드를 입력하고 Enter 키를 눌러 검색을 시작합니다.

6. 페이지 스크롤

for i in range(20):
    driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_DOWN)
    time.sleep(0.3)
  • 페이지를 20번 스크롤하여 더 많은 제품을 로드합니다. PAGE_DOWN 키를 사용하여 스크롤을 내립니다.

7. HTML 파싱 및 데이터 추출

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

items = soup.select(".item_inner")

for item in items: 
    product_name = item.select_one(".translated_name").text
    if "후드" in product_name:
        category = "상의"
        brand = item.select_one(".brand-name").text
        price = item.select_one(".amount").text
        print(f"카테고리  : {category}")
        print(f"브랜드  : {brand}")
        print(f"제품명  : {product_name}")
        print(f"가격  : {price}")
  • 페이지의 HTML 소스를 BeautifulSoup으로 파싱하여, 제품 항목들을 추출합니다.
  • 각 제품에서 translated_name을 이용해 제품명을 가져오고, 이름에 "후드"가 포함된 경우만 필터링하여 카테고리, 브랜드, 가격을 출력합니다.

8. 브라우저 종료

driver.quit()
  • 작업이 끝난 후, Selenium을 이용해 실행 중인 브라우저를 종료합니다.

9. 리팩토링 각 함수로 값들을 저장하여 실행

import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time

# 크롬 웹드라이버를 설정하는 함수
def setup_driver():
    header_user = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"
    options_ = Options()
    options_.add_argument(f"User-Agent={header_user}")
    options_.add_experimental_option("detach", True)  # 브라우저 종료되지 않게 설정
    options_.add_experimental_option('excludeSwitches', ["enable-logging"])  # 불필요한 로그 제거
    return webdriver.Chrome(options=options_)

# 검색어를 입력하고, 페이지를 다운스크롤하는 함수
def search_product(driver, keyword):
    driver.get("https://kream.co.kr/")
    time.sleep(1)

    # 검색 버튼 클릭
    driver.find_element(By.CSS_SELECTOR, ".btn_search.header-search-button.search-button-margin").click()
    time.sleep(1.5)

    # 검색 입력 필드 찾아서 작업
    search_input = driver.find_element(By.CSS_SELECTOR, ".input_search.show_placeholder_on_focus")
    search_input.send_keys(keyword)
    time.sleep(1)
    search_input.send_keys(Keys.ENTER)

    # 페이지를 아래로 스크롤하여 더 많은 제품을 로딩
    for i in range(20):
        driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_DOWN)
        time.sleep(0.3)

# 제품 정보를 추출하는 함수
def extract_product_info(soup):
    items = soup.select(".item_inner")
    for item in items:
        product_name = item.select_one(".translated_name").text

        if "후드" in product_name:
            category = "상의"
            brand = item.select_one(".brand-name").text
            price = item.select_one(".amount").text
            print(f"카테고리  : {category}")
            print(f"브랜드  : {brand}")
            print(f"제품명  : {product_name}")
            print(f"가격  : {price}")

# 메인 함수
def main():
    # 검색어 입력 받기
    keyword = input("검색을 원하시는 브랜드 또는 제품명을 입력해주세요 : ")

    # WebDriver 설정
    driver = setup_driver()

    # 제품 검색
    search_product(driver, keyword)

    # HTML 소스 코드 가져오기
    html = driver.page_source
    soup = BeautifulSoup(html, "html.parser")

    # 제품 정보 추출 및 출력
    extract_product_info(soup)

    # 드라이버 종료
    driver.quit()

if __name__ == "__main__":
    main()

🧪 실전 사례

실제 e-commerce 웹사이트에서 제품을 검색하고, 해당 제품 정보를 추출하는 작업을 자동화하는 예시입니다. 예를 들어, 사용자가 "슈프림"이라는 브랜드를 검색하고, 그 결과에서 "후드"가 포함된 제품을 필터링하여 가격, 브랜드, 카테고리 등을 출력할 수 있습니다. 이를 통해, 시간과 노력을 절약하고, 대량의 데이터를 빠르게 수집할 수 있습니다.

🧠 고급 팁 or 자주 하는 실수

  • 팁: Selenium을 사용할 때는 time.sleep()을 적절히 사용하여 페이지 로딩이나 동적 요소가 완전히 로드될 시간을 충분히 주어야 합니다.
  • 실수: CSS 선택자나 XPath가 변경되면 코드가 작동하지 않게 됩니다. 항상 웹 페이지 구조가 변경되지 않는지 확인해야 합니다.

✅ 마무리 요약 및 복습 포인트

  • 이 코드는 Selenium과 BeautifulSoup을 결합하여 자동으로 제품 정보를 검색하고 추출하는 방식입니다.
  • 중요한 점은 검색어 입력, 페이지 스크롤 및 HTML 파싱을 통해 원하는 정보를 추출하는 것입니다.
  • 이 방식은 대규모 데이터 수집 및 자동화된 스크래핑 작업에 유용합니다.

'프로젝트' 카테고리의 다른 글

Chapter 3 Kream 크롤링, 웹스크래핑 프로젝트(자동화)  (0) 2025.04.16
Chapter 3 Kream 크롤링, 웹스크래핑 프로젝트(데이터베이스,MySQL)  (0) 2025.04.16
Chapter 2 네이버 동적 스크랩핑,크롤러 프로젝트  (0) 2025.04.15
프로젝트 준비(자동화 스크랩핑)  (0) 2025.04.15
프로젝트 준비(네이버 API와 부동산 관련 데이터)  (0) 2025.04.15
  1. 📌 개념 정리
  2. 🚦 동작 원리 및 구조
  3. 💻 코드 예시 및 흐름 분석
  4. 🧪 실전 사례
  5. 🧠 고급 팁 or 자주 하는 실수
  6. ✅ 마무리 요약 및 복습 포인트
'프로젝트' 카테고리의 다른 글
  • Chapter 3 Kream 크롤링, 웹스크래핑 프로젝트(자동화)
  • Chapter 3 Kream 크롤링, 웹스크래핑 프로젝트(데이터베이스,MySQL)
  • Chapter 2 네이버 동적 스크랩핑,크롤러 프로젝트
  • 프로젝트 준비(자동화 스크랩핑)
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (672)
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (38)
      • 기술블로그-Fastapi편 (28)
      • 기술블로그-Django편 (152)
      • 기술블로그-Flask편 (35)
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (72)
      • Fastapi (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 3 Kream 크롤링, 웹스크래핑 프로젝트

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.