파이썬 셀레니움

2024. 12. 10. 03:28파이썬(python) 웹 크롤링

1.셀레니움(Selenium)이란?

- 셀레니움(Selenium)은 웹 애플리케이션을 자동화하기 위한 오픈 소스 툴로, 브라우저를 프로그래밍적으로 제어하여 사람처럼 웹을 탐색하거나 상호작용할 수 있게 합니다. 주로 웹 테스트 자동화와 크롤링에 사용되며, 동적인 콘텐츠나 자바스크립트 렌더링이 필요한 웹 페이지에서도 효과적으로 동작합니다. Selenium WebDriver를 사용하면 Python, Java, C# 등 다양한 프로그래밍 언어로 브라우저를 제어할 수 있으며, Chrome, Firefox, Edge 등 여러 브라우저에서 작업이 가능합니다. 이를 통해 로그인, 폼 제출, 버튼 클릭, 데이터 스크랩과 같은 작업을 자동화할 수 있습니다.

 

우리는 Selenium을 사용하여 Chrome 브라우저에서 Google 홈페이지를 여는 법을 알아보겠습니다.

# Selenium 라이브러리에서 웹드라이버와 키 입력 기능을 불러옵니다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# Chrome 웹드라이버 객체를 생성합니다.
driver = webdriver.Chrome()

# Chrome 브라우저를 열고 Google 홈페이지로 이동합니다.
driver.get('https://www.google.com')

 

-->코드 실행시, Chrome 브라우저가 열리고 Google 홈페이지가 표시됩니다.

 

셀레니움 코드실행을 위해서는 ChromeDriver가 필요합니다.

ChromeDriver: 이 코드를 실행하기 위해서는 ChromeDriver가 시스템에 설치되어 경로가 설정되어 있어야 합니다---  Selenium 설치: Python 환경에서 Selenium 라이브러리를 설치하려면 다음 명령을 사용합니다:

#셀레니움 명령어 설치
pip install selenium

 

 

2.

셀레니움 예시2)

Chrome 브라우저에서 Google 홈페이지를 열고, 페이지 소스를 가져와 특정 HTML 요소를 찾는 작업을 알아봅시다.

이 예시는 SeleniumBeautifulSoup을 결합해 웹 페이지에서 특정 요소를 추출하는 방법을 보여줍니다.

# BeautifulSoup 라이브러리에서 HTML 파싱을 위한 클래스 불러옵니다.
from bs4 import BeautifulSoup

# Chrome 웹드라이버 객체를 생성합니다.
driver = webdriver.Chrome()

# Chrome 브라우저를 열고 Google 홈페이지로 이동합니다.
driver.get('https://www.google.com')

# 현재 페이지의 HTML 소스를 가져옵니다.
html = driver.page_source

# BeautifulSoup 객체를 생성하고, 가져온 HTML을 파싱합니다.
soup = BeautifulSoup(html)

# CSS 선택자를 사용해 id가 'hspDDf'인 요소를 찾습니다.
search = soup.select('#hspDDf')

# 찾은 요소들을 출력합니다.
print(search)

-->
##코드에 관한 자세한 설명
#from bs4 import BeautifulSoup

#BeautifulSoup 라이브러리에서 BeautifulSoup 클래스를 불러옵니다.
#BeautifulSoup은 HTML이나 XML 파일을 파싱하고 원하는 데이터를 추출하는 데 사용됩니다.
#driver = webdriver.Chrome()

#Chrome 브라우저를 자동으로 제어하기 위해 Selenium의 Chrome WebDriver 객체를 생성합니다.
#driver.get('https://www.google.com')

#Chrome 브라우저를 열고 Google 홈페이지로 이동합니다.
#html = driver.page_source

#현재 페이지의 HTML 소스코드를 가져와 문자열로 저장합니다.
#soup = BeautifulSoup(html)

#BeautifulSoup 객체를 생성하고, 가져온 HTML 문자열을 파싱합니다.
#'html.parser'는 기본 HTML 파서입니다.
#search = soup.select('#hspDDf')

#CSS 선택자 #hspDDf를 사용해 id가 hspDDf인 요소를 찾습니다.
#.select()는 리스트 형태로 결과를 반환합니다.
#print(search)

#찾은 요소를 출력합니다. 만약 요소를 찾지 못하면 빈 리스트 []가 출력됩니다.

 

-->이 코드 실행 후 브라우저를 닫고 싶다면 다음 코드를 추가해주세요

driver.quit()

 

3.

셀레니움 예시3)

from bs4 import BeautifulSoup  # HTML 파싱을 위해 BeautifulSoup을 불러옵니다.
import time  # 시간 지연과 현재 시간을 확인하기 위해 time 모듈을 불러옵니다.

# Chrome 웹드라이버 객체를 생성합니다.
driver = webdriver.Chrome()

# Chrome 브라우저에서 지정된 네이버 웹툰 페이지로 이동합니다.
driver.get('https://comic.naver.com/webtoon/detail?titleId=774866&no=133&week=mon')

# 웹 페이지가 완전히 로드될 때까지 2초 동안 대기합니다.
time.sleep(2)

# 현재 페이지의 HTML 소스를 가져와 BeautifulSoup 객체로 파싱합니다.
soup = BeautifulSoup(driver.page_source)

# 댓글이 포함된 모든 'span' 태그 중에서 class가 'u_cbox_contents'인 요소를 찾습니다.
comment_area = soup.find_all('span', {'class': 'u_cbox_contents'})

# 베스트 댓글 출력 시작 안내문
print('******** 베스트 댓글 ********')

# 찾은 모든 댓글을 반복하며 출력합니다.
for i in range(len(comment_area)):
    # 각 댓글의 텍스트를 추출하고 양쪽 공백을 제거합니다.
    comment = comment_area[i].text.strip()
    # 댓글을 출력합니다.
    print(comment)
    
-->
#부분 출력 결과
******** 베스트 댓글 ********
사진 찍은 명소민 스파이 암만 봐도 송쌤 맞는 것 같음 그 불륜사진 찍어서 보여준 시터랑 동일인물이고ㅋㅋㅋㅋ
아니 근데 땅콩 알러지 왤케 쎄하지 이것도 복선일 것 같은
여운이는 소명이 한 마디만으로도 갱생이 가능한 사람임... 명소민이 고작 공책 하나 공유 안 했다고 글러먹었다고 판단할 인물이 아님
여운이의 변화하는 행동과 생각이 명씨가 말하는 '글러먹은 인간' 따위가 없다는 걸 잘 보여주는듯.. 기특하다
여운 엄마는 애가 문 열고 나올 수 있었던 걸 자기 둘째랑 엄한 애한테 묻고 있네... 방치했으면서 이제와서 후회하는 척이야
2층엔 가족이 1층엔 언니가 
지하층엔 못된 아이가 갇히는

 

4.

예시4)

이 코드는 웹페이지에서 베스트 댓글을 수집하고 화면에 출력하는 예시를 알아봅니다.

# BeautifulSoup 라이브러리를 이용해 현재 페이지의 HTML 소스를 파싱합니다.
soup = BeautifulSoup(driver.page_source)

# 클래스가 'u_cbox_contents'인 모든 <span> 태그를 찾아 리스트로 저장합니다.
comment_area = soup.find_all('span', {'class', 'u_cbox_contents'})

# '******** 베스트 댓글 ********'라는 제목을 출력합니다.
print('******** 베스트 댓글 ********')

# 찾은 모든 댓글 요소를 반복문을 통해 하나씩 처리합니다.
for i in range(len(comment_area)):
    # i번째 댓글 요소에서 텍스트를 추출하고 앞뒤 공백을 제거합니다.
    comment = comment_area[i].text.strip()
    # 추출한 댓글을 출력합니다.
    print(comment)
 -->
 #부분 출력예시
 ******** 베스트 댓글 ********
