1 바디럽 페이지에서 리뷰 데이터를 크롤링 해보자
- 라이브러리 불러오기 (requests, BeautifulSoup)
- 페이지 요청 및 응답받기 (get 메서드)
- bs 객체화
- 리뷰데이터를 추출 (페이지를 넘겨가며)
import requests as req # 서버와의 요청 및 응답을 위한 라이브러리
from bs4 import BeautifulSoup as bs
# 컴퓨터가 이해하기 쉬운 객체로 변환해주는 라이브러리
url = 'https://bodyluv.kr/product/%EB%B0%94%EB%94%94%EB%9F%BD-%EB%94%A5%EC%8A%AC%EB%A6%BD-%EB%B2%A0%EA%B0%9C-%EC%97%90%EC%96%B4%EB%B3%BC%EC%97%90%EC%96%B4%ED%8F%BC/44/category/1/display/2/#prdReview'
req.get(url)
<Response [403]>
h = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'}
res = req.get(url, headers = h)
res.text
soup = bs(res.text, 'lxml')
soup
soup.select('div.review_list_v2__message.js-collapsed-review-content.js-translate-text') # 값이 안나옴.
iframe
- 화면에는 존재하지만, 실제 데이터는 다른 서버에 존재하는 경우
# iframe을 통해서 다른 서버에 있는 데이터를 보여주기만 하기 때문에
# 실제 데이터가 저장되어 있는 iframe 주소로 찾아가서 contents를 추출
# f12 개발자도구 > iframe 검색(ctrl + f) > 실제 사용되고있는 iframe 찾기
# > src 속성을 활용해서 진짜 데이터가 있는 서버의 url 수집
url = 'https://review4.cre.ma/bodyluv.kr/products/reviews?product_code=44&iframe_id=crema-product-reviews-1&widget_style=&app=0&parent_url=https%3A%2F%2Fbodyluv.kr%2Fproduct%2F%25EB%25B0%2594%25EB%2594%2594%25EB%259F%25BD-%25EB%2594%25A5%25EC%258A%25AC%25EB%25A6%25BD-%25EB%25B2%25A0%25EA%25B0%259C-%25EC%2597%2590%25EC%2596%25B4%25EB%25B3%25BC%25EC%2597%2590%25EC%2596%25B4%25ED%258F%25BC%2F44%2Fcategory%2F1%2Fdisplay%2F2%2F%23prdReview&nonmember_token=&secure_device_token=V26e1cb6e1db2c3565de8954d7c456757520b6b228646b1af99326a708148731cdbe32072a69763b4a7a2f38174e1b8771&iframe=1'
res = req.get(url)
soup = bs(res.text, 'lxml')
soup
review = soup.select('div.review_list_v2__message.js-collapsed-review-content.js-translate-text')
print(len(review))
5
# 데이터 전처리
review[0].text
# 앞, 뒤 공백을 없애주는 메소드 -> strip()
review[0].text.strip()
순수한 리뷰 데이터만 출력해보자
- '~에 등록된 네이버 구매평'은 사용자가 작성한 리뷰가 아니다 -> 제거
- 만약, 리뷰에 '네이퍼 페이 구매평' 글자가 있는가? -> 판단
- 있다면 없애고, 없다면 그냥 넘어가자
naver_re = reviaew[0].text.strip()
# 'x' in string => string 안에 'x'가 있다면 True, 없다면 False
'네이버 페이 구매평' in naver_re
True
# 슬라이싱을 통해 접근
# 리뷰 내용이 매번 달라지므로 앞에서부터 접근 X, 뒤에서부터 접근!
naver_re[-38:]
'(2022-06-20 10:35:32 에 등록된 네이버 페이 구매평)'
# 방법 1)
if naver_re[-38:] in naver_re :
print(naver_re[:-38])
# 방법 2)
if '네이버 페이 구매평' in naver_re :
naver_re = naver_re.replace(naver_re[-38:], '')
print(naver_re)
좋아요잠이 솔솔오고 목도 안아푸고 다음날 일어나면 기분이 좋아요
# 방법 2)
url = 'https://review4.cre.ma/bodyluv.kr/products/reviews?product_code=44&iframe_id=crema-product-reviews-1&widget_style=&app=0&parent_url=https%3A%2F%2Fbodyluv.kr%2Fproduct%2F%25EB%25B0%2594%25EB%2594%2594%25EB%259F%25BD-%25EB%2594%25A5%25EC%258A%25AC%25EB%25A6%25BD-%25EB%25B2%25A0%25EA%25B0%259C-%25EC%2597%2590%25EC%2596%25B4%25EB%25B3%25BC%25EC%2597%2590%25EC%2596%25B4%25ED%258F%25BC%2F44%2Fcategory%2F1%2Fdisplay%2F2%2F%23prdReview&nonmember_token=&secure_device_token=V26e1cb6e1db2c3565de8954d7c456757520b6b228646b1af99326a708148731cdbe32072a69763b4a7a2f38174e1b8771&iframe=1'
res = req.get(url)
soup = bs(res.text, 'lxml')
review = soup.select('div.review_list_v2__message.js-collapsed-review-content.js-translate-text')
review_list = [] # 정재된 데이터를 담을 리스트 생성
for i in range(len(review)) : # 1 ~ 5번째 리뷰까지 반복
naver_re = review[i].text.strip() # 앞, 뒤 공백을 없앤 리뷰 데이터를 string 형태로
if '네이버 페이 구매평' in naver_re : # 네이버 페이 구매평이라는 글자가 있다면,
naver_re = naver_re.replace(naver_re[-38:], '') # 필요없는 글자 삭제
review_list.append(naver_re) # 전처리된 데이터를 리스트에 하나씩 저장
review_list
review_list = []
for i in range(len(review)) :
naver_re = review[i].text.strip()
if '네이버 페이 구매평' in naver_re :
naver_re = naver_re.replace(naver_re[-38:], '')
review_list.append(naver_re)
review_list
# 로딩시간 확인하는 함수
from tqdm import tqdm_notebook as tq
# 반복문을 활용해서 1페이지에서부터 10페이지까지 데이터 수집
review_list = [] # 정제된 데이터를 담을 리스트 생성
for page_num in tq(range(1, 11)) :
url = f'https://review4.cre.ma/bodyluv.kr/products/reviews?app=0&iframe=1&iframe_id=crema-product-reviews-1&page={page_num}&parent_url=https%3A%2F%2Fbodyluv.kr%2Fproduct%2Fdetail.html%3Fproduct_no%3D44%26cate_no%3D24%26display_group%3D1%26cafe_mkt%3Dnaver_ks%26mkt_in%3DY%26ghost_mall_id%3Dnaver%26ref%3Dnaver_open%26NaPm%3Dct%253Dlg4em1fc%257Cci%253Dd6d5cd060b41b0673a3d66cbc0fe13d29d03d346%257Ctr%253Dslsl%257Csn%253D499724%257Chk%253Dc342d42cca91a87ccb4373e6166553a76b839c7a&product_code=44&secure_device_token=V2dbee1785e9fe09b1f847e3c66952579c401a8594a60e51d17453126d570628bd7e89a8e9f8756702a1ce7f6196e859e9&widget_env=100&widget_style='
res = req.get(url)
soup = bs(res.text, 'lxml')
review = soup.select('div.review_list_v2__message.js-collapsed-review-content.js-translate-text')
for i in range(len(review)) : # 1 ~ 5번째 리뷰까지 반복
naver_re = review[i].text.strip() # 앞, 뒤 공백을 없앤 리뷰 데이터를 string 형태로
if '네이버 페이 구매평' in naver_re : # 네이버 페이 구매평이라는 글자가 있다면,
naver_re = naver_re.replace(naver_re[-38:], '') # 필요없는 글자 삭제
review_list.append(naver_re) # 전처리된 데이터를 리스트에 하나씩 저장
review_list
len(review_list)
워드클라우드 사용하기
import pandas as pd
dic = {'후기':review_list}
re_df = pd.DataFrame(dic)
re_df
# 파일 저장
re_df.to_csv('마약베개.txt')
# 저장한 파일 불러오기
f = open('멜론차트.txt', 'r', encoding='euc-kr')
data = f.read()
f.close()
print(data)
!pip install wordcloud
!pip install konlpy
from wordcloud import WordCloud
import matplotlib.pyplot as plt
wc = WordCloud(font_path = 'C:\Windows\Fonts\malgunbd.ttf',
background_color = 'white',
colormap = 'Dark2').generate(data)
wc.words_
plt.figure(figsize=(12, 5))
plt.axis('off') # x축 y축에 해당하는 축을 제거
plt.imshow(wc)
plt.savefig('./워드클라우드결과.jpg') # 이미지 결과 저장
'Web > Crawling' 카테고리의 다른 글
Gmarket 상품정보 수집 (0) | 2023.04.10 |
---|---|
한솥도시락 data 크롤링 (0) | 2023.04.09 |
selenium 라이브러리 (0) | 2023.04.09 |
멜론차트 TOP100 수집하기 (0) | 2023.04.05 |
크롤링 기초 (0) | 2023.04.05 |
댓글