일단 크롤링 처음 해봄.
허접한 부분이 많지만 기록용, 그리고 나와 같은 초보가 알기 쉽도록
블로그 포스팅
먼저 내가 크롤링하고 싶은 네이버 쇼핑 페이지는 이것
쇼핑몰 리뷰에 있는 리뷰들을 크롤링하고 싶었다
- 필요한 모듈
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from time import sleep
import requests
import re
import pandas as pd
import numpy as np
import os
from selenium.webdriver.common.keys import Keys
웹 크롤링하는 모듈은 여러개 있었던것같은데 내가 참고한 페이지에는 BeautifulSoup을 써서 나도 요걸로 썼다.
- 크롤링하고 싶은 부분
나는 5점 리뷰는 필요없었고 1~4점까지만 수집하면 됏었다
전체로 크롤링하고 5점빼면 되기도 했지만 5점짜리가 너무 많아서 수집하기 시간이 너무 오래 걸렸음
그래서 그냥 1~4점 따로따로 수집해서 붙였다
name=['SK매직 식기세척기']
category=['별점']
#SK매직 식기세척기 후기
ns_address="https://search.shopping.naver.com/catalog/5405693375?query=SK%EB%A7%A4%EC%A7%81%20%EC%8B%9D%EA%B8%B0%EC%84%B8%EC%B2%99%EA%B8%B0%2012%EC%9D%B8%EC%9A%A9&NaPm=ct%3Dkpmnppnc%7Cci%3De156cc3ce67df7506bcc4855ba0ca3121bcb652b%7Ctr%3Dslsl%7Csn%3D95694%7Chk%3D87a66c81e1083edb5b5fa51a8403cb1f3885c053"
#xpath
shoppingmall_review="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[2]/div/div[2]/ul/li[4]/a/strong"
category1="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[2]/div[2]/ul/li[4]/a" #3점
category2="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[2]/div[2]/ul/li[5]/a" #2점
category3="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[2]/div[2]/ul/li[6]/a" #1점
category4="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[2]/div[2]/ul/li[3]/a" #4점
xpath는 리뷰 페이지의 오른쪽 버튼 클릭하면 맨 아래에 검사가 나옴. 그걸 클릭.
그럼 html이 보이는데 거기서 코드를 위에 올리기만 해도 인터넷 페이지에 어디에 선택되었는지 표시가 된다
그러면 자기가 클릭하고 싶은 곳까지 코드를 열어서 Copy full XPath를 하면 /html/body/div ~~ 요런게 복사가 된다.
-chromedriver 다운받기
▼아래
https://blog.naver.com/song_sec/221752226329
header = {'User-Agent': ''}
d = webdriver.Chrome('C:/Users/User/chromedriver.exe') # webdriver = chrome
d.implicitly_wait(3)
d.get(ns_address)
req = requests.get(ns_address,verify=False)
html = req.text
soup = BeautifulSoup(html, "html.parser")
sleep(2)
#쇼핑몰 리뷰 보기
#d.find_element_by_xpath(shoppingmall_review).click()
#sleep(2)
element=d.find_element_by_xpath(shoppingmall_review)
d.execute_script("arguments[0].click();", element)
sleep(2)
크롬드라이버 다운받고 requests해주면 크롬 열림 ! 처음 볼때 진짜 신기 !
일단 위의 코드 실행시켜주면 네이버 쇼핑 리뷰페이지까지 열림
- Dataframe 만들어주는 함수
#함수 선언
def add_dataframe(name,category,reviews,stars,cnt): #데이터 프레임에 저장
#데이터 프레임생성
df1=pd.DataFrame(columns=['type','category','review','star'])
n=1
if (cnt>0):
for i in range(0,cnt-1):
df1.loc[n]=[name,category,reviews[i],stars[i]] #해당 행에 저장
i+=1
n+=1
else:
df1.loc[n]=[name,category,'null','null']
n+=1
return df1
Dataframe 만들어 주는 함수라 굳이 여기 중간에 안넣고 다른데 넣어도 가능가능
- 리뷰 가져오기
# 리뷰 가져오기
d.find_element_by_xpath(category3).click() #스크롤 건드리면 안됨
name_=name[0]
category_=category[0]
reviews=[]
stars=[]
cnt=1 #리뷰index
page=1
리뷰랑 평점 등등 가져오는 리스트 변수 정의해줌
- 리뷰 데이터 수집하기
while True:
j=1
print ("페이지", page ,"\n")
sleep(2)
while True: #한페이지에 20개의 리뷰, 마지막 리뷰에서 error발생
try:
star=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li[1]/div[1]/span[1]').text
stars.append(star)
review=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li['+str(j)+']/div[2]/div[1]/p').text
reviews.append(review)
if j%2==0: #화면에 2개씩 보이도록 스크롤
ELEMENT = d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li['+str(j)+']/div[2]/div[1]/p')
d.execute_script("arguments[0].scrollIntoView(true);", ELEMENT)
j+=1
print(cnt, review ,star, "\n")
cnt+=1
except: break
sleep(2)
if page<11:#page10까지 적용
try: #리뷰의 마지막 페이지에서 error발생
page +=1
next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a['+str(page)+']').click()
except: break #리뷰의 마지막 페이지에서 process 종료
else :
try: #page11부터
page+=1
if page%10==0: next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a[11]').click()
else : next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a['+str(page%10+2)+']').click()
except: break
df4=add_dataframe(name_,category_,reviews,stars,cnt)
#save()
먼저 평점을 수집할 star에 평점이 있는 xpath 넣어주고
review에 수집할 리뷰 xpath를 넣어준다
그리고 10페이지가 올라가면 다음을 클릭하고 난 뒤에 11 페이지부터 다시 수집하게 되는데
그 코드를 if else로 나누어서 해줌
아래 깃허브에서 코드 가져와서 아래 깃허브보면 더 잘나와있음 !
▼참고 깃허브
https://github.com/Jimin980921/Text_mining/blob/master/Project/textmining_project_crawling.ipynb
'나는야 데이터사이언티스트 > PYTHON' 카테고리의 다른 글
[Python] 결측치 확인 방법 (3) | 2021.08.11 |
---|---|
[Python]DataFrame value type 확인하기 (0) | 2021.07.21 |
[Python]lambda 함수(filter,map,reduce) (2) | 2021.03.25 |
[Python]Jupyter Notebook Markdown 잘 사용하기 (0) | 2021.03.18 |
[PYTHON] 이미지 불러오기 (0) | 2021.01.07 |