파이썬으로 개발을 하다보니 윈도우나 os 의 GUI 에서 프로그래밍 하는거에 재미가 들려 공부를 해보았다.

그 내용을 포스팅 해보고 자 한다.

준비 tool :

- VS CODE(개발 편집프로그램)

- python 3.9 이하 버전 3.10 부터는 2022-01-27 기준 지원이 안됩니다.

    - https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

- pyqt5 설치 

    - pip install pyqt5

- pyqt5-tools 설치

   - pip install pyqt5-tools

 

위에 내용을 전부 설치 했다면 vscode 에서 터미널을 열고 버전과 설치 확인을 합니다.

vscode 터미널 여는 단축키 : ctrl + shift + `

명령어 : python --version

pyqt5, pyqt5-tools 설치 확인

명령어 : pip list (pip 설치된 리스트 출력 한다.)

 

간단한 화면 출력 프로그램밍을 해봅니다.

#pyqt5_example.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QWidget 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QWidget  

# 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
# 이 인스턴스를 app 변수에 저장 한다.
# 이렇게 하면 애플리케이션이 만들어 진다.
app = QApplication(sys.argv)
# QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
# 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
gui = QWidget()
# GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
gui.show()
# 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
# 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
# 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
sys.exit(app.exec())
 

 

타이틀을 변경 해 봅니다.

코드 중간에 gui.setWindowTitle('PyQt5 GUI'코드를 추가 하여 gui 의 타이틀을 변경 합니다.

#pyqt5_example.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QWidget 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QWidget  

# 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
# 이 인스턴스를 app 변수에 저장 한다.
# 이렇게 하면 애플리케이션이 만들어 진다.
app = QApplication(sys.argv)
# QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
# 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
gui = QWidget()

# 타이틀을 변경 합니다.
gui.setWindowTitle('PyQt5 GUI')

# GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
gui.show()
# 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
# 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
# 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
sys.exit(app.exec())
 

2장에서는 객체지향 코드로 변경 해 보도록 하겠습니다.

파이썬 ui 프로그래밍 실습 feat. PyQT5, PyQT-tools(designer)

Posted by 블로그하는프로그래머
,
Posted by 블로그하는프로그래머
,

파이썬에서 셀레니움을 사용하는 방법 2번째 

전 시간에는 파이썬에서 셀레니움의 라이브러리를 불러와 드라이브를 호출 하여 네이버를 연결하는 작동법 까지 포스팅을 해 봤습니다.

이전 포스팅은 이 포스팅 제일 아래 링크를 연결해 두겠습니다.

이번 포스팅 에서는 검색어를 입력 후 조회 된 페이지를 크롤링 하여 필요한 데이터를 수집하여 데이터화 하는 방법을 구현해 보도록 하겠습니다.

대신 한정적으로 "VIEW" 탭의 첫 페이지만 크롤링 해 보도록 하겠습니다.

수집된 데이터는 엑셀 파일로 데이터 화가 되게 할 것이고, 검색할 단어와 수집할 단어는

검색어 : "나이키"

수집할 단어 : "트레비스스캇"

조회를 하게 코딩 해 봅니다.

1. 네이버 메일 화면에서 검색 어 입력하는 input 박스의 name 또는 id 를 확인 합니다.

1-1. 네이버 웹사이트 화면에서 F12 를 눌러 개발자 툴을 엽니다.

개발자 툴에서 왼쪽 편에 보면 아래오 같은 아이콘이 생성이 되고 화면에서 검색어 창을 선택 할 수 있게 된다.

마우스 클릭을 하게 되면 검생어 입력 input 의 정보를 개발자 툴에서 보여 준다.

 

id는 query 

name 은 query 

둘다 같습니다.

이제 셀레니움에서 이 input에 "나이키" 를 입력 하게 합니다.

import selenium
from selenium import webdriver
from selenium.webdriver import ActionChains

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait

#접속 url
#검색어
SEARCHWORD = "나이키"
#찾을 단어
MACHINGWORD = "트레비스스캇"

driver = webdriver.Firefox(executable_path='C:\dev\python\geckodriver.exe')
#driver = webdriver.Chrome(executable_path='C:\dev\python\chromedriver.exe')

#네이버로 이동
driver.get(url=URL)

#사이트이름 매칭 확인
assert "NAVER" in driver.title

#input id = query, name = query -> "나이키 입력"
#searchName = driver.find_element_by_id("query")
searchName = driver.find_element_by_xpath("//*[@id='query']")
searchName.send_keys(SEARCHWORD)
searchName.submit()

 

위에 프로그램을 실행 하게 되면 아래 처럼 나이키를 검색 하게 됩니다.

 

이제 VIEW탭으로 이동을 해서 조회된 첫 페이지 대상들을 변수에 담아 보겠습니다.

뷰 탭으로 이동 할때는 xpath 를이용한 이동을 해보도록 하겠습니다.

어려운거 없이 개발자 도구에서 view 탭의 xpath를 복사해서 셀레니움에 복사한 xpath 를 넣어 주기만 하면 이동이 됩니다.

 

초록생경로가 xpath 경로 입니다.

#view 탭으로 이동 한다.
driver.implicitly_wait(100)
viewChage = driver.find_element_by_xpath("/html/body/div[3]/div[1]/div/div[2]/div[1]/div/ul/li[2]/a")
print(viewChage.text)
viewChage.click()

자 이제 view 탭의 첫 페이지 리스트 대상을 변수에 입력해 보겠습니다.

view 탭은 sc_new sp_nreview _au_view_tab _svp_list _prs_rvw 이란 큰 클래스에 각 포스팅들이 나열이 되어 있습니다.

그 아래로 list 클래스로 묶인 포스팅 리스트가 있습니다.

그 아래로 _more_contents_event_base 클랙스

ul 테그 lst_total _list_base 클래스

제일 중요한 li 테그의 bx _svp_item 클래스 의 data-cr-rank 속성들이 1부터 증가를 하는 것으로 확인이 됩니다.

1페이지당 30포스팅 까지 발생을 하고 추가적으로 발생되는건 + 30건씩 조회가 되는 것을 확인 했습니다.

그러면 반복문을 1부터 30까지 발생시켜 해당 url을 추출 하고 이동하여 테스트를 추출 합니다.

텍스트를 추출 하는 건 beautifulsoup 를 이용하여 진행 합니다.

웹상의 택스트를 정형화 하여 추출 하는것을 도와 주는 모듈 입니다.

pip install beautifulsoup4

url 접속을 도와주는 requests 모듈도 설치 한다.

pip install requests

 

전체 소스 코드는 아래와 같습니다.

카페, 블로그, 포스트 로 이루어진 VIEW 탭은 각기 별로 분기처리하는 로직이 필요하여 소스가 지저분해져 있습니다.

정형화 하고 함수로 정의 하는 부분은 나중에 정리해서 따로 포스팅 하도록 하겠습니다.

from cgitb import text
import selenium
from selenium import webdriver
from selenium.webdriver import ActionChains

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait

from time import sleep
from bs4 import BeautifulSoup
from urllib.parse import quote
import requests
import time


#접속 url
URL_TMP = ''
#검색어
SEARCHWORD = "나이키"
#찾을 단어
MACHINGWORD = "버블검"
# 조회 한 페이지의 피드 리스트 저장할 리스트 선언
POSTINGLIST = list()

# 저장할 파일
f = open('C:/dev/test.txt', 'w', encoding='utf-8')

driver = webdriver.Firefox(executable_path='C:\dev\python\geckodriver.exe')
#driver = webdriver.Chrome(executable_path='C:\dev\python\chromedriver.exe')

driver.set_window_position(0, 0)
driver.set_window_size(100, 1000)

#네이버로 이동
driver.get(url=URL)

#사이트이름 매칭 확인
assert "NAVER" in driver.title

#input id = query, name = query -> "나이키 입력"
#searchName = driver.find_element_by_id("query")
searchName = driver.find_element_by_xpath("//*[@id='query']")
searchName.send_keys(SEARCHWORD)
searchName.submit()

#view 탭으로 이동 한다.
driver.implicitly_wait(100)
viewChage = driver.find_element_by_xpath("/html/body/div[3]/div[1]/div/div[2]/div[1]/div/ul/li[2]/a")
print(viewChage.text)
viewChage.click()

#반복
# 첫페이지에서 조회된 대상을 변수에 저장한다.
# 첫 페이지 대상은 1부터 30까지의 대상이다.
# 20210117 기준 xpath 는 /html/body/div[3]/div[2]/div/div[1]/section/div/div[2]/panel-list/div/more-contents/div/ul/li[1]/div[1]/div/a
# 여기서 li의 [n]번 값이 증가 한다.
#for n in range(1, 31):
for n in range(1, 31):
    pth_tmp = "/html/body/div[3]/div[2]/div/div[1]/section/div/div[2]/panel-list/div/more-contents/div/ul/li[{0}]/div[1]/div/a".format(n)
    #print(pth_tmp)
    POSTINGLIST.append(pth_tmp)

print("-"*50)

for i in POSTINGLIST:
    driver.switch_to.window(driver.window_handles[0])
    postSearch = driver.find_element_by_xpath(i)    # 1~30까지 포스팅 페이지를 담는다.
    print(postSearch.get_attribute("href"))
    URL_TMP = postSearch.get_attribute("href")
    postSearch.click()                              # 이동한다.
    driver.implicitly_wait(100)                     # 로딩될때까지 대기
   
    webpage = requests.get(postSearch.get_attribute("href"))
    soup = BeautifulSoup(webpage.content, "html.parser")

    print("-"*50)

    #url이 블로그일 경우
    if "blog.naver" in postSearch.get_attribute("href"):
        print("블로그")
        print("https://blog.naver.com" + soup.iframe["src"])

        webpage = requests.get("https://blog.naver.com" + soup.iframe["src"])
        print("encoding = " + webpage.encoding)
        webpage.encoding = 'UTF-8'
        soup = BeautifulSoup(webpage.content, "html.parser")

        if soup.find("div", attrs={"class":"se-main-container"}):
            text = soup.find("div", attrs={"class":"se-main-container"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("블로그")
            print(text)
        elif soup.find("p", attrs={"class":"se_textarea"}):
            text = soup.find("p", attrs={"class":"se_textarea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("블로그")
            print(text)
        elif soup.find("div", attrs={"class":"ArticleContentBox"}):
            text = soup.find("div", attrs={"class":"ArticleContentBox"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("블로그")
            print(text)
        elif soup.find("div", attrs={"id":"postViewArea"}):
            text = soup.find("div", attrs={"id":"postViewArea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("블로그")
            print(text)
        else:
            print("블로그 확인불가")
            text = soup
            f.write('블로그\n')
            f.write("https://blog.naver.com" + soup.iframe["src"] + '\n')
            f.write(str(text))
            f.write('\n')

    #url이 post일 경우
    elif "post.naver" in postSearch.get_attribute("href"):
        print("포스트")
        #print(soup)
        print(postSearch.get_attribute("href"))
       
        webpage = requests.get(postSearch.get_attribute("href"))
        print("encoding = " + webpage.encoding)
        soup = BeautifulSoup(webpage.content, "html.parser", from_encoding='ANSI')
       
        f.write("포스트11111111111111111111111\n")
        f.write(postSearch.get_attribute("href") + "\n")
        f.write(str(webpage.encoding))
        f.write('\n')
        f.write("포스트22222222222222222222222\n")

        if soup.find("div", attrs={"class":"se-main-container"}):
            text = soup.find("div", attrs={"class":"se-main-container"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트1")
            print(text)
        elif soup.find("p", attrs={"class":"se_textarea"}):
            text = soup.find("p", attrs={"class":"se_textarea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트2")
            print(text)
        elif soup.find("div", attrs={"class":"ArticleContentBox"}):
            text = soup.find("div", attrs={"class":"ArticleContentBox"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트3")
            print(text)
        elif soup.find("div", attrs={"id":"postViewArea"}):
            text = soup.find("div", attrs={"id":"postViewArea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트4")
            print(text)
        elif soup.find("div", attrs={"class":"se_component_wrap"}):
            text = soup.find("div", attrs={"class":"se_component_wrap"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트5")
            print(text)
       
        elif soup.find("div", attrs={"id":"cont"}):
            text = soup.find("div", attrs={"id":"cont"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("포스트6")
            print(text)
        else:
            print("포스트 전체 조회")
            text = soup
            print(text)
            f.write("포스트 확인불가\n")
            f.write(postSearch.get_attribute("href") + "\n")
            f.write(str(text))
            f.write('\n')

    #url이 cafe일 경우
    elif "cafe.naver" in postSearch.get_attribute("href"):
        print("카페")
        #print(soup)

        #탭이동
        driver.switch_to.window(driver.window_handles[1])

        print("tap1 이동 완료")
        #print(driver.page_source)
        #f.write("11111111111111111111111111111카페\n")
        #f.write(driver.page_source + "\n")
        #f.write('\n')

        print("cafe_main 로딩시작")
        #cafe_main 로딩 완료 대기
        #driver.implicitly_wait(10)
        time.sleep(10)
        print("cafe_main 로딩완료")

        driver.switch_to.frame("cafe_main")          # cafe_main iframe으로 이동
        print("cafe_main frame 이동")
        #print(driver.page_source)
        #f.write("22222222222222222222222222222카페\n")
        #f.write(driver.page_source + "\n")
        #f.write('\n')
       
        driver.implicitly_wait(1)          
        req_tmp = driver.page_source
        print("페이지 확인")
        #print(driver.page_source)
        #f.write("33333333333333333333333333카페\n")
        #f.write(driver.page_source + "\n")
        #f.write('\n')

        soup = BeautifulSoup(req_tmp, "html.parser", from_encoding='ANSI')
        #print(soup)
       
        #webpage = requests.get(postSearch.get_attribute("href"))
        #print("encoding = " + webpage.encoding)
       
        #soup = BeautifulSoup(webpage.content, "html.parser", from_encoding='ANSI')

        if soup.find("div", attrs={"class":"se-main-container"}):
            text = soup.find("div", attrs={"class":"se-main-container"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페1")
            print(text)
        elif soup.find("p", attrs={"class":"se_textarea"}):
            text = soup.find("p", attrs={"class":"se_textarea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페2")
            print(text)
        elif soup.find("div", attrs={"class":"ArticleContentBox"}):
            text = soup.find("div", attrs={"class":"ArticleContentBox"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페3")
            print(text)
        elif soup.find("div", attrs={"id":"postViewArea"}):
            text = soup.find("div", attrs={"id":"postViewArea"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페4")
            print(text)
        elif soup.find("div", attrs={"class":"se-component-content"}):
            text = soup.find("div", attrs={"class":"se-component-content"}).get_text()
            text = text.replace("\n","") #공백 제거
            print("카페5")
            print(text)
        else:
            print("카페 확인불가")
            text = soup
            f.write("카페\n")
            f.write(postSearch.get_attribute("href") + "\n")
            f.write(str(text))
            f.write('\n')
   
    if MACHINGWORD in text:
        print("Found word " + MACHINGWORD)
        #print(postSearch.get_attribute("href"))
        driver.implicitly_wait(100)                     # 로딩될때까지 대기
        driver.switch_to.window(driver.window_handles[1])
        driver.close()
       
    else:
        print("Not Found word " + MACHINGWORD)
        #print(postSearch.get_attribute("href"))
        driver.implicitly_wait(100)                     # 로딩될때까지 대기
        driver.switch_to.window(driver.window_handles[1])
        driver.close()
       

    print("-"*50)

driver.quit()
f.close()

# 리스트의 url n번째 로 이동 하여 "트레비스스캇" 단어를 찾는다.
# 단어가 일치하는 대상이 있다면 변수에 url 을 담는다.
# 단어가 일치하면 count 를 한다.
# 다시 view 탭으로 이동한다.

파이썬 셀레니움 사용법 1

 

Posted by 블로그하는프로그래머
,

Phython Selenium 사용법 정리해 봅니다.

 

셀레니움 설치 명령어 실행 cmd 창에서 해도 되고 vscode의 Ctrl + Shift + ` 를 눌러서 터미널에서 실행해도 됩니다.