얘네들 사복 학생처럼 보이게 입혀줬으면 좋겟다.사복만 보면 직장인이야~
드럽게재밋네
헐 6000번째 조아요!!이번편 떡밥많다..
진짜 명소민 뭔데 나대
아ㅜㅜㅜ

2. xPath란?

## xpath
XPath는 XML 또는 HTML 문서 내에서 특정 요소나 속성을 선택하기 위해 사용되는 경로 표현 언어입니다. 웹 크롤링이나 자동화 도구에서 주로 사용되며, 요소를 효율적으로 찾을 수 있도록 도와줍니다. 일반적인 XPath는 특정 위치나 속성을 기준으로 요소를 선택하는 상대적인 경로를 사용합니다.

 

1)야놀자 후기 크롤링에 대하여 알아봅시다.

from selenium import webdriver
from bs4 import BeautifulSoup
import time

def crawl_yanolja_reviews(name, url):
    # 리뷰 데이터를 저장할 빈 리스트를 생성합니다.
    review_list = []

    # Chrome WebDriver를 실행합니다.
    driver = webdriver.Chrome()
    
    # 주어진 URL로 이동합니다.
    driver.get(url)
    time.sleep(2)  # 페이지가 로딩될 시간을 확보하기 위해 2초간 대기합니다.

    # 페이지를 스크롤할 횟수를 설정합니다.
    scroll_count = 3

    # 설정된 횟수만큼 페이지를 스크롤합니다.
    for i in range(scroll_count):
        # 페이지를 맨 아래까지 스크롤합니다.
        driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
        time.sleep(2)  # 스크롤 후 데이터가 로드될 시간을 확보하기 위해 2초간 대기합니다.

    # 페이지 소스(HTML)를 가져옵니다.
    html = driver.page_source

    # BeautifulSoup을 이용해 HTML을 파싱합니다.
    soup = BeautifulSoup(html)

    # 리뷰 컨테이너들을 선택합니다.
    review_containers = soup.select('#__next > section > div > div.css-1js0bc8 > div > div > div')
    
    # 리뷰 날짜를 선택합니다.
    review_date = soup.select('#__next > section > div > div.css-1js0bc8 > div > div > div > div.css-1toaz2b > div > div.css-1ivchjf > p')

    # 리뷰 컨테이너의 개수만큼 반복합니다.
    for i in range(len(review_containers)):
        # 각 리뷰 컨테이너에서 리뷰 텍스트를 추출합니다.
        review_text = review_containers[i].find('p', class_='content-text').text

        # 해당 리뷰의 날짜를 추출합니다.
        date = review_date[i].text

        # 리뷰 데이터를 딕셔너리로 구성합니다.
        review_dict = {
            'review': review_text,  # 리뷰 텍스트
            'star': 0,              # 별점 (임시로 0으로 설정)
            'date': date            # 리뷰 날짜
        }

        # 딕셔너리를 리뷰 리스트에 추가합니다.
        review_list.append(review_dict)

    # 최종적으로 수집된 리뷰 리스트를 출력합니다.
    print(review_list)

crawl_yanolja_reviews('신라스테이 여수', 'https://www.yanolja.com/reviews/domestic/10046614')

-->

출력시

