OkBublewrap

@코스메 한국 브랜드 화장품 데이터베이스 구축(3) 본문

Python/프로젝트

@코스메 한국 브랜드 화장품 데이터베이스 구축(3)

옥뽁뽁 2025. 2. 25. 20:44

1. 데이터 베이스 생성(brand, category, product) 

더보기
import sqlite3

# SQLite 데이터베이스 연결 (없으면 생성됨)
conn = sqlite3.connect("cosme.db")
cursor = conn.cursor()

# # 기존 테이블 삭제 (있으면 삭제)
cursor.execute("DROP TABLE IF EXISTS product")
cursor.execute("DROP TABLE IF EXISTS category")
cursor.execute("DROP TABLE IF EXISTS brand")
cursor.execute("DROP TABLE IF EXISTS rank")

# products 테이블 생성
cursor.execute("""
CREATE TABLE IF NOT EXISTS product (
    product_id INTEGER PRIMARY KEY,         -- 기본 키 (PK)
    brand_id INTEGER,                       -- 브랜드 ID (외래 키)
    category_id INTEGER,                    -- 카테고리 ID (외래 키)
    rating REAL,                            -- 평점 (소수점 가능)
    review_cnt INTEGER,                     -- 리뷰 개수
    price TEXT,                             -- 가격
    update_date DATE,                       -- 업데이트 날짜
    url TEXT,                               -- 제품 URL
    FOREIGN KEY (brand_id) REFERENCES brand(brand_id),
    FOREIGN KEY (category_id) REFERENCES category(category_id)
);
""")

# categories 테이블 생성
cursor.execute("""
CREATE TABLE IF NOT EXISTS category (
    category_id INTEGER PRIMARY KEY,  -- 기본 키 (PK)
    category_name TEXT,               -- 카테고리 이름 (일본어)
    category_name_kr TEXT             -- 카테고리 이름 (한국어)
);
""")

# brands 테이블 생성
cursor.execute("""
CREATE TABLE IF NOT EXISTS brand (
    brand_id INTEGER PRIMARY KEY,      -- 기본 키 (PK)
    brand_name TEXT ,            -- 브랜드 이름 (일본어, 고유)
    brand_name_kr TEXT ,                -- 브랜드 이름 (한국어)
    brand_url TEXT               -- 브랜드 URL (고유)
);
""")

# rank 테이블 생성
cursor.execute("""
CREATE TABLE IF NOT EXISTS rank (
    rank_id INTEGER PRIMARY KEY,      -- 기본 키 (PK)
    product_id INTEGER,                   -- 제품 아이디 (FK)
    ranking INTEGER,                -- 순위 (한국어)
    date DATE                     -- 업데이트 날짜
);
""")

# 변경 사항 저장 & 연결 종료
conn.commit()
conn.close()

ERD

 

 

 

2. category 테이블 작업

더보기
# 크롬 브라우저의 User-Agent 설정
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}

url = "https://www.cosme.net/category/#theme-items"
# HTTP 요청 보내기 (User-Agent 포함)
response = requests.get(url, headers=headers)

time.sleep(random.uniform(3,5))

# BeautifulSoup으로 HTML 파싱
soup = BeautifulSoup(response.text, 'html.parser')

# <div id="theme-items"> 안의 세부 항목 찾기
theme_items_div = soup.find("div", id="theme-items")
category_links = []
category_names = []

if theme_items_div:
    theme_lists = theme_items_div.find_all("ul", class_="theme-product-list")
    for ul in theme_lists:
        for li in ul.find_all("li"):
            a_tag = li.find("a")
            if a_tag:
                category_names.append(a_tag.text.strip())  # 카테고리명
                category_links.append(a_tag["href"])  # 링크 URL

category_id = [extract_id(code) for code in category_links]

df = pd.DataFrame({
    "category_id" : category_id,
    "category_name" : category_names
})

df = df.drop_duplicates()
df.to_excel("category.xlsx", index=False)

 

번역 api를 찾을려다가 서비스 종료가 된 것 같아서, 엑셀 translate로 작업을 했다.

 

# 엑셀에서 transelate([셀], 'ja', 'ko')을 작업 후 불러오기
df = pd.read_excel("category.xlsx")
print(df.head())

# SQLite DB 연결 (파일로 저장되는 DB)
engine = create_engine('sqlite:///cosme.db')

# pandas DataFrame을 DB에 업로드
df.to_sql('category', con=engine, if_exists='replace', index=False)

 

SQLite

 

 

3. 크롤링

← rank category →
← product brand →

 

4. brand 테이블 작업

수작업 맵핑..

 

5. 진행사항

  1. 2025-02-25 크롤링 코드 돌려보기
  2. 잘 쌓이는지 확인하고 매주 금요일 스케쥴러 사용하기
  3. 리뷰데이터, 상세데이터 어떻게 수집할지 고민