pip install selenium

 

 

셀레니움을 사용하려면 자신이 사용할 브라우저의 드라이브가 필요하다.

크롬

https://sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

파이어폭스

https://github.com/mozilla/geckodriver/releases

 

 

Releases · mozilla/geckodriver

WebDriver for Firefox. Contribute to mozilla/geckodriver development by creating an account on GitHub.

github.com

엣지

https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

 

Microsoft Edge Driver - Microsoft Edge Developer

canary Channel Daily release of our latest features and fixes. Version: 99.0.1135.0: x86 | x64 | ARM64

developer.microsoft.com

사파리

https://webkit.org/blog/6900/webdriver-support-in-safari-10/

 

WebDriver Support in Safari 10

Starting with Safari 10 on OS X El Capitan and macOS Sierra, Safari comes bundled with a WebDriver implementation that's maintained by the Web Developer Experience team at Apple.

webkit.org

 

이주 한 브라우저를 선택하고 버전도 자신이 필요로 하는 버전을 선택하여 프로그램에 응용을 합니다.

여기서 예제로 사용한 드라이브는 파이어폭스 0.30.0을 선택 하여 예제를 작성했습니다.

아래 대상을 다운로드합니다.

geckodriver-v0.30.0-win64.zip

https://github.com/mozilla/geckodriver/releases/download/v0.30.0/geckodriver-v0.30.0-win64.zip