더보기
[{'review': '확실히 이름에 맞게 서비스가 너무 좋았습니다\n저희가 예약한 숙소 청소가 아직 진행중이었는데 마냥 기다리게 하지않고 더 넓은 숙소로 업그레이드해서 체크인을 도와주셔서 너무 편안하게 입실할 수 있었습니다 :)\n침대도 편안하고 방 청소도 엄청 깨끗하게 해주셔서 너무 만족스럽게 여행하고 왔어요\n헬스장도 수영장도 다 냄새하나 안나고 깨끗하고 좋았습니다ㅎㅎ 다음에 와도 또 묵고싶어요', 'star': 0, 'date': '2024.05.08'}, {'review': '객실도 깔끔하고 친절합니다. \r\n특히 조식! 꼭 드셔보세요. \r\n다른 호텔 조식보다 훨씬 신선하고 맛있어요. \r\n앞으론 여수는 신라스테이와 함께!!', 'star': 0, 'date': '2024.03.26'}, {'review': '침대가 편했습니다. 신식이라 매우 깨끗하고 쾌적했습니다.', 'star': 0, 'date': '2024.06.11'}, {'review': '룸이 생각보다 넓고 쾌적했어요\n직원분들이 무척 친절했어요\n아쿠아플레닛 가기에 위치가 좋았어요\n침구가 푹신해사 잠자리가 편안했어요\n조식이 종류가 다행해서 아침이 만족스러웠어요', 'star': 0, 'date': '2일 전'}, {'review': '객실이 깨끗하게 관리돼서 좋았어요. 직원분들도 친절하고  위치도 중심가에 있어 다니기 편했습니다.', 'star': 0, 'date': '3일 전'}, {'review': '전반적으로 가격 대비 매우 만족스러웠고, 다음에 다른 지역을 여행가도 신라스테이 믿고 갈 것 같습니다!\n\n👍 리뷰에서 많이 말하듯이 침구류 상태가 매우 좋음\n👍 에어컨도 별 문제나 냄새 없이 잘 작동함\n👍 화장실 깨끗하고 (샤워부스 타입 선택 시) 변기 공간과 세면대 공간, 샤워부스 공간이 분리되어 있어 건식으로 쓸 수 있었음\n👍 다른 호텔에 비해 저렴한 조식 가격 (전 날 밤 10시 전 미리 예약 시) & 만족스러운 메뉴 구성과 퀄리티 >> 자리 나는대로 최대한 창가쪽으로 안내해주심\n\n👎 샤워부스와 침대 있는 공간이 투명 유리창으로 있고, 침대 공간 쪽에 안이 보이지 않게 원목 블라인드가 설치되어 있었음. 블라인드를 내리면 안에 공간이 보이지 않았지만, 침대 공간쪽에서 조절할 수 있기 때문에 호텔 예약 시 참고하시길!\n👎 로비 체크인, 조식 예약 등 프론트에 대기줄이 있으면 대기번호 뽑은 후 기다려야함. 순서대로 처리해주어 편리했지만, 약간의 융통성과 세심함이 부족한 상황도 발생했었음.\n\n그럼에도 너무 만족한 숙소였습니다! 다음에도 다시 여수 간다면 무조건 방문할 마음 100%!!😀', 'star': 0, 'date': '2024.07.10'}, {'review': '바다 전망이 아름답고 객실이 깔끔하고 편안했습니다. 직원들도 모두 친절하고 서비스가 훌륭하며 체크인과 체크아웃이 빠르고 효율적이었습니다. 생맥주 무한리필 이벤트도 하고있어서 저녁에 이용했는데 음식도 맛있고 매우 만족했습니다 :)', 'star': 0, 'date': '2024.12.02'}, {'review': '평일엔 5성급 4성급에 묵자!!!\n호텔 분위기에 압도 당하고, 로비에 있는 직원분들의 친절함에 감동하고, 객실 업그레이드에 감동 쓰나미...ㅋㅋ\n거기에 고층에 또 감동!!!\n칫솔, 치약 요금도 패스!!!\n너무 만족!!!\n하지만, 기대가 크면 실망도 있겠죠...?\n방바닥을 닦지 않는 거 같아요....ㅠㅠ 먼지가 많았어요...그리고 화장실 배수가 잘 안돼 방 쪽으로 물이 흘러내려와 조금 당황....ㅠㅠ\n그리고 조식은 생각보다 별로였어요....ㅠㅠ\n이건 개인 취향!!!\n아무튼 괜찮은 듯 별로인 듯...\n근데 헬스장은 개인적으로 마음에 들었다!!!', 'star': 0, 'date': '2024.11.11'}, {'review': '제주신라스테이 이용 때 넘 좋아서 여수에서도 예약을 했어요 최근지어진 건물인지 너무 깔끔하고 좋았으나 엘베로 이동하는데 조금 헤맸네요\n\n전부 영어로 간략하게 써있고 프론트라는 글씨가 없고 로비만 있어서 여러번 와따가따했고 로비도 1층이 아니라 6층에 있었고 방에 갈때 엘베 이용시 카드키를 터치후 층수를 누르라는 설명없이 보내셔서 같이 엘베탄 손님이 알려줘서 겨우 올라갔네요\n\n중간층에 카페라고 써있길래 커피숖인줄알았는데 레스토랑 이더라구요...(엘베에 카페(레스토랑)이렇게 써있었어도 덜 헷갈렸을거 같아요...그냥 의견입니다)\n\n다른 시설이나 청결도 너무 좋았고요\n한번 이용해봤으니 담엔 안 헤매겠죠 ㅎㅎ', 'star': 0, 'date': '2024.02.22'}, {'review': '여수엑스포에서 도보로도 이동가능한 거리에 위치해있어요 가족들과 간다면 렌트,택시를 추천 친구들과 간다면 도보이동도 추천! 대기표는 카카오톡으로 알림이 오고 빠른 체크인처리로 기다리는 대기시간이 적었어요 룸 업그레이드로 8층에서 18층 고층으로 시티뷰도 예쁩니다💛\r\n꽃이 만개하기 전이라 만개 할 때 더 예쁠거같아요\r\n프론트가 6층에 있어서 주차는 5층에 하는 걸 추천합니다.\r\n시티뷰여도 오동도가 보이는 뷰였고 침구류도 포근하니 좋아요 여기저기 수납공간이 많아 짐을 놓기도 편했습니다.\r\n야놀자 특가로 저렴하게 다녀왔습니다.다음 신라스테이 초특가도 놓치지않을거예요~!', 'star': 0, 'date': '2024.03.26'}, {'review': '체크인할때부터 친절하게 해주셔서 기분좋았는데 오션뷰보고 더 기분좋았어요ㅎㅎ 1층에 gs25 있어서 간식거리 사기 좋고 건물도 전체적으로 깨끗해서 짧은 1박2일이었지만 기분좋게 머물렀어요ㅎㅎ 다른방에서 바깥창문 여닫는소리가 생각보다 크게 들려서 조금 놀라긴 했지만 다른 장점에 묻히긴 해요ㅎㅎㅎ', 'star': 0, 'date': '2024.11.18'}, {'review': '바닷가 바로 앞에 있진 않지만 오션뷰 전망으로 멀리서 바라보는 바닷가 풍경도 멋있었다 4성급 호텔답게 조식또한 훌륭했고 친절함은 보너스였다.  휘트니스도 적당히 이용하기 좋았고 이른아침 많이들 이용했는지 수건이 쌓여있었다.  첫날 저녁에는 먹태안주(훌륭)삼아 맥주 무한리필로 하루를 마무리하며  기억에 남을 여행이 된거같아 흐뭇했다  여수오면 다시방문하고 싶은 곳이다', 'star': 0, 'date': '2024.07.02'}, {'review': '여수에 제대로 여행이 처음인데\n전에는 워크샵과 업무로\n앞에 로보텔 소노캄 마리나호텔이 딱 가리고 있어서 \n일출을 방에서 볼수 없음만 아쉬움\n저녁에 맥주 무제한도 분위기 맛 다 즇고\n조식은 좀 기다리지만 그래도 각각 다 맛있음\n\n호텔 뷔페만큼 다양하지 않아도 각각 음식이 다 굿', 'star': 0, 'date': '2024.10.29'}, {'review': '룸 상태도 정말좋고 전체적으로 깔끔해서 좋았어요\n부대시설도 잘 갖춰져서 머리가지 않고 호텔안에서\n지인과 가볍게 술한잔 할 수 있어 좋았고\n조식도 깔끔하고 맛있었구요.\n전망도 나쁘지않았어요\n탁 트인 바다전망은 아니였지만\n전혀 답답하지 않고\n좋았어요\n행사가 있었는지 바로 앞에서 터지는 폭죽은\n환상 그 자체라 선물받은 기분였어요.\n여행지라 멀지않고 이동도 나쁘지 않아서\n좋았어요', 'star': 0, 'date': '2024.08.09'}, {'review': '청결하고 뷰도 좋았으나 윗층 창가에서 이상한(?) 소리를 계속 내서 참다 참다 포기하고 방교체를 부탁 20층에서 한층 아래로 바로 교체해주셨습니다. 다행이 그방은 조용해서 2박3일 잘 지냈습니다. 조식부페때도 자리관련 부탁드렸는데 바로 조치해주셔서 빠르고 친절한 서비스에 감사했습니다.', 'star': 0, 'date': '2024.11.14'}, {'review': '두번째 이용이에요. 침구 좋고 쾌적해요. 조식도 8시 이후에 가니 웨이팅 있더라구요. 저번엔 일찍 움직였더니 여유 있었어요.저녁 늦게 체크인하니 주차가 기계식 자리밖에 없긴했지만 움직이진 않는다고 하니 양쪽으로 다 주차하면 됩니다. 괜히 고민하느라 빙빙 돌았어요. 다음날 라마다에 묵었는데 라마다 보다는 신라가 조용해서 좋았어요.', 'star': 0, 'date': '2024.10.04'}, {'review': '침구가 푹신해서 좋지만 베개가 넘 높아요 \n주차시설이 편리해요. 2층에 주차해서 나갈때 편해요\n\n피트니스 센터는 운동복 별도로 챙겨야 한대요 (아쉽게도 이용못햇어요)\n\n다만 냉장고는 냉동 불가하니 참고해 주세요\n\n여수오면 여기에 묶고싶어요~', 'star': 0, 'date': '2024.11.12'}, {'review': '여수 신라스테이 디럭스 오션뷰 트윈 연박했습니다~\n먼저 여수엑스포역과 가까워 엑스포 방문객들에게는 최고의 접근성이라 생각합니다 청결도 서비스는 최고였고 1층에 편의점도 있어 연박하는데 불편한점 하나없이 너무 만족하며 쉴수있었습니다. 다만 여수 시내와는 조금 거리가 있어 자차가 있다면 최고의 숙소라 생각합니다! 2박3일동안 너무 편하게 쉬다갑니다~', 'star': 0, 'date': '2024.04.20'}, {'review': '디럭스 룸으로 업그레이드 시켜주셔서 더 좋은 전망을 볼 수 있었고 무엇보다 침구랑 객실이 깨끗해서 좋았어요!', 'star': 0, 'date': '2024.11.30'}, {'review': '객실 상태 너무 좋았구 침구도 고급지고 푹신푹신해서 꿀잠 잤습니당 환경생각하는 어메니티 관리도 개인적으로는 좋았습니다! 연휴기간이라 그런가 사람이 몰려서 체크인할때 웨이팅있었던게 조금 생각나네요 연휴기간에만이라두 프론트 직원을 늘리는 게 어떨까 싶어요 ! 부모님이랑 함께왔는데 부모님도 만족하셨습니당', 'star': 0, 'date': '2024.08.13'}, {'review': '호텔 주변에 케이블카, 낭만포차, 아쿠아플라넷 등등 쉽게 갈수 있는 곳이 많아 교통적으로 아주 좋아요~!\n숙소도 깨끗하고 특히 데스크의 직원들이 상당히 친절합니다.\n\n조식뷔페는 생각보다 종류가 많지는 않지만, 음식이 깔끕하고 맛도 괜찮아요', 'star': 0, 'date': '2024.10.14'}, {'review': '객실이 아주 깔끔하고 청결했어요\n크기도 아주 넉넉해서 불편함없이 잘 쉬었어요\n직원분들도 아주 친절했습니다\n엑스포광장, 케이블카, 낭만포차까지 가까워 도보 이용이 아주 용이했어요 위치가 아주 좋았어요\n담에 여수에 온다면 꼭 여기서 다시 묵을겁다', 'star': 0, 'date': '2024.03.17'}, {'review': '여수 신라스테이 신상호텔이라는 영성에 호텔이 너무나 깨끗하고 직원분들 한분 한분  친철하셨습니다.\r\n와이프가 쌍둥이 임신으로 배가 많이 불러와서 싱글2개로 예약해서 침대에서 잠자기 힘들었는데 호텔 직원분들의 배려로 룸 업그레이드 해주셔서 더블+싱글되어있는 패밀리 룸 배정해주셔서 너무나 편하게 쉬었다갑니다.\r\n공기청정기.가습기...등도 무료로 대여해주셔서 임산부 배려을 이렇게까지 해주신 호텔은 본적없었습니다.\r\n저희는 숙박 패키지 상품이라 여수 밤바다보면 맛있는 저녁식사 후 호텔 들어와서 7층 카페에서 타코치킨 생맥 주도 맛있게 먹었답니다.\r\n아침 조식도 체크인시 선결제하니 30%할인가에  이용하여 여행의 참맛이라는 호텔 조식도 엄청 배부르게 맛나게 잘 먹었습니다\r\n짧은 1박2일 여수 여행 \r\n신라스테이에서 너무나 편하게 쉬었다갑니다.\r\n다음의 여수 여행도 신라스테이 무조건 갑니다.\r\n신라스테이 직원 여러분 정말 감사합니다.^^', 'star': 0, 'date': '2023.01.14'}, {'review': '3명이서 잘 쉬다 왔어요!\r\n한가운데 객실이라 걱정했는데 뷰도 좋았고,\r\n신축이라 깔끔하더라구요 :)\r\n비품은 3인 기준 샴푸, 바디워시 등 제외하면\r\n부족한 부분은 없었습니다\r\n대로변 바로 앞 건물이라 약간의 외부 소음 있어요\r\n호텔 위치 덕분에 여기저기 접근성 좋습니다!\r\n예민하지 않으면 쉬는데 큰 문제 없을거 같아요ㅎㅎ\r\n대신 다른 리뷰처럼 체크인이 좀 오래 걸려요..\r\n주말이라 그랬는지 모르겠지만 체크인 시간 맞춰\r\n투숙객들이 많이 몰리더라구요\r\n입실하는데 30분 이상 걸렸습니다ㅜㅜ\r\n체크인 시간보다 좀 더 일찍 가서 기다리거나\r\n대기 번호 입력 빨리 하는거 추천드립니다 :)', 'star': 0, 'date': '2023.02.06'}, {'review': '신라스테이는 믿고 가는편이라 이번에도 좋았어요 ~\r\n서비스 친절도는 너무 좋아서 말할것도 없고\r\n특히 가운이 재질이 너무 좋아서 갖고 싶더라는 ㅜ ㅜ\r\n침대도 너무 편하고 객실도 깨끗했고\r\n완전 바다 앞은 아니어도 뷰도 좋고\r\n위치접근성 좋고 주변에 시설이나 편의성도 다 좋고\r\n오동도나 포차거리도 가깝더라구요 ~\r\n쪼꼼 아쉬웠던게 화장실이 오픈형이라\r\n볼일보는곳에만 문이 있어 쪼꼼 민망하고\r\n바닥에 물이 화장실까지 넘어가기도 하고\r\n세면대 밑쪽으로는 물이 잘 안빠졌어요 ㅜ ㅜ\r\n물도 기본 세 병 이랬는데 두 병 뿐이었어요\r\n청소상태하고 비품 확인 쫌만 더 신경 써주셨으면..\r\n그거 빼고는 정말 다 좋았고\r\n너무 편하게 잘 쉬고 행복한 여행 다녀왔어요 ~', 'star': 0, 'date': '2023.05.29'}, {'review': '오픈한지 얼마 안 되는 호텔이라 깨끗하고 시설이 좋았어요. 침구나 수건, 소파, 침대 등이 깔끔하고, 어메니티 제공도 만족스러웠습니다. 고층 오션뷰였는데 신항을 바라보고 엑스포 광장, 빅오 등이 보이며, 바다가 잘 보이긴 하지만 유탑마리나에 많이 가려있습니다.1층에 편의점은 있는데 프랜차이즈 카페같은 건 없어서, 아침에 근처 베네치아나 유탑마리나에 있는 카페를 갔어요.\n아쉬웠던 점은 고가도로 옆이라 도로소음이 있고, 벽이 얇은지 옆방 말소리나 웃음소리같은 게 들렸어요 ㅠ\n그래도 오동도, 케이블카 자산탑승장, 아쿠아플라넷, 아르떼뮤지엄 등 관광지와 도보 가능권이라 편리합니다.', 'star': 0, 'date': '2022.11.25'}, {'review': '일단 방 상태는 말할 것고 없습니다. 일단 여수엑스포역쪽에 위치해 있어 너무 좋았습니다. 저녁에 체크인을 했는데 저희가 예약했던 방보다 한단계 업그레이드 시켜주셔서 너무 좋았어요! 시티뷰라고 하셔서 기대를 안했는데 바다고 보여서 너무 좋았어요. 침대가 너무 좋아서 영화보고 바로 잡들었어요. 덕분에 잘 자서 다음날 일정까지 잘 마무리하고 좋은 여행이였습니다. 그리거 호텔 안에 바, 헬스장, 놀이장이 있어서 호텔 들어와서 약간의 심심함을 달래줄 수 있으니 참고해주세요!(추가비용 있습니다)', 'star': 0, 'date': '2023.02.24'}, {'review': '청결에 꽤나 예민한 편인데 틈 잡을 곳 없이 정말 깔끔하고 호텔 분위기도 너무 좋았어요. 프론트 직원분들께서 정말 친절하셔서 무엇보다 좋았습니다! 객실 사진은 필터 없이 일반 카메라로 찍은 건데 사진보다 실물이 훨씬 예뻐요.. 너무 예뻐서 둘러보느라 침대 사진밖에 못 찍어서 너무 아쉬워요ㅠㅡㅠ 수능 끝난 여동생이랑 갔었는데 호텔이 예뻐서 둘 다 이번 여행의 만족도가 높았어요..❣️ 앞으로 여수에 놀러가면 이 곳만 올 거 같아요!!', 'star': 0, 'date': '2022.12.21'}, {'review': '아쿠아플라넷 바로 앞에 있어서  오동도, 낭만포차, 케이블카 타는데 접근성이 좋아요. 특히 호텔에 주차해놓고 걸어다닐 수 있는 거리여서 더 좋았어요. \r\n룸 안도 엄청 깔끔하고 기타 용품들도 다 구비되어 있어요. 다만 주차장이 빨리 차니 저녁 늦게 들어갈땐 주차자리 찾느라 한참 돌수도 있어요.\r\n다음에 여수 오면 또 들를께요~~', 'star': 0, 'date': '2023.08.02'}, {'review': '호텔 직원분들 모두 친절하시고 온돌방 이용했는데 너무 편하고 시설도 깨끗했습니다. 집 외에서는 잘 못자는 편인데 호텔와서 한번도 안깨고 잔건 처음이네요 진짜 꿀잠자고 힐링하고 갑니다ㅎㅎ 그리고 주변에 케이블카 타는곳도 근처여서 구경도 잘하고 조식도 아주 야무지게 잘 먹고왔습니다.\n여수여행 또 가게된다면 다시한번 방문하고싶네요!! 아주 굿.', 'star': 0, 'date': '2023.05.24'}, {'review': '숙소는 깨끗하고 편하게 잘 쉬었습니다. 근처 분위기가 좀 썰렁했고 서비스는 약간 아쉬웠습니다.\n3일 조식했는데 자리도 많았는데 저흰 내내 음식이랑 먼 구석자리만 배정해줬는데 늦게 온 어떤 커플은 창가 앉혀주심ㅠㅠ 빵 집계 떨어졌다해도 시큰둥+ 쌀국수 부탁해도 뚱하게 불친절하시던 쌀국수 코너 여자 쉐프님 좀 그랬지만  달걀 코너 남자 쉐프님께서 넘 친절히 해주셔서 감사했습니다.', 'star': 0, 'date': '2023.09.30'}, {'review': '최고의 가성비를 경험할 수 있었습니다. 직원분들이 매우 친절하셨고, 시설이나 객실이 심플하고 깨끗했어요. 건물 1층 편의점부터 위로 주차장, 로비, 객실을 엘리베이터 하나로 이동할 수 있어서 편리했습니다. 관광지로 나가는 것도 차로 이동하기에 가까웠어요. 여수에 올 때, 재방문의사 있습니다.', 'star': 0, 'date': '2023.08.24'}, {'review': '여수는 처음 방문이였는데 숙소가 역에서도 가깝고 주변에는 가볼곳이 엄청 많고 거리도 가까워서 걸어다녀도 너무 좋았어요 \n맛있는 식당도 많고 주변에는 유명한 숙소도 편의시설도 많아서 야경도 멋지고 또한 조식도 맛있어요\n직원분들 친절하고 좋으세요\n뷔도 좋은 방으로 배정 받아서 기분도 짱이엿고\n너무 좋았어요\n남은 휴가도 다시 여수 신라스테이 예약해서\n렌탈해서 못가본 곳 전부 둘러보고 올 계획입니다\n신라스테이 여수 정말 진짜 좋아요', 'star': 0, 'date': '2023.07.16'}, {'review': '최근 갔던 호텔 중에 제일 만족 .. 선착순 공동구매 존버타서 8만원대에 신라 베어+조식2인에 더블베드+트윈룸에 마지막 오션뷰까지 ...!!! 너무 만족해요 !!!!!! 조식도 진짜 맛있었고 오션뷰도 너무 예뻤고 특히나 방 너무 깨끗하고 주차장도 넓고 시설도 너무 깔끔하고 좋았답니다 ✨ 다음에 여수갈때도 또 여기로 가야겠어요 !!', 'star': 0, 'date': '2023.09.28'}, {'review': '60대 아줌마들 처음 여수여행~\n하룻밤 잠만자기엔 너무 아수운\n호텔방이었어요 온돌방이라 뜨끈뜨끈\n등 지지기에 너무 좋았고 오픈한지 얼마\n안되서 그런지 깨끗하고 나이든 사람들\n이라 물도 많이 먹고해서 생수도 더\n챙겨주시며 친절하게 잘 응대해주시고\n정말 잘 쉬다왔어오~', 'star': 0, 'date': '2023.02.04'}, {'review': '체크인에 30분이상 기다린건 첨이네요ㅋ\n그거  빼곤 모든게 좋았구요\n침구가 아주좋고\n침대와 온돌이 있는방인데\n진짜 뜨끈뜨끈하게 여름이지만 공기는 시원하고\n바닥은 뜨끈뜨끈 잘잤어요\n낭만포차가느라 늦게들어와 다른서비스는 사용안했지만\n1층 편의점있어서 편했어요', 'star': 0, 'date': '2023.08.27'}, {'review': '숙소가 청결하고 조식이 맛있었어요.\n어머니 모시고 간 첫 숙박 여행이었는데, 대만족이었습니다. 가족 모두가 인정!\n여행 다니면서 다른 지역 신라 스테이도 꼭 이용해 보고 싶을 정도에요. 강력 추천 합니다.', 'star': 0, 'date': '2023.05.29'}, {'review': '신라스테이라서 룸 컨디션, 조식 만족스러웠음\n그리고 체크인 대기표릉 카운터 좌측에 연결되게 배치하는게 효율적일 듯\n\n\n다만 방간(층간 포함) 소음 있음\n창가에서 멀어지거나 tv 켜면 안 들리는 정도...', 'star': 0, 'date': '2023.05.24'}, {'review': '시설도 좋았고 청결도 좋았습니다\r\n뽀송한 침구 좋았어요^^\r\n일요일이라 그런지 교통이 밀린다거나 주차도 괜찮았습니다\r\n비가봐서 어린아이때문에 수영장 이용은 못했구요\r\n플레이존은 운영을 안하더군요\r\n전체적으로 깔끔한 방에서 잘 쉬고 왔습니다\r\n사진은 비오는날 야경인거 감안하고 봐주세요^^', 'star': 0, 'date': '2024.07.02'}, {'review': '역시 신라스테이네용 😍 서비스 청결 시설 넘 좋아서 집에 가기 싫었답니다.. 크크 ♥ 물이 좀 다른지 피로 풀리는 게 더 빠른거같은 느낌도 있었구용. 다만 객실문 여는게 쪼금 빡셌긴 합니당 그래도 너무 좋은..☺️', 'star': 0, 'date': '2024.07.04'}, {'review': '모든면에서 기대치를 충족하는 곳이었어요\n시설도 신축이라 깔끔 그 자체이고\n해변뷰를 택하였는데 정말 좋더군요\n저는 잘 잤는데 아내가 제 움직임에  메트리스가 흔들림이 있어 잠을 설쳤다 하네요\n그점이 딱하나 아쉬운점이고\n조찬음식도 좋고 프론트 응대하시는분도 친절해서 좋았습니다', 'star': 0, 'date': '2024.05.12'}, {'review': '진짜 가성비 최고입니다 숙소비를 절감하기 위해 싸고 할인 많이 들어간 숙소를 찾다가 신라스테이로 오게 되었는데 정말 숙소가 너무 깨끗하고 방도 넓고 뷰도 좋고 뭐 하나 맘에 안드는 점이 없었어요ㅠㅠㅠㅠㅠㅠㅠㅠ다들 고민하지마시고 여기로 가세요!!짱!!', 'star': 0, 'date': '2024.01.04'}, {'review': '1층에 편의점이 있어서 필요한 물건 편하게 구입할 수 있어서 좋았습니다. 오동도도 가까워 걸어서 가볍게 산책가기도 좋습니다. 직원 분들도 친절하게 안내 잘 해주시고 시설도 깨끗했습니다. 다만 밤에 위층에서 탁자나 의자 끄는 층간소음이 있어서 그 부분은 개선되었으면 좋겠습니다.', 'star': 0, 'date': '2023.07.10'}, {'review': '직원분들 다들 친절하시고 객실 컨디션도 좋았어요 오션뷰로 19층 머물렀는데 뷰 너무 맘에들었고 접근성이 좋아 뚜벅이 여행도 문제 없었어요!! 조식은 한번정도는 먹어볼만 한거같아요! 다음에도 재방문 하고싶어요 전체적으로 다 좋았습니다~', 'star': 0, 'date': '2023.01.04'}, {'review': '여러모로 다시 방문하고픈 숙소였어요 단점은 방음이 취약하고씻고나면 바닥에 물이 다음날까지 고여있었어요 태풍부는 날이였는데 비맞고 온돌방 지지면서 잤어요👍', 'star': 0, 'date': '2024.09.30'}, {'review': '룸컨디션과 오션뷰는 최고입니다 단점이라하면 방음이 정말 안좋아요ㅠ 쿵쿵거리는 소리, 사람소리 들려여ㅠㅠ\n조식은 생각보다 종류가 많은 편은 아니지만 퀄리티도 괜찮았고 빵종류가 확실히 맛있습니다💪🏻\n아름다운 여수에서 행복하게 연박하고 왔어요', 'star': 0, 'date': '2024.08.03'}, {'review': '체크인에 투숙객이 몰렸지만 데스크 직원분들 신속하고 친철하게 처리해 주셨어요. 방 넓고 깨끗하고, 객실 어메너티도 좋았습니다. 엘리베이터도 금방금방이라 기다릴 필요 없었구요. 여수 다음 여행때도 묵을게요.', 'star': 0, 'date': '2024.02.10'}, {'review': '침구도 편안하고 조식도 가격과 퀄리티 또한 괜찮았으며 직원분들의 친절하게 응대해주셔서 너무 좋았으며 호텔이 신식이여서 더욱 좋았습니다', 'star': 0, 'date': '2024.11.29'}, {'review': '4성급답게 서비스가 엄청 좋았습니다 객실도 깨끗하고 침구류도 바로 갈아주시고 생맥주 무한리필이 엄청 좋았네요 다른곳 가도 신라스테이 이용 할 듯 합니다 잘 쉬고 왔어요!', 'star': 0, 'date': '2024.07.07'}, {'review': '저렴한 가격에 좋은 숙소에서 숙박했고, 조식도 투숙객 할인이 들어가서 좋습니다. 1층에는 편의점이 있고 주변으로 이동하는 것도 충분히 메리트 있습니다.\n7층에서는 맥주 마시며 빅오쇼도 도둑관람 가능합니다', 'star': 0, 'date': '2023.07.15'}, {'review': '다 좋았습니다 진짜 깨끗하고 위치좋고 한 가지 아쉬운점은 방음... 저도 찾아봤을 때 도로소음이 좀 있고 방간 방음이 좀 별로라고 했는데 도로소음은 없는 편이였지만 방간 방음은 좀 안 좋아요 하지만 침대랑 이런것들이 너무 좋아서 별 5개 드립니당', 'star': 0, 'date': '2023.05.17'}, {'review': '숙소구조, 상태, 편의성, 접근성, 뷰~~다 맘에 쏙들었어요~그런데 아쉬운점은 방음이 잘 안되는거 같아요...밖의소리가 아니라 주변객실에서 나는 소리가 좀들리네요..', 'star': 0, 'date': '2023.05.06'}, {'review': '이순신광장까지 걸어서 갔어요 20분? 정도되고 택시타고 이동하기 좋아요 ~ 깨끗하게 잘 자고 왔어요 단지…예약때 오션뷰없었는데 업글해주셨어요 근데 ㅋㅋㅋ 오션뷰라고 하기엔 그위치가 해뜨는거 안보여요 앞에 다른호텔 정면으로 가려서요 아쉬웠어요', 'star': 0, 'date': '2023.03.02'}, {'review': '처음으로 신라스테이를 이용해봤는데 너무 깨끗했고 직원들도 너무너무 친절했어요 여수 여행으로 묵은 숙소인데ㅠㅠㅜ 다음번에 또 여수를 간다면 여기에 묵고 싶을정도로 정말 아늑하면서 뷰 좋고 좋은 추억만 남기고 가는 숙소였습니다', 'star': 0, 'date': '2022.11.22'}, {'review': '신규숙소라 청결도 매우 좋음\n특히  수건및 침구류 아주  깨끗했음\n하프오션뷰라  쇼파에서  일출볼수있음\n여수역에서  도보로 15분ㅡ평지ㅡ\n숙소에서  이순신광장 도보 15 분ㅡ언덕ㅡ', 'star': 0, 'date': '2022.11.18'}, {'review': '정말 여태 가본 신라스테이 중 젤 컨디션 좋고 친절하셨고 주차장도 쾌적하며 시설,위치 너무너무 만족해서 이번 여수 여행에 좋은 추억을 남겼네용👍🏻', 'star': 0, 'date': '2024.04.09'}, {'review': '너무 좋았습니다. 2박 머물렀는데 위치며 서비스며 대만족입니다. 그리고 무엇보다 저녁에 카페에서 진행하는 라이브공연이 너무 즐거웠습니다!!! 이틀 내내 방문해서 즐겼네요 ㅎㅎ재방문의사 완전 있어요!!', 'star': 0, 'date': '2023.09.19'}, {'review': '정말 착한가격에 너무좋은 컨디션이예요~ 시티뷰였지만 왼쪽으로바다도 잘보이고 오동동도 잘보였어요. 엑스포광장도보로 이동가능한거리여서 좋았어요. 주차자리 널널하고 연박은보통 청소는안해주시는데 청소까지 다해주셔서 감사했어요^^', 'star': 0, 'date': '2023.04.20'}, {'review': '아침마다 상쾌한 오션뷰를 보며 쉴 수 있는 곳! 주차 편하고 시설도 깔끔하고 침대도 아늑해서 꿀잠 잤습니다. 엑스포역 주변이라 여기저기 이동하기도 좋고! 가성비 훌륭합니다', 'star': 0, 'date': '2024.10.12'}, {'review': '정말 다 좋은데 방음은 개선되어야함\n옆방 대화소리 잘 들리고 어느 객실린지 모르나 문이 닫혔는데 우리 객실 문이 흔들릴정도로 소리가 전달됨\n윗층에서 창문을 열면 그 소리마져도 밑으로 전달됨', 'star': 0, 'date': '2023.06.13'}, {'review': '전반적으로 만족입니다~다시갈의향도있어요\n다만 숙박할때 윗층객실이용하시는분이 너무시끄러워서 제지했는지 좀조용해졌네요', 'star': 0, 'date': '2024.10.15'}, {'review': '여수 여행 왔다가 예약했던 펜션 상태가 너무 별로여서 급하게 다시 옮긴 숙소인데 지어진지 얼마 안돼서 깔끔하고 룸컨디션도 너무 좋고 전반적으로 아주 만족했습니당 이박삼일 잘 머물다가요!', 'star': 0, 'date': '2024.09.08'}, {'review': '여수에서 실속있는 가격대비 쾌적한 숙소로 가성비 좋은 곳이에요.. 조식도 괜찮고 1박에 만족도가 꽤 높았습니다\n좋은 곳입니다!! 야놀자에서 또 이용할게요', 'star': 0, 'date': '2023.12.30'}, {'review': '직원분들도 친절하시고 \n근처에 아쿠아플라넷 낭만 포차 \n다 접근 하기 용이해서 편했어요! \n다른 후기에 청소 상태 이런것 때문에\n걱정 했는데 시설도 깨끗 하고 좋았습니다', 'star': 0, 'date': '2023.10.24'}, {'review': '아쿠아리움 길 하나 건너면되고, 낭만포차도 가깝고 시설 깨끗하고 넘 좋았어요 저희는 수영장패키지 였는데 1회3시간씩 하루 3회 정해진 시간 한번만 수영장 이용할수 있어서 조식포기하고 수영했네요~ 그래도 수영장에 우리만 있어서 좋았어요', 'star': 0, 'date': '2023.08.08'}, {'review': '방 변경해주실때 친절하게해주셔서 좋았어요. 뷰가 오션뷰인것 같았는데 건물에 좀 가려서 저한테는 조금 아쉬웠어요. 그래도 아쿠아리움은 걸어서 5분~10분이면 도착하는 위치였고, 케이블카도 10~13분 정도 걸어가면 도착하는 위치라 너무 좋았던것 같아요. 낭만포차까지는 걸어가기에는 거리가 좀 있긴한데 못걸어갈 정도는 아니라서 괜찮아요. 산책한다고 생각하시면 좋을것 같아요. 만족합니다!', 'star': 0, 'date': '2022.11.23'}, {'review': '순천엑스포역에서 걸어서 10~15분정도이고 이순신광장까지도 도보 가능할 정도입니다. 밤에 자는데 시끄럽지도 않고 위치 좋았어요\n그리고 체크인 등 서비스도 만족스럽고 조식도 너무 맛있었습니다 다른 지역 신라스테이도 기대 됩니다', 'star': 0, 'date': '2023.11.05'}, {'review': '객실이 깔끔하고 쾌적했어요!  랜덤배정이었는데 오션뷰로 주셔서 누워서 창밖 구경하는것만으로 힐링 됐어요ㅎㅎ 침대도 포근하고 넓어요!!\r\n헬스장 기구가 많이 없어서 좀 아쉬운거 빼고는 가려는 관광지랑 위치도 가까워서  편한 여행이 되었습니다~', 'star': 0, 'date': '2023.08.23'}, {'review': '다 너무 좋았어요.\r\n객실도 너무 깨끗하고 관광지도 가깝고,\r\n수영장도 웰컴드링크, 수건, 베드 다 좋았습니다.\r\n다만 체크인할때 사람이 많아서 대기시간이 좀 있어요.', 'star': 0, 'date': '2023.08.13'}, {'review': '정말좋았어요. 신축이라 방도깨끗하고요. 창문뷰도 전체적으로보이고 걸어서 오동도 가기도 편하고 이순신광장까지의 거리랑 여수역까지의 거리도 택시 기본요금이라 움직이기 편합니다.', 'star': 0, 'date': '2023.07.09'}, {'review': '편안히 쉬고 갑니다 \r\n프론트, 카페 직원분들 친절에 감사드립니다\r\n객실 깨끗하고 침구류 청결해서 좋았습니다 \r\n여수오면 항상 여기 신라스테이  찾을거 같네요', 'star': 0, 'date': '2023.04.25'}, {'review': '시설 완전 좋아요!!\n직원분들 대처능력 완전 감사드렸어요ㅠㅠ\n바디로션마저 냄새가 좋았어요 \n재 방문 100000퍼센트\n옆방 티비소리는 들려요!!', 'star': 0, 'date': '2022.11.21'}, {'review': '생긴지 얼마 안돼서 그런가 시설 자체가 다 너무 깨끗하고 뷰가 너무 이뻐요 이번에 불꽃축제때문에 명당방으로 예약했는데 확실히 불꽃축제가 잘보여서 방에서 편하게 볼수있어서 좋았어요 다음에 시간이 되면 또 가야겠어요!', 'star': 0, 'date': '2022.10.23'}, {'review': '바다뷰 전망도 너무 좋고 침대도 편안했어요\n조식은 종류가 생각보다 적었지만 맛있었어요\n직원분들 너무 친절하세요!!', 'star': 0, 'date': '2024.11.28'}, {'review': '바다뷰 전망도 너무 좋고 침대도 편안했어요\n조식은 종류가 생각보다 적었지만 맛있었어요\n직원분들 너무 친절하세요!!', 'star': 0, 'date': '2024.11.28'}, {'review': '가족과 함께 휴식할 공간 찾다가  신라스테이를\n이용하게 되었습니다 뷰좋고요 조식도 맛있게 잘 먹었어요 실내 청결 했습니다', 'star': 0, 'date': '2024.11.27'}, {'review': '진심 침구가 너무 폭닥폭닥해서 좋았어요 오션뷰는 소음이 있고 약간의 방음이 안되긴 하지만 방의 온도와 침구 때문에 또 가고싶어요 조식 대기줄은 해결 되면 좋을 것 같아요', 'star': 0, 'date': '2024.06.18'}, {'review': '수영장이 좋다고 들었는데 사용못하고 왔네요 여기 바다도 예쁘게보입니다 위치는 완벽하구요 엑스포역이나 오동도 낭만포차거리 다 도보가능합니다 저희는 여수랑을 이용했었습니다 잘 이용하고갑니다', 'star': 0, 'date': '2024.05.14'}, {'review': '어메니티가 꽁꽁 숨겨져서 칫솔을 사긴했지망..\r\n그래도 아베다시리즈에 가성비 조식포함 너무 좋았어요 낭만포차랑도 가까워서 기본요금이구요', 'star': 0, 'date': '2024.01.18'}, {'review': '버스 정류장이 바로 앞이어서 교통에도 좋았고 이순신광장이랑 버스로 8분 정도밖에 안돼서 좋았습니다. 밑에 지에스도 있어서 야식 사기도 좋았고 직원분들도 너무 친절하셔서 좋게 묵고 갑니다', 'star': 0, 'date': '2024.01.11'}]

