반응형
이번 기말 프로젝트를 위해 글로우픽에 있는 크림 리뷰순 top20을 크롤링 해보았다.
일단 시작하기 전 필요한 라이브러리를 불러온다.
# 라이브러리 불러오기
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 # 날짜와 시간 연산을 위한 모듈
동적 크롤링을 진행하기 위해 원래 저 사이트에서 자동으로 들어가 크롤링을 시작하려고 하니 사이트에서 막은 건지 없는 페이지라고 떴던 문제가 발생하였다.
그래서 결국 20개의 데이터를 각각 사이트를 설정해줘서 크롤링을 시작하게 되었다. (하...)
# 크롬 드라이버 로드
driver = webdriver.Chrome()
# 웹 페이지 열기
driver.get('https://www.glowpick.com/products/4319')
# 페이지가 완전히 로드될 때까지 대기
time.sleep(5) # 5초 대기. 필요한 경우 조정
# 페이지 소스를 가져와서 BeautifulSoup으로 파싱
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 각 리스트 초기화
title = [] # 제목 리스트
new_doc = [] # 상세설명 리스트
star = [] # 리뷰 별점 리스트
age = [] # 리뷰 작성자 나이 리스트
type_list = [] # 리뷰 작성자 피부 타입 리스트
sex = [] # 리뷰 작성자 성별 리스트
comment_list = [] # 리뷰 내용 리스트
# 제목 (제품 이름)
try:
product_title = soup.find('h1', class_='product__summary__name').get_text(strip=True)
except:
product_title = 'null'
# 상세 설명
try:
product_desc = soup.find('pre', class_='info__text description__text').get_text(strip=True)
except:
product_desc = 'null'
# 리뷰 리스트 가져오기
reviews = soup.find_all('article', class_='review review__item')
for review in reviews:
# 리뷰 별점
try:
c = review.find('span', class_='stars__rating font-spoqa').get_text(strip=True)
except:
c = 'null'
star.append(c)
# 리뷰 작성자 정보
try:
user_info = review.find_all('span', class_='property__wrapper__item')
d = user_info[0].get_text(strip=True) if len(user_info) > 0 else 'null'
e = user_info[1].get_text(strip=True) if len(user_info) > 1 else 'null'
f = user_info[2].get_text(strip=True) if len(user_info) > 2 else 'null'
except:
d, e, f = 'null', 'null', 'null'
age.append(d)
type_list.append(e)
sex.append(f)
# 리뷰 내용
try:
g = review.find('pre', class_='cutter__pre').get_text(strip=True)
except:
g = 'null'
comment_list.append(g)
# 제목과 상세 설명을 리뷰 개수에 맞게 반복하여 추가
title.append(product_title)
new_doc.append(product_desc)
# 드라이버 종료
driver.quit()
# 크롤링한 데이터를 데이터프레임으로 변환
raw_data = pd.DataFrame({
'title': title,
'doc': new_doc,
'star': star,
'age': age,
'type_list': type_list,
'sex': sex,
'comment_list': comment_list
})
# 결과 출력
print(raw_data)
크림 이름, 크림에 대한 상세 설명, 별점, 리뷰자 나이, 리뷰자 피부타입, 리뷰자 성별, 리뷰를 크롤링해왔다.
file_path='C:/Users/lnyln/20221383/3학년 1학기/데이터마이닝/'
f = open(file_path + "d1.pkl", "wb")
pickle.dump(raw_data,f)
f.close()
피클 타입으로 만들어주고
# 저장된 pickle 파일을 불러옴
f = open(file_path + "d1.pkl", "rb")
temp_file = pickle.load(f)
f.close()
temp_file
열어보면?
아주 잘 크롤링이 된 것을 알 수 있었다.
하지만 여기서 또 문제가 발생하게 되는데...
분명 리뷰순으로 결과를 검색했을 때는 리뷰가 3,164개 작성되었다고 했지만, 보여주는 것은 달랑 50개의 리뷰였다.
우리의 크롤링 목표와는 다른 결과물이 나와 굉장히 당황하였다.
그래도 혹시모르니 남은 데이터를 다 크롤링했다.
# CSV파일로 저장
temp_file.to_csv("d19.csv", index = False, encoding="utf-8-sig")
모든 20개의 파일을 csv파일로 변경해주었다.
d1 = pd.read_csv('d1.csv')
d2 = pd.read_csv('d2.csv')
d3 = pd.read_csv('d3.csv')
d4 = pd.read_csv('d4.csv')
d5 = pd.read_csv('d5.csv')
d6 = pd.read_csv('d6.csv')
d7 = pd.read_csv('d7.csv')
d8 = pd.read_csv('d8.csv')
d9 = pd.read_csv('d9.csv')
d10 = pd.read_csv('d10.csv')
d11 = pd.read_csv('d11.csv')
d12 = pd.read_csv('d12.csv')
d13 = pd.read_csv('d13.csv')
d14 = pd.read_csv('d14.csv')
d15 = pd.read_csv('d15.csv')
d16 = pd.read_csv('d16.csv')
d17 = pd.read_csv('d17.csv')
d18 = pd.read_csv('d18.csv')
d19 = pd.read_csv('d19.csv')
d20 = pd.read_csv('d20.csv')
glowpick = pd.concat([d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20], ignore_index=True)
그리고나서 concat을 이용해 데이터를 합쳐주었다...
그렇게해서 총 1000개의 데이터를 크롤링했다!!
하지만 이 데이터 사용하지 않았다는 건 안비밀
반응형
'Python > 파이썬 크롤링' 카테고리의 다른 글
쿠팡 리뷰 크롤링 뚫는 법 (0) | 2024.06.07 |
---|---|
쿠팡 크롤링 (0) | 2024.06.04 |
올리브영 크롤링 하기 (1) | 2024.06.02 |
[네이버 뉴스] 크롤링 하는 방법 (0) | 2024.05.08 |