필요한 라이브러리 Import 처리합니다.

import selenium
from selenium import webdriver
from selenium.webdriver import ActionChains

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait

 

다운로드한 드라이브와 파이썬 파일을 아래 디렉터리를 생성하여 저장합니다.

C:\dev\python

위에 Import 한 대상을 "naver_search_my_word_count.py" 로 저장합니다.

드라이브를 지정하고 원하는 페이지를 오픈하도록 코딩합니다.

import selenium
from selenium import webdriver
from selenium.webdriver import ActionChains

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait


driver = webdriver.Firefox(executable_path='C:\dev\python\geckodriver.exe')
#driver = webdriver.Chrome(executable_path='C:\dev\python\chromedriver.exe')
driver.get(url=URL)
 

프로그램을 실행하면 네이버 페이지로 이동하는 것을 알 수 있습니다.

Posted by 블로그하는프로그래머
,

종목명 : #LG에너지솔루션

청약일 : 2021/01/18 ~ 2021/01/19

공모주 배정 및 환불일 : 2021/01/21

상장일 : 2021/01/27

공모가 (1주 가격) 30만원 정도

한사람이 한 증권사에서 청약 가능 증거금 150만원 정도에 10주 청약을 하겠지만

지금 수요상 2500만원 증거금 있어야 1개 가능하다고 예측 중 입니다.

 

