본문 바로가기
Python/파이썬 크롤링

올리브영 크롤링 하기

by 잉나영 2024. 6. 2.
반응형

올리브영 가격과 리뷰수 분석을 위해 크롤링을 시작하게 되었다.

기본적인 라이브러리를 다 불러오고 시작을 해보겠다.

 

0. 라이브러리 불러오기 

# 라이브러리 불러오기
from selenium import webdriver # 브라우저 자동화를 위한 모듈
import requests # HTTP 요청을 보내기 위한 모듈
from bs4 import BeautifulSoup as bs # HTML 내용 파싱을 위한 모듈
import pandas as pd # 데이터 조작 및 분석을 모듈
import time # 코드 실행 속도 조절을 위한 모듈
import re # 정규 표현식 사용을 위한 모듈
import pickle # 파이썬 객체 직렬화를 위한 모듈
from selenium.webdriver.common.by import By # 다양한 방법으로 엘리먼트를 찾기 위한 모듈
import datetime # 날짜와 시간 연산을 위한 모듈

시작 전 올리브영 크림 리뷰를 가진 모든 링크 csv를 이용할 것이다. 

 

1. 올리브영 크림 파일 크롤링 

 

url_df = pd.read_csv('oliveyoung_all_link.csv')
urls =url_df['link'].tolist()

url_df에는 url을 모아둔 파일로 link로 인식할 수 있게 변경해준다.

 

# 크롬 드라이버 로드
driver = webdriver.Chrome()

# 각 리스트 초기화
title = []  # 제품 이름 리스트
price = [] # 제품 가격 리스트
star = [] # 총 별점 리스트 
review_cnt = [] # 리뷰 총 개수 리스트


for url in urls:
    # 웹 페이지 열기
    driver.get(url)

    # 페이지가 완전히 로드될 때까지 대기
    time.sleep(2)  # 2초 대기. 필요한 경우 조정

    # 페이지 소스를 가져와서 BeautifulSoup으로 파싱
    soup = bs(driver.page_source, 'html.parser')

    # 제목
    try:
        a = soup.find('p', class_='prd_name').get_text(strip=True)
    except:
        a = 'null'
    title.append(a)
    
    # 가격
    try:
        b = soup.find('span', class_='price-2').get_text(strip=True)
    except:
        b = 'null'
    price.append(b)
    
    # 리뷰 총 개수
    try:
        c = soup.find('em').get_text(strip=True)
    except:
        c = 'null'
    review_cnt.append(c)
    

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

# 크롤링한 데이터를 데이터프레임으로 변환
raw_data = pd.DataFrame({
    'title' : title,
    'price' : price,
    'review_cnt' : review_cnt
})

# 결과 출력
print(raw_data)

크롬 드라이버를 받아온 뒤

상품 제목, 상품 가격, 상품의 리뷰수를 받아오기 시작한다.

그리고 이 파일을 데이터프레임으로 제작하여 만들어준다.

 

# 피클 불러오기
f = open("total.pkl", "rb")
data = pickle.load(f)
f.close()

data

# 인덱스 생성되지 않게 csv로 저장하기
data.to_csv("totaldata.csv",index = False)
data = pd.read_csv("totaldata.csv")

피클 파일로도 저장을 하고, csv 파일로도 저장을 했다.

 

2. 전처리

# 댓글 개수의 숫자화
for i in range(len(data)):

    # price에서 숫자를 제외한 모든 문자를 삭제
    data['price'][i] = re.sub("[^0-9]", "", str(data['price'][i]))
    
    # review_cnt에서 숫자를 제외한 모든 문자를 삭제
    data['review_cnt'][i] = re.sub("[^0-9]", "", str(data['review_cnt'][i]))
    
data

댓글 개수와 가격을 숫자화로 변경해준다.

원래 파일에서는 개/ 원의 단위가 붙어 있었는데 지워진 모습을 볼 수 있다. 

 

# 데이터를 데이터프레임으로 변환
df= pd.DataFrame(data)
print(df)

# 'price' 열에서 빈 문자열을 NaN으로 변환
df['price'] = df['price'].replace('', pd.NA)
df['review_cnt'] = df['review_cnt'].replace('', pd.NA)

# NaN 값을 적절한 값으로 대체하고 정수형으로 변환
df['price'] = df['price'].fillna(0).astype(int)
df['review_cnt'] = df['review_cnt'].fillna(0).astype(int)

# CSV 파일로 저장
df.to_csv('total.csv', index=False, encoding="utf-8-sig")

total = pd.read_csv('total.csv')
total

빈 문자열이 있으면 nan으로 바꿔주고, csv파일로 다시 덮어주었다.

 

3. 바 그래프 제작

import matplotlib.pyplot as plt

# 가격을 5000원 단위로 나누어 가격 범위 생성
price_ranges = range((real_data['price'].min() // 5000) * 5000, ((real_data['price'].max() + 5000) // 5000) * 5000, 5000)

# 각 가격 범위에 대한 제품 개수 계산
review_counts = []
for price_range in price_ranges:
    filtered_data = real_data[(real_data['price'] >= price_range) & (real_data['price'] < price_range + 5000)]
    review_counts.append(filtered_data['review_cnt'].count())

# 바 그래프 그리기
plt.figure(figsize=(10, 6))
bars = plt.bar(price_ranges, review_counts, color='blue', width=4000)  # 가격 범위 별로 바 그래프 그리기
plt.title('Price vs Count')
plt.xlabel('Price (KRW)')
plt.ylabel('Count')
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)

# 바 위에 값을 표시
for bar, num in zip(bars, review_counts):
    plt.text(bar.get_x() + bar.get_width() / 2 - 0.1, bar.get_height() + 5, str(num), 
             ha='center', va='bottom', color='black')

plt.tight_layout()
plt.show()

가격대에 제품의 개수가 몇개인지를 바그래프를 제작해보았다.

반응형

'Python > 파이썬 크롤링' 카테고리의 다른 글

쿠팡 리뷰 크롤링 뚫는 법  (0) 2024.06.07
쿠팡 크롤링  (0) 2024.06.04
글로우픽 크롤링  (0) 2024.05.29
[네이버 뉴스] 크롤링 하는 방법  (0) 2024.05.08