2)요기요 후기 크롤링에 대해 알아봅시다.

- 1.패키지 설치후

from selenium.webdriver.support.ui import WebDriverWait  # 'W'와 'D'를 대문자로 수정
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, TimeoutException, ElementNotInteractableException

 

2. 가져올 URL을 설정합니다.

#가져올 url 예시)
BASE_URL = 'https://www.yogiyo.co.kr/mobile/#/'
URL = ['https://www.yogiyo.co.kr/mobile/#/546259/',
       'https://www.yogiyo.co.kr/mobile/#/323347/',
       'https://www.yogiyo.co.kr/mobile/#/254875/'
]

3.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException, TimeoutException, ElementNotInteractableException

def crawl_restaurant(url):
    # Chrome 브라우저 옵션 설정
    chrome_options = webdriver.ChromeOptions()
    # 위치 정보 접근을 차단하는 설정
    prefs = {'profile.default_content_setting_values.geolocation': 2}
    chrome_options.add_experimental_option('prefs', prefs)
    
    # Chrome WebDriver 실행 (위에서 설정한 옵션 적용)
    driver = webdriver.Chrome(options=chrome_options)
    
    # BASE_URL로 이동 (BASE_URL은 정의되어 있어야 함)
    driver.get(BASE_URL)
    time.sleep(2)  # 페이지 로딩을 기다리기 위해 2초간 대기
    
    # 검색 창 요소를 5초 동안 기다린 후 찾습니다.
    search_box = WebDriverWait(driver, 5).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="search"]/div/form/input'))
    )
    
    # 검색창에 '역삼동' 입력
    search_box.send_keys('역삼동')
    
    # 검색 버튼 요소를 5초 동안 기다린 후 찾습니다.
    search_btn = WebDriverWait(driver, 5).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="button_search_address"]/button[2]'))
    )
    
    # 검색 버튼 클릭
    search_btn.click()
    time.sleep(2)  # 검색 결과 로딩을 기다리기 위해 2초간 대기
    
    # 검색된 첫 번째 주소를 선택
    first_address = WebDriverWait(driver, 5).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="search"]/div/form/ul/li[3]/a'))
    )
    
    # 첫 번째 주소 클릭
    first_address.click()
    time.sleep(2)  # 페이지가 전환될 시간을 확보하기 위해 2초간 대기
    
    # 지정된 URL로 이동
    driver.get(url)
    time.sleep(2)  # 페이지가 로드될 시간을 확보하기 위해 2초간 대기
    
    # '깨끗한 리뷰' 버튼을 찾고 클릭합니다.
    clean_review_btn = driver.find_element(By.XPATH, '//*[@id="content"]/div[2]/div[1]/ul/li[2]/a')
    clean_review_btn.click()
    
    # 리뷰를 더 불러오는 버튼이 있으면 클릭하여 더 많은 리뷰를 불러옵니다.
    while True:
        try:
            # '더 보기' 버튼이 클릭 가능한 상태인지 확인하고 클릭합니다.
            more_btn = WebDriverWait(driver, 3).until(
                EC.element_to_be_clickable((By.XPATH, '//*[@id="review"]/li/a'))
            )
            more_btn.click()
            
            # 페이지를 맨 아래로 스크롤합니다.
            driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
            time.sleep(1)  # 리뷰 로딩을 기다리기 위해 1초간 대기
        
        # '더 보기' 버튼이 없거나 클릭할 수 없으면 반복문 종료
        except (NoSuchElementException, TimeoutException, ElementNotInteractableException):
            break

 