공모 주관사

증권사별 물량 배정 비율

증권사별 청약 시간

증권사별 청약 정보

 

Posted by 블로그하는프로그래머
,

연남동에 친척동생 사무실 갈 일이 있어서 놀러 갔다 왔습니다.

와이프랑 같이 방문을 했는데,



우리동네랑은 사뭇다른 골목들의 풍경에 재미도 있고,


즐겁게 돌아다니다가 연남동 저스트 텐동에서 점심을 먹었어요~^^


생선 텐동과 스페셜 텐동, 냉우동을 시켜 먹었어요~^^

저는 가격 대비 쏘쏘 하다고 생각합니다.

생선텐동과 스페셜텐동은 장어가 들어 있고 안들어 있고 인데.....ㅠ

그냥 생선 텐동만 시켜 먹을걸? 하고 생각이 들었어요~

[카카오맵] 저스트텐동 상수점
서울 마포구 독막로9길 8 (서교동)

http://kko.to/PimWbcl4H

저스트텐동

서울 마포구 독막로9길 8

map.kakao.com

Posted by 블로그하는프로그래머
,

강릉 스카이베이에 다녀 왔습니다.

단점 부터!




객실이 가격대비 너무 좁구, 퇴실할때 발렛 이용 한것을 후회하며 다시는 못오겠다는 생각이....

