왜 쿠팡에서 육아용품을 분석하는가?

쿠팡은 대한민국 이커머스 시장에서 약 37.7%의 점유율을 차지하는 가장 큰 플랫폼으로, 국내 온라인 쇼핑 산업의 핵심 역할을 하고 있다. 이러한 시장 점유율은 쿠팡이 다양한 상품군에서 소비자들에게 중요한 선택지임을 의미하며, 특히 육아용품과 같은 필수 소비재의 경우, 그 중요성은 더욱 커진다.
 
첫째, 빠른 배송 서비스가 큰 장점으로 작용한다. 쿠팡의 로켓배송은 부모들이 필요할 때 신속하게 육아용품을 받아볼 수 있도록 하여 시간적 제약을 받는 부모들에게 큰 만족을 주고 있다. 기저귀, 분유, 물티슈 등 자주 필요로 하는 육아용품의 특성상 빠른 배송은 필수적인 요소로, 쿠팡은 이 분야에서 경쟁사들보다 우위를 점하고 있다.
 
둘째, 리뷰 및 평점 시스템은 육아용품 구매 시 품질과 안전성을 보장하는 중요한 자료를 제공한다. 육아용품은 소비자들이 특히 신중하게 선택하는 제품군이기 때문에, 다른 소비자들의 리뷰와 평가가 구매 결정에 중요한 영향을 미친다. 쿠팡은 방대한 리뷰 데이터를 통해 소비자들이 신뢰할 수 있는 정보를 제공하고 있으며, 이는 쿠팡이 육아용품 시장에서 신뢰받는 플랫폼으로 자리잡게 한다.
 
셋째, 모바일 쇼핑의 활성화도 큰 강점이다. 많은 부모들이 모바일 앱을 통해 쇼핑을 하는 경향이 증가하고 있으며, 쿠팡의 직관적이고 간편한 모바일 환경은 이들에게 큰 편의를 제공한다. 특히, 육아로 바쁜 부모들에게 언제 어디서나 쉽게 필요한 제품을 주문할 수 있는 점은 쿠팡의 경쟁력을 강화하는 요소다.
 

 

사람들은 어떤 육아용품을 많이 사는가?

쿠팡에는 육아용품을 위한 별도의 카테고리가 있으며, 세부 카테고리는 다음과 같다:

  • 유아동패션: 아이들의 의류 및 액세서리
  • 기저귀: 일회용 및 천 기저귀
  • 물티슈: 다양한 브랜드와 크기의 물티슈
  • 분유/어린이식품: 영유아용 분유와 식품
  • 어린이 건강식품: 영양제 및 건강 보조 식품
  • 수유용품: 젖병, 수유패드 등 수유에 필요한 도구들
  • 이유용품/유아식기: 이유식기, 포크, 접시 등
  • 매트/안전용품: 아이들의 안전을 위한 매트 및 보호 장비
  • 유모차/웨건: 유모차와 웨건 관련 제품
  • 카시트: 자동차용 유아 카시트
  • 아기띠/외출용품: 아기띠 및 외출용 가방
  • 욕실용품/스킨케어: 아이들용 욕실용품 및 스킨케어 제품
  • 위생/건강/세제: 위생용품 및 건강 관련 제품
  • 유아용침구: 유아용 침대와 이불
  • 유아가구/인테리어: 아이들 방을 꾸밀 수 있는 가구 및 인테리어 소품
  • 완구/교구: 학습 및 놀이용 완구
  • 유아동도서: 아이들을 위한 도서
  • 출산준비물/선물: 출산 전 준비해야 할 물품과 선물
  • 임부/태교용품: 임산부를 위한 제품과 태교 관련 용품

 

데이터 수집

육아용품 구매 트랜드를 알아보기위해 쿠팡 사이트의 육아용품 카테고리를 스크래핑 하였다. 큰 트랜드를 알아보기 위함으로 육아용품 내 세부카테고리는 지정하지 않았다. 스크래핑은 파이썬을 이용하였으며 playwright패키지를 사용하였다. 스크래핑 결과 1064개의 물품이 수집되었다. 물품별 수집한 정보는 물품id, 물품명, 가격, 리뷰개수, 링크, 별점, 로켓배송여부이다.

 

쿠팡 유아용품 스크래핑 결과

쿠팡 유아용품 스크래핑 결과

스크래핑 코드

스크래핑을 위한 전체 코드이다. 패키지로는 Playwright를 사용했다. 코드단락에 대한 자세한 설명은 아래의 포스팅에 설명되어 있다. 전체적인 흐름은 다음과 같다. 첫째, 웹 스크래핑과 데이터베이스 연결에 필요한 모든 모듈을 불러온다. 둘째, 스크래핑 데이터를 저장하기 위한 MySQL 데이터베이스와 연결을 설정한다. 셋째, url에 접속한다. 넷째, Playwright를 통해 특정 요소의 텍스트와 속성을 가져온다. 다섯째, 쿠팡의 특정 카테고리 페이지에서 제품 정보를 수집하고, 각 제품에 대한 정보를 데이터베이스에 저장한다.

 

Playwight로 데이터 수집