-->

이 코드를 실행하게 되면 그림 처럼 리뷰가 없으면 종료 된다.

 

4.

아래는 주어진 crawl_restaurant 함수 코드에 대한 상세한 주석 설명입니다. 이 함수는 특정 URL에서 레스토랑의 리뷰와 메뉴 정보를 크롤링하는 기능을 수행합니다.

코드 및 주석 설명
python
코드 복사
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException, ElementNotInteractableException
from bs4 import BeautifulSoup
import time

def crawl_restaurant(url):
    # 1. Chrome 옵션 설정: 위치 정보 접근을 차단합니다.
    chrome_options = webdriver.ChromeOptions()
    prefs = {'profile.default_content_setting_values.geolocation': 2}
    chrome_options.add_experimental_option('prefs', prefs)
    
    # 2. Chrome 웹드라이버를 실행합니다.
    driver = webdriver.Chrome(options=chrome_options)
    
    # 3. 기본 URL에 접근합니다 (BASE_URL이 코드 내에 정의되어 있어야 합니다).
    driver.get(BASE_URL)
    time.sleep(2)  # 페이지가 로드될 시간을 주기 위해 2초 대기
    
    # 4. 검색창이 나타날 때까지 기다립니다.
    search_box = WebDriverWait(driver, 5).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="search"]/div/form/input'))
    )
    
    # 5. 검색창에 '역삼동'이라는 텍스트를 입력합니다.
    search_box.send_keys('역삼동')
    
    # 6. 검색 버튼을 찾고 클릭합니다.
    search_btn = WebDriverWait(driver, 5).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="button_search_address"]/button[2]'))
    )
    search_btn.click()
    time.sleep(2)  # 페이지 로드를 기다립니다.
    
    # 7. 첫 번째 검색 결과(주소)를 클릭합니다.
    first_address = WebDriverWait(driver, 5).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="search"]/div/form/ul/li[3]/a'))
    )
    first_address.click()
    time.sleep(2)  # 페이지 로드를 기다립니다.
    
    # 8. 주어진 URL로 이동합니다.
    driver.get(url)
    time.sleep(2)  # 페이지 로드를 기다립니다.
    
    # 9. '깨끗한 리뷰' 버튼을 찾아 클릭합니다.
    clean_review_btn = driver.find_element(By.XPATH, '//*[@id="content"]/div[2]/div[1]/ul/li[2]/a')
    clean_review_btn.click()
    
    # 10. 더 많은 리뷰를 보기 위해 '더보기' 버튼을 계속 클릭합니다.
    while True:
        try:
            more_btn = WebDriverWait(driver, 3).until(
                EC.element_to_be_clickable((By.XPATH, '//*[@id="review"]/li/a'))
            )
            more_btn.click()
            
            # 페이지를 아래로 스크롤하여 더 많은 리뷰가 로드되도록 합니다.
            driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
            time.sleep(1)
        except (NoSuchElementException, TimeoutException, ElementNotInteractableException):
            # '더보기' 버튼이 없으면 루프를 종료합니다.
            break
    
    # 11. 페이지 소스를 가져와서 BeautifulSoup으로 파싱합니다.
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    
    # 12. 레스토랑 이름을 가져옵니다.
    restarant_name = soup.select_one('#content > div.restaurant-detail.row.ng-scope > div.col-sm-8 > div.restaurant-info > div.restaurant-title > span').get_text(strip=True)
    # print(restarant_name)  # 레스토랑 이름 출력 (디버깅용)
    
    # 13. 리뷰 목록을 가져옵니다.
    reviews = soup.select('#review > li')
    review_texts = [review.get_text(strip=True) for review in reviews]  # 각 리뷰 텍스트를 리스트로 저장
    print(review_texts)  # 리뷰 텍스트 출력 (디버깅용)
    
    # 14. 메뉴 목록을 가져옵니다. (XPath 수정 필요)
    menus = soup.select('#review > li > ')
    all_menu = [menu.get_text(strip=True) for menu in menus]  # 메뉴 텍스트를 리스트로 저장
    print(all_menu)  # 메뉴 텍스트 출력 (디버깅용)
    
    # 15. 레스토랑 정보와 리뷰를 담을 딕셔너리를 생성합니다.
    document = {
        "restarant": restarant_name,
        "url": url,
        "reviews": []
    }
    
    # 16. 리뷰 텍스트와 메뉴를 짝지어 딕셔너리에 저장합니다.
    for menu, text in zip(all_menu, review_texts):
        document['reviews'].append({
            "menus": menu,
            "review_rext": text,
        })
    
    # 17. 최종 딕셔너리 출력
    print(document)

 