발렛 파킹 퇴실 요청 하고 40분 기다려서 타고 나왔어요~ㅠ

꼭! 발렛 파킹 말고 그냥 주차 하세요~

방음이 잘 안되서 옆방이 무슨 소리하는지 들리더라구요~

장점은!!




침대 가드랑 가습기 빌려줘서 너무 좋았어요. 가습기 덕분에 방이 건조하지 않고 상쾌하게 잘 잤어요.

침대가드는 아이가 많이 뒤척이는데 침대에서 떨어지지 않고 잘 잘 수 있게 해주었어요.

뷰가 좋았어요~ 바다 바로 앞이라 아침에 조식 먹을때 보이는 바다 뷰랑 레이크뷰가 비용의 전부인가? 라는 생각이....

풀장도 다른 호텔보다 좋아 보얐어요.

아이랑 같이 들어가기가 힘들어서 이번에는 패스 했어요~

보기에는 너무 좋아 보였어요~ 방문하시는 분들은 꼭 가보세요~^^

조식은 다른 호텔보다 메뉴가 많았어요~

한접시 다 먹고 보니 배가빵빵!! 맛있게 잘 먹었어요~^^

Posted by 블로그하는프로그래머
,

남원 할머니네 가면서 다녀온 남원 스위트 호텔입니다.

온돌방을 예약 하였고,

서비스 너무 친절 해서 좋았습니다.


보드게임 루미 큐브도 빌려주고, 최신 베스트 셀러 책도 볼 수 있었습니다.



가습기도 빌려 주셨는데, 사용법도 모르겠고, 오래된거 같아서 사용은 못했어요~




아이가 쓸수 있는 욕조도 따로 빌려주었는데, 아이가 너무 신나게 놀아줘서 감사함도 뒤 따르더라구요.



주차장은 지하가 없고, 지상에만 있어서 조금 불편함이 있었어요~

헬스장은 없고, 조식도 일반 음식점 처럼 주문 하면 나오는 방식으로 뷔페식이 아니라서 패스 했습니다.

전체적으로 서비스가 좋고 오래 됐지만 편하게 잘자고 나왔습니다.

층별 안내도
BBQ 셀프 메뉴

서비스 안내
204호
야외 수영장 이용시 무료대여 패딩

Posted by 블로그하는프로그래머
,