반응형
올리브영 가격과 리뷰수 분석을 위해 크롤링을 시작하게 되었다.
기본적인 라이브러리를 다 불러오고 시작을 해보겠다.
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 |