Selenium vs Playwright 비교웹스크래핑웹스크래핑이란?웹스크래핑은 웹사이트의 데이터를 자동으로 긁어오는 기술로, 네이버나 구글 같은 웹사이트에서 직접 정보를 복사하고 붙여넣기 하는 대신,

eyatto-coding.tistory.com

 

# 필요한 라이브러리 import
import asyncio  # 비동기 처리를 위해 사용
from playwright.async_api import async_playwright  # 비동기 Playwright 기능을 가져오기 위해 사용
import re  # 정규표현식 처리를 위해 사용
import pymysql  # MySQL 데이터베이스와 연결하기 위해 사용

# MySQL 데이터베이스 연결 설정
conn = pymysql.connect(
    host='',
    user='',
    passwd='',
    database='',
    port=,
    charset=''
)

# 제품 정보를 데이터베이스에 삽입하는 함수
def insert_product(item_id, product_name, price, review_count, link, rating, rocket_text):
    try:
        with conn.cursor() as cursor:
            # 동일한 제품 ID가 있는지 확인
            check_sql = "SELECT product_id FROM total_products WHERE product_id = %s"
            cursor.execute(check_sql, (item_id,))
            result = cursor.fetchall()

            if len(result) > 0:
                # 이미 존재하는 제품인 경우 저장하지 않음
                print(f"같은 id({item_id})가 있으므로 저장하지 않습니다.")
            else:
                # 새로운 제품 정보를 데이터베이스에 삽입
                insert_sql = """
                    INSERT INTO total_products (product_id, product_name, price, review_count, link, rating, rocket)
                    VALUES (%s, %s, %s, %s, %s, %s, %s)
                """
                cursor.execute(insert_sql, (item_id, product_name, price, review_count, link, rating, rocket_text))
                conn.commit()  # 데이터베이스에 변경사항 적용
                print(f"Product {product_name} inserted successfully.")

    except Exception as e:
        print(f"Error occurred: {e}")  # 오류 발생 시 메시지 출력

# 특정 요소의 텍스트를 가져오는 비동기 함수
async def get_element_text(element, locator):
    elem = element.locator(locator)
    if await elem.count() > 0:
        return await elem.inner_text()  # 요소가 있을 경우 텍스트 반환
    else:
        return ''  # 요소가 없을 경우 빈 문자열 반환

# 특정 요소의 속성을 가져오는 비동기 함수
async def get_element_attribute(element, locator, attr):
    elem = element.locator(locator)
    if await elem.count() > 0:
        return await elem.get_attribute(attr)  # 요소가 있을 경우 속성 반환
    else:
        return ''  # 요소가 없을 경우 빈 문자열 반환

# 쿠팡의 특정 카테고리 페이지에서 제품 정보를 수집하는 비동기 함수
async def home_get_products():    
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)  # 브라우저 실행 (headless=False로 설정하여 브라우저 창 표시)

        # 여러 페이지를 순회하며 데이터 수집
        for i in range(1, 11):  # 페이지 1부터 10까지 순회
            print("="*50)
            print(f"page: {i}")

            # 쿠팡 카테고리 URL 설정
            url = f"https://www.coupang.com/np/categories/221934?listSize=120&sorter=saleCountDesc&page={i}"
            print(f"url: {url}")

            # 새 페이지 열기
            page = await browser.new_page()
            await page.goto(url, timeout=60000)  # 60초 타임아웃 설정

            # 상품 요소 찾기
            elements = page.locator(".baby-product.renew-badge")
            counts = await elements.count()  # 페이지에 있는 요소 개수 확인
            print(f"{counts}개의 요소를 찾았습니다.")

            # 각 제품 정보를 순회하며 수집 및 삽입
            for i in range(1, counts+1):
                # 제품명 수집
                name_text = await get_element_text(elements.nth(i), '.name')
                
                # 가격 정보 수집 후 숫자만 추출
                price_text = re.sub(r'\D', '', await get_element_text(elements.nth(i), 'strong.price-value'))
                
                # 리뷰 수 수집 후 숫자만 추출
                review_text = await get_element_text(elements.nth(i), 'span.rating-total-count')                
                review_count = re.sub(r"\D", "", review_text)
                
                # 제품 링크 수집 및 전체 URL로 변환
                link_text = await get_element_attribute(elements.nth(i), 'a.baby-product-link', 'href')
                full_link = f"https://coupang.com{link_text}"
                
                # 아이템 ID 추출
                item_id_match = re.search(r"itemId=(\d+)", full_link)
                item_id = item_id_match.group(1) if item_id_match else ""
                
                # 평점 수집
                rating_text = await get_element_text(elements.nth(i), 'em.rating')
                
                # 로켓 배송 여부 수집
                rocket_text = await get_element_attribute(elements.nth(i), 'span.badge.rocket img', 'alt')

                # 데이터 삽입 함수 호출 (데이터베이스에 저장)
                insert_product(item_id, name_text, price_text, review_count, full_link, rating_text, rocket_text)

            await page.close()  # 현재 페이지 닫기

        await browser.close()  # 모든 작업 종료 후 브라우저 닫기

# 비동기 함수 실행
asyncio.run(home_get_products())

 

+ Recent posts