당신은 주제를 찾고 있습니까 “리뷰 크롤링 – [파이썬] 웹크롤링_네이버 영화 리뷰“? 다음 카테고리의 웹사이트 you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 생각하는 코딩 이(가) 작성한 기사에는 조회수 1,756회 및 좋아요 20개 개의 좋아요가 있습니다.
리뷰 크롤링 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 [파이썬] 웹크롤링_네이버 영화 리뷰 – 리뷰 크롤링 주제에 대한 세부정보를 참조하세요
https://ai-creator.tistory.com/201
리뷰 크롤링 주제에 대한 자세한 내용은 여기를 참조하세요.
[크롤링] 네이버 영화 리뷰 크롤링하기(파이썬/python/web …
파이썬을 사용하여 네이버 영화의 네티즌 평점과 리뷰 크롤링하고 csv 파일로 저장해봅니다. 1. 필요한 패키지 불러오기 – requests, BeautifulSoup, …
Source: happy-obok.tistory.com
Date Published: 5/7/2022
View: 6549
네이버 쇼핑몰 리뷰 크롤링 – velog
오늘은 네이버 쇼핌몰 리뷰 크롤링을 진행해봤습니다. “LG 에어로타워”에 대한 리뷰가 필요한데, 네이버 쇼핑몰의 리뷰가 수는 적어도 괜찮은 평가 …
Source: velog.io
Date Published: 7/2/2022
View: 2310
[Python]네이버 쇼핑 리뷰 크롤링 하기 – 우주먼지의 하루
블로그 포스팅. 먼저 내가 크롤링하고 싶은 네이버 쇼핑 페이지는 이것. 쇼핑몰 리뷰에 있는 리뷰들을 크롤링하고 싶었다 …
Source: rk1993.tistory.com
Date Published: 2/8/2022
View: 5211
[Python] 구글 리뷰 크롤링 #1. 데이터 여러 개 가져오기
문제사항 : 모든 리뷰를 가져오고 싶지만 가장 첫 리뷰만 크롤링 되었다. 에러원인: 컨테이너 범위 잘못 지정. 크롤링 할 데이터를 가져오기 전, …
Source: world-insight-seeker.tistory.com
Date Published: 9/24/2022
View: 5181
IT·프로그래밍 – 크몽
웹사이트 쇼핑몰 데이터 크롤링 해 드립니다. 세금계산서 발행. 10,000원~. 0.0. 0개의 평가 · 파이썬 웹크롤링 엑셀로 저장해 드립니다. ROOKIE 광고. 베이스닉 …
Source: kmong.com
Date Published: 6/20/2021
View: 4618
[파이썬:웹크롤링] #11 쇼핑몰 제품정보/평점/리뷰수 리스트업
[파이썬:웹크롤링] #11 쇼핑몰 제품정보/평점/리뷰수 리스트업. by 티챠림 2022. 6. 12. [왕초보 웹크롤링 따라하기] 웹크롤링, 파이썬, 데이터 추출, 엑셀표만들기, …Source: charimlab.tistory.com
Date Published: 4/19/2022
View: 984
스마트스토어 상품 리뷰 추출하기 – 파이썬 크롤링 연습
네이버 지식in에서 질문한 내용을 답해준 내용으로, 네이버 쇼핑에 노출되는 스마트 스토어 상품의 고객 리뷰(페이지당 20개)에 대해 파이썬 크롤링 …
Source: goodthings4me.tistory.com
Date Published: 6/9/2021
View: 2676
[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 1(feat …
안드로이드 Google Play Store에서 특정 앱에 달린 리뷰들을 크롤링하여 텍스트 분석을 하고자 한다. 일단 먼저 리뷰 데이터가 필요하므로 데이터 …
Source: signing.tistory.com
Date Published: 2/21/2021
View: 7360
네이버 영화 리뷰 키워드분석 (3) 리뷰 크롤링
암튼 다음으로 넘어가보면 이제 전에 만들었던 baseurl에 접속해서 리뷰들을 크롤링하는 단계다. #import한 패키지 목록 import re import pandas as pd …
Source: haystar.tistory.com
Date Published: 11/27/2021
View: 7284
[Python/Crawling] 네이버 플레이스(네이버 지도) 리뷰 크롤링
크롤링하게 된 이유. 빅데이터 동아리 ADV 프로젝트로 “식당 추천 시스템”을 하게 되면서, 팀원들이 네이버/카카오/구글맵 리뷰 데이터를 각자 분배 …
Source: jenn1won.tistory.com
Date Published: 3/28/2021
View: 9487
주제와 관련된 이미지 리뷰 크롤링
주제와 관련된 더 많은 사진을 참조하십시오 [파이썬] 웹크롤링_네이버 영화 리뷰. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 리뷰 크롤링
- Author: 생각하는 코딩
- Views: 조회수 1,756회
- Likes: 좋아요 20개
- Date Published: 2020. 5. 8.
- Video Url link: https://www.youtube.com/watch?v=jGJk7ww-ZvU
[크롤링] 네이버 영화 리뷰 크롤링하기(파이썬/python/web crawling/웹 크롤링/제목 리뷰 평점 수집하는 방법)
파이썬을 사용하여 네이버 영화의 네티즌 평점과 리뷰 크롤링하고 csv 파일로 저장해봅니다
1. 필요한 패키지 불러오기 – requests, BeautifulSoup, time, csv
requests : HTTP 요청을 위해 사용하는 파이썬 라이브러리
BeautifulSoup : 웹 사이트에서 데이터를 추출하는 웹 스크래핑 라이브러리
time : 시간 데이터 처리 모듈
csv : CSV형식의 데이터를 읽고 쓰는 모듈
import requests from bs4 import BeautifulSoup import time import csv
2. soup 객체 만들기
네이버 영화 리뷰 웹 페이지 구성 확인하기
데이터를 추출할 웹 페이지가 어떻게 구성되어 있는지 확인합니다.
아래의 네이버 영화에서는 네티즌의 리뷰와 평점이 게시되어있습니다.
https://movie.naver.com/movie/point/af/list.naver?&page=1
한 페이지에 10개의 리뷰가 있습니다.
다른 페이지를 불러오기 위해서는 URL의 마지막에 페이지 숫자를 바꿔줍니다.
2페이지-> https://movie.naver.com/movie/point/af/list.naver?&page=2
3페이지-> https://movie.naver.com/movie/point/af/list.naver?&page=3
soup 객체 만들기
for문으로 페이지 숫자를 증가해 가면서 soup 객체를 만들어 웹 페이지에서 HTML을 받아옵니다.
find_all는 지정한 조건의 태그의 내용을 모두 찾아 리스트로 반환합니다.
find_all(‘태그 이름’, {‘속성 이름’: ‘속성 값’ …}) 형식으로 조건을 지정합니다.
tag가 td이고 class가 title인 태그를 riviews에 저장합니다.
한 페이지의 10개의 리뷰가 있으므로 10개의 리뷰 HTML이 reviews에 저장됩니다.
#page를 1부터 1씩 증가하며 URL을 다음 페이지로 바꿈 for page in range(1,500): url = f’https://movie.naver.com/movie/point/af/list.naver?&page={page}’ #get : request로 url의 html문서의 내용 요청 html = requests.get(url) #html을 받아온 문서를 .content로 지정 후 soup객체로 변환 soup = BeautifulSoup(html.content,’html.parser’) #find_all : 지정한 태그의 내용을 모두 찾아 리스트로 반환 reviews = soup.find_all(“td”,{“class”:”title”})
3. 데이터 수집하기
수집하려는 데이터를 어떻게 html에서 가져올 수 있을지 확인합니다.
< 웹 페이지>
(F12개발자 도구-> Ctrl + Shift + C 누르고 커서를 사용해서 페이지의 찾고 싶은 요소 확인하기)
get과 get_text를 사용하여 setence – 리뷰, movie – 영화 제목, score- 평점을 저장합니다.
get – 지정한 태그의 모든 URL을 수집
get_text – 지정한 태그 아래의 텍스트를 문자열로 반환
#한 페이지의 리뷰 리스트의 리뷰를 하나씩 보면서 데이터 추출 for review in reviews: sentence = review.find(“a”,{“class”:”report”}).get(“onclick”).split(“‘, ‘”)[2] #만약 리뷰 내용이 비어있다면 데이터를 사용하지 않음 if sentence != “”: movie = review.find(“a”,{“class”:”movie color_b”}).get_text() score = review.find(“em”).get_text() review_data.append([movie,sentence,int(score)]) need_reviews_cnt-= 1
4. CSV 파일로 저장
movie, sentence, score의 열의 데이터 형식으로 추출한 데이터를 저장합니다.
columns_name = [“movie”,”sentence”,”score”] with open ( “samples.csv”, “w”, newline =””,encoding = ‘utf8’ ) as f: write = csv.writer(f) write.writerow(columns_name) write.writerows(review_data)
< 저장된 CSV파일 결과 >
5. 다음 페이지를 조회하기 전 시간 두기
time 라이브러리의 sleep 함수를 사용하면 지정한 시간 동안 프로세스를 일시 정지할 수 있습니다.
time.sleep(0.5)
6. 전체 python 코드
import requests from bs4 import BeautifulSoup import time import csv need_reviews_cnt = 1000 reviews = [] review_data=[] #page를 1부터 1씩 증가하며 URL을 다음 페이지로 바꿈 for page in range(1,500): url = f’https://movie.naver.com/movie/point/af/list.naver?&page={page}’ #get : request로 url의 html문서의 내용 요청 html = requests.get(url) #html을 받아온 문서를 .content로 지정 후 soup객체로 변환 soup = BeautifulSoup(html.content,’html.parser’) #find_all : 지정한 태그의 내용을 모두 찾아 리스트로 반환 reviews = soup.find_all(“td”,{“class”:”title”}) #한 페이지의 리뷰 리스트의 리뷰를 하나씩 보면서 데이터 추출 for review in reviews: sentence = review.find(“a”,{“class”:”report”}).get(“onclick”).split(“‘, ‘”)[2] #만약 리뷰 내용이 비어있다면 데이터를 사용하지 않음 if sentence != “”: movie = review.find(“a”,{“class”:”movie color_b”}).get_text() score = review.find(“em”).get_text() review_data.append([movie,sentence,int(score)]) need_reviews_cnt-= 1 #현재까지 수집된 리뷰가 목표 수집 리뷰보다 많아진 경우 크롤링 중지 if need_reviews_cnt < 0: break #다음 페이지를 조회하기 전 0.5초 시간 차를 두기 time.sleep(0.5) columns_name = ["movie","sentence","score"] with open ( "samples.csv", "w", newline ="",encoding = 'utf8' ) as f: write = csv.writer(f) write.writerow(columns_name) write.writerows(review_data) 반응형
네이버 쇼핑몰 리뷰 크롤링
오늘은 네이버 쇼핌몰 리뷰 크롤링을 진행해봤습니다. “LG 에어로타워”에 대한 리뷰가 필요한데, 네이버 쇼핑몰의 리뷰가 수는 적어도 괜찮은 평가들이 있더라구요!
에어로타워 쇼핑몰리뷰를 크롤링해보겠습니다.
1. 사용할 라이브러리 불러오기
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 import warnings warnings . filterwarnings ( ‘ignore’ )
크롤링을 위해 Selenium과 BeautifulSoup를 불러옵니다!
2. 웹사이트 불러오기
name = [ ‘LG 에어로타워’ ] category = [ ‘별점’ ] ns_address = “https://search.shopping.naver.com/catalog/30128278618?cat_id=50002543&frm=NVSCPRO&query=%EC%97%90%EC%96%B4%EB%A1%9C%ED%83%80%EC%9B%8C&NaPm=ct%3Dl0ksn0vc%7Cci%3D5bbd25c0299ce5dbcb72ff2b1d41488ebd6d52ce%7Ctr%3Dsls%7Csn%3D95694%7Chk%3D87194ce8ced4cb2b52968022b8eb9db67602d12e” shoppingmall_review = “/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul”
크롤링할 웹사이트 주소를 ns_address에 입력해줍니다. 그리고 전 1점부터 5점까지 모든 리뷰를 크롤링할 것이라 shoppingmall_review에 전체 리뷰 부분을 입력해줬습니다. 따로 크롤링할 부분을 정하고 싶으신 분들은 category를 추가로 입력해주시면 됩니다.
html 주소를 찾고싶은 부분에서 우클릭한 후 “검사”를 눌러주면 쉽게 찾을 수 있습니다. 그리고 필요한 주소에서 “우클릭 -> Copy -> Copy full XPath” 를 눌러주면 됩니다.
3. 쇼핑몰 리뷰 불러오기
header = { ‘User-Agent’ : ” } d = webdriver . Chrome ( ‘chromedriver.exe’ ) 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 )
webdriver를 통해 Chrome을 임의로 실행합니다.
4. 데이터 프레임 만들기
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
크롤링한 데이터를 저장할 곳도 필요하겠죠?
5. 리뷰 가져오기
d . find_element_by_xpath ( shoppingmall_review ) . click ( ) name_ = name [ 0 ] category_ = category [ 0 ] reviews = [ ] stars = [ ] cnt = 1 page = 1
임의로 실행한 Chrome에서 리뷰를 가져옵니다. 리뷰와 평점에 대한 변수명도 지정해줍니다.
6. 리뷰 수집하기
while True : j = 1 print ( “페이지” , page , ”
” ) sleep ( 2 ) while True : 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]’ ) . text reviews . append ( review ) if j % 2 == 0 : 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]’ ) d . execute_script ( “arguments[0].scrollIntoView(true);” , ELEMENT ) j += 1 print ( cnt , review , star , ”
” ) cnt += 1 except : break sleep ( 2 ) if page < 11 : try : 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 else : try : 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 ) 이제 리뷰 데이터를 수집해줘야겠죠? star부분에는 평점이 있는 XPath를 입력해주시고, review부분에는 리뷰가 있는 XPath를 입력해주시면 됩니다. 7. 엑셀 파일로 저장하기 df4 . to_excel ( 'result.xlsx' ) 마지막으로 엑셀파일로 저장하면 됩니다.
Insight to Ptofitc
728×90
문제사항 : 모든 리뷰를 가져오고 싶지만 가장 첫 리뷰만 크롤링 되었다.
에러원인: 컨테이너 범위 잘못 지정
크롤링 할 데이터를 가져오기 전, 각 데이터를 포함하는 하나의 컨테이너를 지정해줘야 한다 (노란부분)
: 컨테이너는 ‘이 유닛 기준으로 데이터 크롤링을 할꺼야~’ 라는 일종의 표시라고 생각하면 된다.
해결
각 리뷰의 [ ID, Date, Review_text ]를 가져오고 싶다면,
이 데이터들이 담긴 한 유닛(리뷰 하나)만 컨테이너로 지정해주면 된다.
앞에서 저지른 실수는 아래와 같이 전체를 컨테이너로 정의했기 때문이다.
잘못된 예
아래와 같이 한 유닛(리뷰 하나)만 컨테이너로 정해줘야 한다.
옳은 예
컨테이너를 변경한 결과 각각의 리뷰에서 데이터들이 잘 뽑아졌다.
그런데 리뷰들이 잘려서 크롤링 되었다.
위의 리뷰처럼 더보기(More) 처리를 안해줘서 생긴 현상이다.
더보기 처리 방법은 다음 글에서 다루겠다.
다음 글 이어보기
728×90
반응형
5,114개 리뷰로 증명된 35,665개 데이터 서비스를 5,000원에서 부터 만나보세요!
(주)크몽은 통신판매중개자이며, 통신판매의 당사자가 아닙니다. 상품, 상품정보, 거래에 관한 의무와 책임은 판매회원에게 있습니다.
(주)크몽 사이트의 상품/판매회원/중개 서비스/거래 정보, 콘텐츠, UI 등에 대한 무단복제, 전송, 배포, 스크래핑 등의 행위는 저작권법, 콘텐츠산업 진흥법 등 관련법령에 의하여 엄격히 금지됩니다. [안내 보기]
[파이썬:웹크롤링] #11 쇼핑몰 제품정보/평점/리뷰수 리스트업
1. 데이터가 있는 페이지 url 확인
먼저 원하는 정보가 있는 웹사이트를 찾아야 한다. 원하는 데이터를 찾기 위해 페이지에서 제공하는 검색기능을 사용한다.
리뷰가 가장 많은 제품을 찾았다!
2. 필요한 데이터 선정 및 html 확인
각 제품을 들어가 상세페이지를 확인한다.
추출하고자 하는 제품정보(제품명, 등록일, 최저/최고 가격), 평점, 평점 별 리뷰수를 확인할 수 있다. 해당 데이터들의 html과 중복여부를 확인하자.
▼ 중복 검사/확인하는 방법글
제품명
는 2개가 있고 그중 첫번째 값이 제품명이다.
등록일
등록일은 하위의 에 있고 제조사/브랜드와 중복되며 순서상 3번 째 위치한다.
평점
에 위치해 있고 “4.8”(쌍따옴표)로 표현되어 있다.최저/최고 판매가
평점 별 리뷰 수
평점 별 리뷰 수는 5점부터 1점까지
아래 에 순서대로 위치해 있다. 여기까지 확인한 html 선택자는 아래와 같다.
데이터 html 선택자 제품명
중 첫번 째 값 등록일 아래
중 3번 째 값 평점
아래 최저/최고 판매가 아래 *해당 선택자의 처음과 마지막 값을 추출해 줘야한다. 평점 별 리뷰 수 5점
아래 중 2번째 값 4점
아래 중 3번째 값 3점
아래 중 4번째 값 2점
아래 중 5번째 값 1점
아래 중 6번째 값
*경로는 홈페이지의 보안을 위해 주기적으로 변경될 수 있으니, 항상 확인해야 함.
3. 코드 작성
엑셀표로 만들기 위해 column과 row값을 먼저 생각하고 코드를 짜야한다.
제품명 평점 5점 개수 4점 개수 3점 개수 2점 개수 1점 개수 최저가 최고가 등록일
이런 형태로 표를 만들겠다고 생각하면 columns = [ ‘제품명’, ‘평점’, ‘5점 개수’, ‘4점 개수’, ‘3점 개수’, ‘2점 개수’, ‘1점 개수’, ‘최저가’, ‘최고가’, ‘등록일’ ] 로 설정할 수 있다. 이제 본격적으로 코드를 작성하자.
먼저 requests와 BeautifulSoup 모듈을 활성화 시키고 웹의 html을 불러와준다.
# 라이브러리 활성화 import requests from bs4 import BeautifulSoup # html 불러오기 web_site = requests.get(“~”) web_html = BeautifulSoup(web_site.text, ‘html.parser’)
html을 불러왔으니 앞서 확인한 <태그>와 선택자를 .select()와 .find() 메소드와 리스트 슬라이싱 [0:0]을 통해
데이터를 추출해야 한다. .select()와 .find() 무엇을 사용하든지 상관없다.
▼ .select() .find() 메소드 사용법
중간중간 print()를 사용해 데이터 값을 출력해 정상적으로 추출되는지 확인해 보자.
# .select_one()메소드로
중 첫번째만 선택. product_name = web_html.select_one(‘h2’).get_text() # .select()로 중복 추출되는 [ 제조사, 브랜드, 등록일 ]를 슬라이싱하여 3번째(인덱스 2)값만 선택 upload_data = web_html.select(‘.top_cell__3DnEV em’)[2].get_text() # .find()로 추출되는 text(=평점4.8)을 숫자만 추출하기 위해 3번째(인덱스2)~5번째(인덱스6)을 추출 average_grade = web_html.find(class_=”top_grade__3jjdl”).get_text()[2:5] # 중복추출 되는 값 중 첫번째와 마지막을 각각 추출 low_price = web_html.select(‘.productList_price__2FKhU em’)[0].get_text() high_price = web_html.select(‘.productList_price__2FKhU em’)[-1].get_text() # 중복되는 추출 값 중 2~6번째 값을 각각 선택하여, 숫자만 추출하기 위해 2번째~마지막 전까지의 값 추출 five_point = web_html.select(‘.filter_top_list__3rOdK em’)[1].get_text()[1:-1] four_point = web_html.select(‘.filter_top_list__3rOdK em’)[2].get_text()[1:-1] three_point = web_html.select(‘.filter_top_list__3rOdK em’)[3].get_text()[1:-1] two_point = web_html.select(‘.filter_top_list__3rOdK em’)[4].get_text()[1:-1] one_point = web_html.select(‘.filter_top_list__3rOdK em’)[5].get_text()[1:-1]
데이터가 정상적으로 추출된 것을 확인 했으니 이제 엑셀에 데이터를 넣어보도록 하자.
▼ 파이썬으로 엑셀 표 만들기
라이브러리 openpylx를 활성화 시키고 .Workbook()으로 엑셀파일을 만들어 주고 .create_sheet(‘~’)로 시트를 지정해 준다. 그리고 앞서 생각해 두었던 표의 column값이 되어줄 [리스트]를 적어주자.
제품명 평점 5점 개수 4점 개수 3점 개수 2점 개수 1점 개수 최저가 최고가 등록일
columns = [ ‘제품명’, ‘평점’, ‘5점 개수’, ‘4점 개수’, ‘3점 개수’, ‘2점 개수’, ‘1점 개수’, ‘최저가’, ‘최고가’, ‘등록일’ ] 로 설정할 수 있다.
import requests from bs4 import BeautifulSoup from openpyxl import Workbook # openpyxl 모듈 활성화 #컬럼 값을 지정하여 엑셀시트 생성 wb = Workbook(write_only=True) ws = wb.create_sheet(‘LG 스타일리스트 온라인 반응’) ws.append([ ‘제품명’, ‘평점’, ‘5점 개수’, ‘4점 개수’, ‘3점 개수’, ‘2점 개수’, ‘1점 개수’, ‘최저가’, ‘최고가’, ‘등록일’ ]) web_site = requests.get(“~”) web_html = BeautifulSoup(web_site.text, ‘html.parser’) product_name = web_html.select_one(‘h2’).get_text() upload_data = web_html.select(‘.top_cell__3DnEV em’)[2].get_text() average_grade = web_html.find(class_=”top_grade__3jjdl”).get_text()[2:5] low_price = web_html.select(‘.productList_price__2FKhU em’)[0].get_text() high_price = web_html.select(‘.productList_price__2FKhU em’)[-1].get_text() five_point = web_html.select(‘.filter_top_list__3rOdK em’)[1].get_text()[1:-1] four_point = web_html.select(‘.filter_top_list__3rOdK em’)[2].get_text()[1:-1] three_point = web_html.select(‘.filter_top_list__3rOdK em’)[3].get_text()[1:-1] two_point = web_html.select(‘.filter_top_list__3rOdK em’)[4].get_text()[1:-1] one_point = web_html.select(‘.filter_top_list__3rOdK em’)[5].get_text()[1:-1]
마지막으로 추출한 데이터를 엑셀 row값에 넣어서 저장하면 끝!
import requests from bs4 import BeautifulSoup from openpyxl import Workbook # openpyxl 모듈 활성화 #컬럼 값을 지정하여 엑셀시트 생성 wb = Workbook(write_only=True) ws = wb.create_sheet(‘LG 스타일리스트 온라인 반응’) ws.append([ ‘제품명’, ‘평점’, ‘5점 개수’, ‘4점 개수’, ‘3점 개수’, ‘2점 개수’, ‘1점 개수’, ‘최저가’, ‘최고가’, ‘등록일’ ]) web_site = requests.get(“~”) web_html = BeautifulSoup(web_site.text, ‘html.parser’) product_name = web_html.select_one(‘h2’).get_text() upload_data = web_html.select(‘.top_cell__3DnEV em’)[2].get_text() average_grade = web_html.find(class_=”top_grade__3jjdl”).get_text()[2:5] low_price = web_html.select(‘.productList_price__2FKhU em’)[0].get_text() high_price = web_html.select(‘.productList_price__2FKhU em’)[-1].get_text() five_point = web_html.select(‘.filter_top_list__3rOdK em’)[1].get_text()[1:-1] four_point = web_html.select(‘.filter_top_list__3rOdK em’)[2].get_text()[1:-1] three_point = web_html.select(‘.filter_top_list__3rOdK em’)[3].get_text()[1:-1] two_point = web_html.select(‘.filter_top_list__3rOdK em’)[4].get_text()[1:-1] one_point = web_html.select(‘.filter_top_list__3rOdK em’)[5].get_text()[1:-1] # 위에 추출한 데이터 값을 리스트로 묶어 ws에 추가 ws.append([product_name, upload_data, average_grade, low_price, high_price, five_point, four_point, three_point, two_point, one_point]) # ‘파일이름.xlsx’로 엑셀 확장자로 저장 wb.save(‘LG 스타일러 평점.xlsx’)
스마트스토어 상품 리뷰 추출하기 – 파이썬 크롤링 연습
네이버 지식in에서 질문한 내용을 답해준 내용으로, 네이버 쇼핑에 노출되는 스마트 스토어 상품의 고객 리뷰(페이지당 20개)에 대해 파이썬 크롤링으로 추출하는 방법을 간단하게 포스팅해보려 한다.
스마트스토어 상품 리뷰를 크롤링으로 추출해하기
※ 기본 틀만 언급하여 전체 내용을 나오도록 하는 방법만 소개하며, 세부적인 내역(평점, 작성일, 상품명, 리뷰글 등)은 자체적으로 해결하도록 함
※ 또한 추출 방법은 질문을 selenium 사용법으로 했기 때문에 selenium으로 해결하는 방법을 설명함
파이썬 크롤링 소스코드는 다음과 같다.
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By import time, random def chromeWebdriver(): chrome_service = ChromeService(executable_path=ChromeDriverManager().install()) options = Options() options.add_experimental_option(‘detach’, True) options.add_experimental_option(‘excludeSwitches’, [‘enable-logging’]) user_agent = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36′ options.add_argument(f’user-agent={user_agent}’) # options.add_argument(‘–headless’) driver = webdriver.Chrome(service=chrome_service, options=options) return driver url =’https://smartstore.naver.com/blmgshop/products/100061153/’ driver = chromeWebdriver() driver.get(url) time.sleep(2) # review = driver.find_element(By.ID, ‘REVIEW’) # xpath로 직접하면 필요없음 cnt = 1 for page in range(1, 3): lis = driver.find_element(By.XPATH, ‘//*[@id=”REVIEW”]/div/div[3]/div/div[2]/ul’).find_elements(By.TAG_NAME, ‘li’) for li in lis: print(li.text) print(f’review_count: {cnt}
‘) cnt += 1 time.sleep(random.uniform(0.5, 1)) # 페이징 처리 부분 (다음 버튼) driver.find_element(By.XPATH, ‘//*[@id=”REVIEW”]/div/div[3]/div/div[2]/div/div/a[12]’) driver.quit()
selenium에서 크롬드라이브 사용 시 함수로 만들어서 사용하면 편리함 (다른 곳에 복사하거나 호출하여 사용할 수 있음)
REVIEW 부분이 css ID로 구분되어 있어서 driver.find_element(By.ID, ‘REVIEW’)를 사용하려고 하다가 XPATH를 바로 대입해서 처리하니 바로 되었음
페이지 처리는 페이지네이션 마지막 ‘다음’을 XPATH로 잡아서 for 문에 걸어주면 쉽게 해결되었고,
for page in range(1, 4) 부분에서 4를 큰 수로 바꾸면 그만큼의 페이지 처리가 가능하며, 여기의 page는 사용하지 않아도 됨
서버에 영향을 덜 주기 위해 time(), random()으로 조정을 해줌
[추출 결과]리뷰 내용 추출 결과
반응형
[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 1(feat. selenium)
728×90
반응형
[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 1(feat. selenium) [리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 2(feat. selenium) [리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 3(feat. selenium) [리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 4(feat. selenium) [리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 5(feat. selenium)안드로이드 Google Play Store에서 특정 앱에 달린 리뷰들을 크롤링하여 텍스트 분석을 하고자 한다.
일단 먼저 리뷰 데이터가 필요하므로 데이터 수집을 해야겠다.
찾아보니, 셀리니움(selenium)이라는 모듈을 많이들 사용하는 것 같다. 브라우저와 관련된 자동화 패키지라고하는데 개발과 관련있는 패키지같다. 하지만 나는 분석 목적으로 쓰고자 이 모듈을 이용해보겠다.
1. 모듈 설치
# python -m pip install –upgrade pip pip install selenium
cmd 창을 열고 해당 코드를 실행해준다.
pip를 업데이트 해주고(이미 업데이트 되었다면 패스~) 해당 모듈을 위와 같이 pip를 이용하여 설치를 진행한다.
2. Chrome 드라이버
크롤링을 브라우저에서 자동화하여 데이터를 수집하기 위해서는 웹드라이버가 필요하다.
나같은 경우엔, 크롬이 편할 거 같아서 일단 크롬으로 진행해보고자 한다.
2.1 Chrome 버전 확인
드라이버를 설치하기 전에 내 Chrome 버전을 확인하여 버전과 호환이 되는 드라이버를 설치할 필요가 있다.
먼저 크롬 창을 띄우고 아래의 코드를 입력해보자
Chrome://version
그러면 아래와 같은 버전 정보가 뜰 것이다.
크롬 버전 정보
필자의 경우, 84 버전이라고 나온다.
2.2 드라이버 설치
크롬의 버전을 확인했다면 아래의 링크에 접속하여 자신의 크롬 버전과 호환이 되는 드라이버를 설치한다.
https://sites.google.com/a/chromium.org/chromedriver/downloads
해당 버전을 클릭하면 pc의 os에 맞춰 크롬 드라이버를 다운받는다.
그러면 zip 파일 하나가 다운될텐데 압축을 해제시켜 놓으면 chromedriver.exe 가 생성될 것이다.
해당 exe 파일의 경로를 잘 기억해두자.
3. 드라이버 실행
다운받은 드라이버로 크롬을 실행시켜보자.
from selenium import webdriver url = “http://naver.com” # 접속하고자하는 url driverPath = “../config/chromedriver_win32/chromedriver.exe” # Chrome Driver path driver = webdriver.Chrome(driverPath) # Open Chrome driver.get(url) # Enter the url
코드로 크롬 실행
그림과 같이 아주 잘 접속되는 것을 확인할 수 있다.
한가지 다른 점이 있다면, 상단에 “Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다.” 라는 문구가 뜬다는 점!
4. 크롤링
이제 내가 원하는 리뷰 데이터를 받아보도록 하자.
리뷰의 대상인 어플은 내가 평소에 즐겨 사용하던 ZUMO 어플이었던 LifePlus어플의 데이터를 가져오고자 한다.
4.1 웹페이지 접속
해당 리뷰가 있는 페이지에 접속해보자.
https://play.google.com/store/apps
먼저, 플레이스토어에 접속하고 내가 원하는 어플 이름을 검색한다.
그럼 아래 그림과 같은 화면이 뜬다.
하단으로 내리다보면 리뷰들이 나온다.
여기서 리뷰들에 대해 더 보고싶다면, 해당 url 뒤에 “&showAllReviews=true”를 붙여준다. 그러면 전체 리뷰들이 담긴 화면이 나온다.
4.2 해당 화면 소스 접근
개발자 도구를 이용하여 리뷰 데이터에 접근하기 위한 소스를 확인해보자.
개발자 도구를 실행시키기 위해서는 F12 를 눌러주면 다음과 같은 화면이 나온다.
개발자도구(F12)
해당 소스는 html로 이루어졌기 때문에 간단한 html 구조를 알고있으면 편하다.
4.3 리뷰 위치 찾기
저 많은 코드 속에서 내가 원하는 리뷰 데이터는 어디에 있을까?
개발자 도구 상단 가장 왼쪽 화살표 모양의 아이콘을 클릭하면 그 위치를 찾을 수 있다.
아이콘 클릭
해당 아이콘을 클릭하고 리뷰가 달린 곳에 마우스를 위치하면 다음과 같은 위치가 뜬다. 하나의 리뷰를 클릭해보자.
html은 이와 같이 굉장히 많은 하위(트리) 구조를 갖으며 구성이 되어 있다. 여기서 해당 위치를 찾아 반복적으로 데이터를 수집해야한다.
다른 리뷰들도 확인해보면 공통의 테그를 찾아야한다. 또한 내가 원하는 데이터는 리뷰 내용도 있지만 리뷰가 달린 시점, 별점, 추천수와 같은 부수적인 데이터도 있으면 좋겠다.
이것들을 모두 확인해보면 다음과 같다.
필요한 데이터의 위치
이제 이 데이터들을 어떻게 긁어올지 한 번 생각해보자.
참고 블로그
https://m.blog.naver.com/jsk6824/221763151860
https://inahjeon.github.io/web-crawling/
728×90
반응형
네이버 영화 리뷰 키워드분석 (3) 리뷰 크롤링
글 쓰는게 여간 귀찮은게 아니다..
암튼 다음으로 넘어가보면 이제 전에 만들었던 baseurl에 접속해서 리뷰들을 크롤링하는 단계다.
#import한 패키지 목록 import re import pandas as pd import requests from tqdm import tqdm from bs4 import BeautifulSoup import time
일단 편의를 위해 영화는 주토피아로 정해놓았다.
베이스주소로 이동해보면
주토피아의 경우, 17921개의 리뷰들이 한 페이지당 10개씩 올라와있다.
따라서 총 페이지개수를 정할 수 있는데, 계산하기 귀찮으니 10개가 안되는 마지막 페이지는 버리고
총 리뷰수 % 10으로 정하자.
그럼 총 리뷰수를 가져오는 selector를 구하자
평점 수 부분은 score_total 클래스에서 strong, em을 거치면 접근할 수 있을 것 같다.
여기서 총 리뷰수를 구하고 10으로 나눠 페이지수를 구해보자
#영화는 주토피아로 고정 url = ‘https://movie.naver.com/movie/bi/mi/pointWriteFormList.nhn?code=130850&type=after&onlyActualPointYn=N&onlySpoilerPointYn=N&order=sympathyScore&page={}’ res = requests.get(url) index = 1 user_dic = {} if res.status_code == 200: soup=BeautifulSoup(res.text,’lxml’) total = soup.select(‘div.score_total > strong > em’)[0].text pages = int(total.replace(‘,’,”)[:-1]) #17,921 > 17921로 변환 후 캐스팅
잘 나온 것 같다. baseurl 뒷편에 페이지번호를 붙여서 url을 만든 후 접속해서 크롤링 해오면 되겠다.
이전 포스팅 설명에서는 베이스주소에 {}이 없었는데, 사실 하단의 전체코드를 보면 마지막에 ‘{}’이 추가되었다.
이는 지금 페이지를 포매팅하기 위함이다.
아…이제부터가 진짜 귀찮은데 하나하나 차근차근 정리해보겠다.
일단 내가 크롤링하고 싶은 데이터는 각각의 리뷰와 평점이다.
잘 보면, score_result 클래스 > ul 아래에 li가 여러개 있고 하나의 li는 하나의 리뷰칸을 차지한다.
li 하나를 열어보면 위 사진처럼 3개의 div로 되어있는데 첫번째가 평점쪽, 두번째가 리뷰쪽이다.
마지막 아래는 추천/비추천 버튼 공간이니 관심대상이 아니다.
먼저 평점부터 추출해보자. 위 사진을 보면 star_score클래스 아래의 em에 있다.
리뷰는 score_reple클래스 아래에 p를 거쳐 span에 있다. 여러개의 li가 다 이런 식으로 구성되어있다.
근데 주의해야할 점이 있다.
평점은 그대로 크롤링해도 괜찮은데,
이런 관람객 표시도 리뷰와 같은 위치에 있기 때문에 크롤링하면 ‘관람객’도 같이 추가된다.
그리고 스포일러댓글의 경우 자동으로 필터링이 되는데 이때, ‘스포일러가 포함된 감상평입니다. 감상평 보기’도 함께 리뷰로 처리된다.
나는 각 리스트별로 평점 하나, 리뷰 하나를 뽑고 싶은건데, 위의 경우 심하면 평점 하나, 리뷰 셋이 뽑히게 된다.
따라서 리뷰의 경우’ 관람객’이거나 저런 스포일러 안내문구가 아닌 경우만 크롤링해야한다.
일단 되는지 확인을 위해 한 페이지를 크롤링하는 코드를 먼저 구현해보자.
#####이 코드 말고 아래 코드 사용####### comments = [] #리뷰 stars = [] #평점 res = requests.get(url) if res.status_code == 200: soup=BeautifulSoup(res.text,’lxml’) star = soup.select(‘div.score_result > ul > li > div.star_score > em’) tds = soup.select(‘div.score_result > ul > li > div.score_reple > p > span’) for st in star: stars.append(int(st.text)) for cmt in tds: if cmt.text != ‘관람객’ and cmt.text !=’스포일러가 포함된 감상평입니다. 감상평 보기’: comments.append(cmt.text) if(len(comments) != len(stars)): #한 페이지에서 리뷰개수와, 별점개수가 같은지 확인 print(url)
그런데 이렇게 리뷰를 출력하면 다음과 같은 현상이 벌어진다.
태그가 span이기 때문인가..? 앞뒤로 공백이 엄청나게 붙는다. (코알못임 이유모름 ㅠㅠ)
따라서 각 리뷰를 append하기 전에 정규표현식을 통해 공백들을 제거하였다.
# 리뷰 앞뒤로 쓸데없는 공백을 제거하는 함수 def no_space(text): text1 = re.sub(‘ | |
|\t|\r’, ”, text) text2 = re.sub(‘
‘,”, text1) return text2
위 함수를 이용하여 comments에 추가하기 전에 정제해주자
comments = [] stars = [] res = requests.get(url) if res.status_code == 200: soup=BeautifulSoup(res.text,’lxml’) star = soup.select(‘div.score_result > ul > li > div.star_score > em’) tds = soup.select(‘div.score_result > ul > li > div.score_reple > p > span’) for st in star: stars.append(int(st.text)) for cmt in tds: if cmt.text != ‘관람객’ and cmt.text !=’스포일러가 포함된 감상평입니다. 감상평 보기’: comments.append(no_space(cmt.text)) #####여기에 추가됨 if(len(comments) != len(stars)): print(url)
결과를 확인해볼까?
보이는 대로 제대로 가져온 것을 확인할 수 있다 (다행 ㅠㅠ)
이제 위 코드를 활용하여 여러 페이지를 크롤링 해보자.
딱히 어려운 건 없다. 페이지 번호만 바꿔주면서 반복문을 돌리면 된다.
이때, 그냥 돌리다보면 언제끝날지 모르기에 tqdm을 사용하여 진행상황을 출력하도록 했다.
base_url = url comments = [] stars = [] for page in tqdm(range(1,pages+1)): url = base_url.format(page) if res.status_code == 200: soup=BeautifulSoup(res.text,’lxml’) star = soup.select(‘div.score_result > ul > li > div.star_score > em’) tds = soup.select(‘div.score_result > ul > li > div.score_reple > p > span’) for st in star: stars.append(int(st.text)) for cmt in tds: if cmt.text != ‘관람객’ and cmt.text !=’스포일러가 포함된 감상평입니다. 감상평 보기’: comments.append(no_space(cmt.text)) if(len(comments) != len(stars)): print(url) break
전체 페이지를 크롤링 하는 데 33초 정도 걸렸다.
개수도 틀리지 않고 잘 가져왔다. 애초에 마지막 페이지의 열개미만의 리뷰들은 버리기로 했으니.
이제 이 평점과 데이터들의 리스트를 데이터프레임으로 변환하여 csv로 저장하면 끝이다!
df = pd.DataFrame({“Review”:comments, “Rank”:stars}) df.to_csv(‘data/주토피아review.csv’ , index= False) #파일경로
지정한 경로에 가서 파일이 제대로 쓰여졌는지 확인해보자
제대로 된 것 같다.
사실 csv파일을 저장할 필요 없이 만들어놓은 데이터프레임으로 진행하면 된다.
근데 해보니까 미묘하게 다르고 파일로 하는게 코드 수정하기에도 편했다.
잘못해서 데이터프레임 잘못건들면 또 크롤링해야됨 ㅠㅠ
다음에는 크롤링한 데이터로 모델링/키워드 추출 하기 전에 전처리하는 과정을 다룰 것이다.
전체코드는 여기 Click!!
def crawl_review(base_url): def no_space(text): text1 = re.sub(‘ | |
|\t|\r’, ”, text) text2 = re.sub(‘
‘,”, text1) return text2 res = requests.get(base_url) if res.status_code == 200: soup=BeautifulSoup(res.text,’lxml’) total = soup.select(‘div.score_total > strong > em’)[0].text pages = int(total.replace(‘,’,”)[:-1]) #17,921 > 17921로 변환 후 캐스팅 print(f”{pages}개의 페이지에서 리뷰를 모으고 있습니다.”) time.sleep(1) comments = [] stars = [] for page in tqdm(range(1,pages+1)): url = base_url.format(page) if res.status_code == 200: soup=BeautifulSoup(res.text,’lxml’) star = soup.select(‘div.score_result > ul > li > div.star_score > em’) tds = soup.select(‘div.score_result > ul > li > div.score_reple > p > span’) for st in star: stars.append(int(st.text)) for cmt in tds: if cmt.text != ‘관람객’ and cmt.text !=’스포일러가 포함된 감상평입니다. 감상평 보기’: comments.append(no_space(cmt.text)) if(len(comments) != len(stars)): print(url) break assert len(comments) == len(stars) df = pd.DataFrame({“Review”:comments, “Rank”:stars}) return df def save_and_load(dataframe): basepath = ‘data/’ dataframe.to_csv(basepath+’주토피아review.csv’ , index= False) df = pdr.read_csv(basepath+’주토피아.csv’) return df
[Python/Crawling] 네이버 플레이스(네이버 지도) 리뷰 크롤링
사실 selenium이 편하니까 머릿속으로는 웬만하면 뷰숲써야지 하면서도 (selenium은 라이브러리 자체가 굉장히 무겁기도 하고 잘 막힌다는 단점이 있다.) 굳이 막히지만 않으면 동적으로 크롤링하는 버릇(?)이 있었다. 하지만 내가 적은 코드 명령들을 전혀 먹어주지 않는 네이버와 근 몇 달 간 함께하면서 뷰숲과 많이 친해졌다.
종강하고 좀만 여유로워지면 올릴게욥.. 찬찬히 뜯어보겠음..
크롤링하게 된 이유
빅데이터 동아리 ADV 프로젝트로 “식당 추천 시스템”을 하게 되면서, 팀원들이 네이버/카카오/구글맵 리뷰 데이터를 각자 분배하여 크롤링하기로 했다. 사다리 탔는데 네이버가 걸렸다. 네이버는 크롤링이 자주 막힌다.. F12를 누르면 훤히 보이는 소스들을 파이썬에다가 순순히 보내주지 않는다.
작업 환경
Jupyter Notebook
본격적인 크롤링에 들어가기에 앞서 주의할 점
네이버 플레이스에 “XX역 XXX(식당이름)”라고 검색했을 때, 하나의 결과가 나오는 플레이스만 크롤링이 가능하다.
이유 : 검색했을 때, 여러 개의 플레이스 결과가 나오면, 그 중 하나의 플레이스를 선택해서 클릭시키는 동작을 수행시켜야 해당 플레이스의 url에 접근이 가능한데, 온갖 시도를 다 해보았지만 click이 먹히지 않았다. 이런 이유로, 위와 같이 검색했을 때 여러 개의 결과가 나오는 프랜차이즈 식당의 리뷰는 크롤링이 불가했다.
키를 찾을 수 없다며 모든 동작을 할 수 없었기 때문에, 플레이스 명을 검색해서 해당 플레이스의 url을 뽑는 코드와 그 url에 접속해서 리뷰 데이터를 가져오는 코드를 작성했다.
완성된 csv 및 json으로 두 단계를 살펴보면 아래와 같다.
1단계 : 플레이스 url 뽑아오기 2단계 : 플레이스 별 리뷰 뽑아오기
크롤링 순서
A. 플레이스 URL 크롤링
A-1. 검색 및 검색한 플레이스에 대한 URL 추출
B. 각 플레이스 리뷰 크롤링
B-1. A에서 추출한 URL 접속
B-2. 더보기 버튼 누르기
B-3. 파싱 및 리뷰 가져오기
A. 플레이스 URL 크롤링
A-1. 검색 및 검색한 플레이스에 대한 URL 추출
크롤링의 상징 BeautifulSoup과 selenium을 모두 사용할 것이다.
import pandas as pd from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException import time import re from bs4 import BeautifulSoup from tqdm import tqdm df = pd.read_csv(‘원하는 플레이스 정보가 담긴 파일.csv’) df[‘naver_map_url’] = ” # 미리 url을 담을 column을 만들어줌 driver = webdriver.Chrome(executable_path=r’C:\Users\chromedriver.exe’) # 웹드라이버가 설치된 경로를 지정해주시면 됩니다.
자 이렇게 모든 준비는 끝났다. #가보자고
for i, keyword in enumerate(df[‘검색어’].tolist()): print(“이번에 찾을 키워드 :”, i, f”/ {df.shape[0]} 행”, keyword) try: naver_map_search_url = f’https://map.naver.com/v5/search/{keyword}/place’ # 검색 url 만들기 driver.get(naver_map_search_url) # 검색 url 접속, 즉 검색하기 time.sleep(4) # 중요함 cu = driver.current_url # 검색이 성공된 플레이스에 대한 개별 페이지 res_code = re.findall(r”place/(\d+)”, cu) final_url = ‘https://pcmap.place.naver.com/restaurant/’+res_code[0]+’/review/visitor#’ print(final_url) df[‘naver_map_url’][i]=final_url except IndexError: df[‘naver_map_url’][i]= ” print(‘none’) df.to_csv(‘url_completed.csv’, encoding = ‘utf-8-sig’)
(여기서 print 명령은 모두 내가 크롤링 현황을 주피터에서 확인하기 위함이다. 생략 가능 가능)
final url에 대해서는 조금 설명이 필요할 것 같아 덧붙인다. 코드를 보면 현재 플레이스에 접속한 상태에서 크롤링을 바로 시작하는 것이 아니라, 현재 url에서 특정 res_code를 뽑아와서 새로운 final_url에 맵핑을 해주는 과정을 거친다. 아까 서두에서 언급했듯이 특정 플레이스에 접속하면 어떤 동작도 먹히지 않는 것은 물론 tag와 path조차 찾지 못한다. 그러나 새로 맵핑한 final_url로 새로 접근하면, 크롤링 명령들이 모두 수행되는 환경이 된다. 어떻게 찾았는지는 진짜.. 계속 해보다가 찾았다.. 이거 또 언제 막힐지 모른다.. 네이버는.. 강력하다..
그래서 이 새로운 url을 플레이스마다 찾아서 append 해주고, 검색 결과가 없거나 여러 개인 경우는 IndexError로 건너뛰게 처리해주었다.
B. 각 플레이스 리뷰 크롤링
A에서 추출한 URL 접속 + 더보기 버튼 누르기 + 파싱 및 리뷰 가져오기
import pandas as pd from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException import time import re from bs4 import BeautifulSoup from tqdm import tqdm # 웹드라이버 접속 driver = webdriver.Chrome(executable_path=r’C:\Users\chromedriver.exe’) df = pd.read_csv(‘url_completed.csv’) #null값 처리 완료 데이터 # 수집할 정보들 rating_list = [] # 평점 user_review_id = {} # 유저의 id – 추천시스템에서는 필수 review_json = {} # 리뷰 image_json = {} # 이미지
모든 준비는 끝났다.
for i in range(len(df)): print(‘======================================================’) print(str(i)+’번째 식당’) # 식당 리뷰 개별 url 접속 driver.get(df[‘naver_map_url’][i]) thisurl = df[‘naver_map_url’][i] time.sleep(2) # 더보기 버튼 다 누르기 # 더보기 버튼 누르기까지 10개 # 더보기 버튼 누르면 10개 추가됨 while True: try: time.sleep(1) driver.find_element_by_tag_name(‘body’).send_keys(Keys.END) time.sleep(3) driver.find_element_by_css_selector(‘#app-root > div > div.place_detail_wrapper > div:nth-child(5) > div:nth-child(4) > div:nth-child(4) > div._2kAri > a’).click() time.sleep(3) driver.find_element_by_tag_name(‘body’).send_keys(Keys.END) time.sleep(1) except NoSuchElementException: print(‘-더보기 버튼 모두 클릭 완료-‘) break # 파싱 html = driver.page_source soup = BeautifulSoup(html, ‘lxml’) time.sleep(1) # 식당 구분 restaurant_name = df[‘검색어’][i] print(‘식당 이름 : ‘+restaurant_name) user_review_id[restaurant_name] = {} review_json[restaurant_name] = {} image_json[restaurant_name] = {} try: restaurant_classificaton = soup.find_all(‘span’,attrs = {‘class’:’_3ocDE’})[0].text except: restaurant_classificaton = ‘none’ print(‘식당 구분 : ‘+restaurant_classificaton) print(‘———————————————-‘) try: one_review = soup.find_all(‘div’, attrs = {‘class’:’_1Z_GL’}) review_num = len(one_review) # 특정 식당의 리뷰 총 개수 print(‘리뷰 총 개수 : ‘+str(review_num)) # 리뷰 개수 for i in range(len(one_review)): # user url user_url = one_review[i].find(‘div’, attrs = {‘class’:’_23Rml’}).find(‘a’).get(‘href’) print(‘user_url = ‘+user_url) # user url로부터 user code 뽑아내기 user_code = re.findall(r”my/(\w+)”, user_url)[0] print(‘user_code = ‘+user_code) # review 1개에 대한 id 만들기 res_code = re.findall(r”restaurant/(\d+)”, thisurl)[0] review_id = str(res_code)+”_”+user_code print(‘review_id = ‘+review_id) # rating, 별점 rating = one_review[i].find(‘span’, attrs = {‘class’:’_2tObC’}).text print(‘rating = ‘+rating) # 주의!!! 사진 리뷰 유무에 따라 날짜 파싱코드 다름 # (‘span’, attrs = {‘class’:’_3WqoL’}) # 사진 없는 경우 : 총 6개 중 4번째 # 사진 있는 경우 : 총 5개 중 3번째 # date # 사진 리뷰 없음 if len(one_review[i].find_all(‘span’, attrs = {‘class’:’_3WqoL’})) == 5: date = one_review[i].find_all(‘span’, attrs = {‘class’:’_3WqoL’})[2].text elif len(one_review[i].find_all(‘span’, attrs = {‘class’:’_3WqoL’})) == 6: date = one_review[i].find_all(‘span’, attrs = {‘class’:’_3WqoL’})[3].text else: date = “” print(‘date = ‘+date) # review 내용 try : review_content = one_review[i].find(‘span’, attrs = {‘class’:’WoYOw’}).text except: # 리뷰가 없다면 review_content = “” print(‘리뷰 내용 : ‘+review_content) # image 내용 sliced_soup = one_review[i].find(‘div’, attrs = {‘class’:’_1aFEL _2GO1Q’}) if (sliced_soup != None): sliced_soup = sliced_soup.find(‘div’,attrs={‘class’:’dRZ2X’}) try: img_url = ‘https://search.pstatic.net/common/?autoRotate=true&quality=95&type=l&size=800×800&src=’+re.findall(r’src=(.*jpeg)’, str(sliced_soup))[0] except : if (len(re.findall(r’src=(.*jpg)’, str(sliced_soup)))!= 0): img_url = ‘https://search.pstatic.net/common/?autoRotate=true&quality=95&type=l&size=800×800&src=’+re.findall(r’src=(.*jpg)’, str(sliced_soup))[0] elif (len(re.findall(r’src=(.*png)’, str(sliced_soup)))!= 0): img_url = ‘https://search.pstatic.net/common/?autoRotate=true&quality=95&type=l&size=800×800&src=’+re.findall(r’src=(.*png)’, str(sliced_soup))[0] else : img_url = “” else: img_url = “” print(‘이미지 url : ‘+img_url) print(‘———————————————-‘) print(‘
‘) #리뷰정보 # user_review_id user_review_id[restaurant_name][user_code] = review_id # review_json review_json[restaurant_name][review_id] = review_content # image_json image_json[restaurant_name][review_id] = img_url # rating_df_list naver_review = user_code, restaurant_name, rating, date rating_list.append(naver_review) except NoSuchElementException: none_review = “네이버 리뷰 없음” print(none_review) review_num = 0 #리뷰정보 = restaurant_name, restaurant_classification, review_num, none_review # rating_df_list naver_review = user_code, restaurant_name, none_review, none_reivew rating_list.append(naver_review) print(‘
‘)
(여기서 print 명령은 모두 내가 크롤링 현황을 주피터에서 확인하기 위함이다. 생략 가능 가능)
위 코드를 수행했을 때 결과창은 다음과 같다. (착실하게 수행된 print 명령들)
csv와 json 저장으로 마무리
rating_df = pd.DataFrame(rating_list) rating_df.columns = [‘UserID’,’ItemID’,’Rating’,’Timestamp’] rating_df.to_csv(‘rating9.csv’, encoding=’utf-8-sig’) import json file_path = “./user_review_id.json” with open(file_path,’w’) as outfile: json.dump(user_review_id,0 outfile) file_path = “./review.json” with open(file_path,’w’) as outfile: json.dump(review_json, outfile) file_path = “./image.json” with open(file_path,’w’) as outfile: json.dump(image_json, outfile)
많은 도움이 되었으면 좋겠네요 행복하세요
키워드에 대한 정보 리뷰 크롤링
다음은 Bing에서 리뷰 크롤링 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 [파이썬] 웹크롤링_네이버 영화 리뷰
[파이썬] #웹크롤링_네이버 #영화 #리뷰
- 동영상
- 공유
- 카메라폰
- 동영상폰
- 무료
- 올리기
YouTube에서 리뷰 크롤링 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 [파이썬] 웹크롤링_네이버 영화 리뷰 | 리뷰 크롤링, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.