올리브영 샘플 리뷰 가져오기
소감
리뷰가 url 차이도 없이 클릭으로만 나와서 동적 크롤ㄹ을 사용할 수 밖에 없었다. 올리브영 사이트 내에 제품이니까 다 양식이 같을 줄 알고 XPATH로 클릭을 했더니 몇몇 링크가 다른 양식이라서 다른 방법으로 바꿨다. 또 너무 오래 걸리다보니까 켜놓고 잠들었다가 화면이 꺼져서 날라가서 다시 처음부터 여러번 시작했다. 스크롤 내려가는 정도를 애매하게 해놨다가 넘어간 페이지도 여럿이었다. 마지막날엔 안 된 페이지만 다시 가져오려고 처리하다가 코드를 반대로 써서 필요한 11만개 데이터가 다 날라가고 필요없는 6개 데이터만 남기도 했다. 진짜 저때는 세상에서 사라지고 싶었다 저장하고 했어야 하는데 너무 안일했다 4일동안 제대로 못 자고 자다가 몇 시간 간격으로 일어나서 확인했는데 오히려 잠을 제대로 못 자느라 머리가 잘 안 돌아가서 4일이나 걸린 것 같기도 하다
리뷰가 다 있는줄 알았는데 올리브영에서 제품당 1000개만 보이게 해놔서 약 11만개의 리뷰를 가져왔다. 1000개만이라서 차라리 다행인 것 같기도ㅎ..
샘플 리뷰 데이터 가져오기
저장해놓은 데이터 불러오기
#샘플 제품 링크
link = pd.read_csv('올리브영 제품 링크//oliveyoung_sample_link.csv')
link=link['link']
#그나마 저장해놨던 데이터
data=pd.read_csv('oliveyoung_reviews.csv')
데이터가 이상하게 저장되어 있어서 원래대로 분리 해주는 함수
def str_out(st):
return_text=[]
t=""
input_ok=0
for i in st:
if input_ok==1:
if i=="\'":
input_ok=0
return_text.append(t)
t=""
else:
t+=i
else:
if i=="\'":
input_ok=1
return return_text
데이터 세팅
#별점
star=[]
for i in range(len(data['star'])):
star.append(list(filter(lambda a: a.isdigit()==True,data['star'][i])))
star[26]=[]
#피부 타입
skin_type=[]
for i in range(len(data['skin_type'])):
a=str_out(data['skin_type'][i])
skin_type.append(a)
skin_type[26]=[]
#리뷰 내용
reviews=[]
for i in range(len(data['review'])):
a=str_out(data['review'][i])
reviews.append(a)
reviews[26]=[]
페이지 양식에 맞춰서 가져오는 함수
def info_get(index):
html = driver.page_source
soup = BS(html, 'html.parser')
info = soup.find_all("div", attrs={"class":"user clrfix"})
for i in range(len(info)):
#피부타입
try:
sk=info[i].find("p", attrs={"class":'tag'})
type=""
for k in sk.find_all("span"):
type+=k.text+","
type=type[:-1]
skin_type[index].append(type)
except:
skin_type[index].append("")
review = soup.find_all("div", attrs={"class":"review_cont"})
for i in range(len(review)):
#리뷰내용
try:
re=review[i].find("div", attrs={"class": "txt_inner"}).text
reviews[index].append(re)
except:
reviews[index].append("")
#별점
try:
st=review[i].find("span", attrs={ "class":"point"}).text
st=st.split("5점만점에 ",1)[1]
star[index].append(st)
except:
star[index].append("")
모든 링크 리뷰 가져오기
driver = webdriver.Chrome()
driver.get('https://www.oliveyoung.co.kr/store/display/getMCategoryList.do?dispCatNo=100000100010015&isLoginCnt=0&aShowCnt=0&bShowCnt=0&cShowCnt=0&gateCd=Drawer&trackingCd=Cat100000100010015_MID&trackingCd=Cat100000100010015_MID&t_page=드로우_카테고리&t_click=카테고리탭_중카테고리&t_2nd_category_type=중_크림')
for index in range(26, len(star)):#check_index:
page_num=1
url = link[index]
try:
driver.switch_to.window(driver.window_handles[0]) # 첫 번째 탭으로 이동
driver.execute_script("window.open('{}')".format(url)) # URL 실행`
driver.switch_to.window(driver.window_handles[1]) # 두 번째 탭으로 이동
time.sleep(1)
driver.execute_script("window.scrollTo(0, 1500)")
driver.find_element(By.ID, 'reviewInfo').click()
time.sleep(1)
driver.find_element(By.ID, 'searchType_1').click()
driver.find_element(By.ID, 'searchType_3').click()
driver.find_element(By.XPATH, '//*[@id="gdasSort"]/li[3]/a').click()
time.sleep(1)
driver.execute_script("window.scrollTo(0, 2500)")
time.sleep(1)
while True:
try:
time.sleep(1)
driver.execute_script("window.scrollTo(0, 4000)")
time.sleep(1.5)
err=0
for i in range(10):
if page_num==100:
info_get(index)
break
if page_num>10:
i+=1
page_num+=1
try:
info_get(index)
driver.execute_script("window.scrollTo(0, 4000)")
time.sleep(1)
page=driver.find_element(By.CLASS_NAME, 'pageing')
page=page.find_elements(By.TAG_NAME, 'a')
time.sleep(1)
page[i].click()
time.sleep(1)
except Exception as e:
print(e)
err=1
break
if page_num==100:
break
if err==1:
break
except Exception as e:
print(e)
break
except Exception as e:
print("페이지 이상: link "+str(index))
finally:
driver.close()
time.sleep(0.3)
if(index%10==0):
print(str(index)+"/"+str(len(link)))
데이터 제대로 못 가져온 링크 인덱스 따로 저장
check_index=[]
for i in range(len(star)):
if len(skin_type[i])==len(star[i])==len(reviews[i])==1000:
print(reviews[i])
else:
skin_type[i]=[]#None
star[i]=[]#None
reviews[i]=[]#None
check_index.append(i)