예시)

바나프레소의 지점명, 시군구명, 영업시간 가져오기

from selenium import webdriver
from bs4 import BeautifulSoup
import time

#1. 지점명 가져오기
driver = webdriver.Chrome()
driver.get('https://www.banapresso.com/store')
time.sleep(2)
soup = BeautifulSoup(driver.page_source)
store_names = soup.select('span.store_name_map > i')
for store in store_names:
	print(store.text.strip())
-->
가산디지털단지역점
가산안양천점
가산어반워크점
가산파트너스타워점
강남구청점
강남대로점
강남역사거리점
강남역아라타워점
강남역점
강남우성점

 

2. 시군구명 가져오기

from selenium import webdriver
from bs4 import BeautifulSoup
import time

#2.시군구명 가져오기
driver = webdriver.Chrome()
driver.get('https://www.banapresso.com/store')
time.sleep(2)
soup = BeautifulSoup(driver.page_source)
store_names = soup.select('span.store_name_map > span')
for store in store_names:
	print(store.text.strip())

 

3. 영업시간 가져오기

from selenium import webdriver
from bs4 import BeautifulSoup
import time

#영업시간 가져오기
driver = webdriver.Chrome()

driver.get('https://www.banapresso.com/store')
time.sleep(2)
soup = BeautifulSoup(driver.page_source)
store_names = soup.select('span.store_name_map em')
for store in store_names:
	print(store.text.strip())
-->
07:00~17:00
07:00~17:30
07:00~17:00
07:00~20:00
07:00~21:00
06:30~21:00
07:00~22:00
07:00~20:00
06:30~23:00
07:00~21:00

 

from pymongo import MongoClient
url='mongodb+srv://bablove12345:hAU6FZOvtI8hcsCN@cluster0.kkabv.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0'
client = MongoClient(url)
print(client)
database = client['kdt']
collection = database['banapresso']

banapresso_insert={"branch_name":"가산디지털단지역점", "address":"서울시 금천구 가산동 60-3","open_hour":"07:00~17:00"}
result = collection.insert_one(banapresso_insert)
print(f'입력된데이터 id: {result.inserted_id}')
-->
입력된데이터 id: 675856ff77d952c15c9d108d

result = collection.find({})
for data in result:
  print(data)
 -->
 {'_id': ObjectId('675856ff77d952c15c9d108d'), 'branch_name': '가산디지털단지역점', 'address': '서울시 금천구 가산동 60-3', 'open_hour': '07:00~17:00'}
{'_id': ObjectId('6758595d77d952c15c9d108e'), 'branch_name': '가산안양천점', 'address': '서울 금천구 가산 디지털2로', 'open_hour': '07:00~17:30'}
{'_id': ObjectId('67585a2577d952c15c9d108f'), 'branch_name': '가산어반워크점', 'address': '서울시 금천구 가산디지털2로 135 1동 142호', 'open_hour': '07:00~17:00'}

 

 

728x90
LIST