반응형
반응형
반응형

[셀레니움 응용] 네이버 항공권 검색 1편 출발지 도착지 선택

파이썬 셀레니움을 사용하여 네이버 항공권 정보를 얻어오는 방법을 소개합니다.




목차:




1. 네이버 항공권 페이지 열기

셀레니움을 처음 접하시면 여기를 클릭하여 설치 및 사용법을 확인하실 수 있습니다.


# 이 프로젝트에서는 왕복 항공권을 기준으로 작성되었습니다.
# selenium Ver : 3.14.1
from selenium import webdriver
from selenium.webdriver.common.keys 
import time
# 웹드라이버 열기 (네이버 항공권)
driver = webdriver.Chrome()
driver.get("https://flight.naver.com/")

홈페이지에서 크롬 검사도구를 사용하여 원하는 elements를 찾는 방법




2. 출발지 도착지 선택하기

Xpath를 이용해서 출발지와 도착지를 선택하는 방법

  1. 가장 간단하게 작성법
# 이 프로젝트에서는 왕복 항공권을 기준으로 작성되었습니다.
# selenium Ver : 3.14.1
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 웹드라이버 열기 (네이버 항공권)
driver = webdriver.Chrome()
driver.get("https://flight.naver.com/")

# 출발지 선택
departure = "GMP"  # 김포
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[1]/button[1]').click()
time.sleep(0.1)
# 출발지 입력
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[1]/div/input').send_keys(departure)
time.sleep(0.1)
# 목록 중 첫번 째 선택
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[2]/section/div').click()
time.sleep(0.5)

# 도착지 선택
destination = "CJU"  # 제주
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[1]/button[2]').click()
time.sleep(0.1)
# 출발지 입력
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[1]/div/input').send_keys(destination)
time.sleep(0.1)
# 목록 중 첫번 째 선택
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[2]/section/div').click()
time.sleep(0.5)

(TIP) 입력 칸 선택, 텍스트 입력, 목록 선택의 동일한 구조를 가지므로 함수로 작성하여 코드를 간소화 할 수 있습니다.


  1. 동일한 구조 함수로 묶기
# 이 프로젝트에서는 왕복 항공권을 기준으로 작성되었습니다.
# selenium Ver : 3.14.1
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 웹드라이버 열기 (네이버 항공권)
driver = webdriver.Chrome()
driver.get("https://flight.naver.com/")

# 입력칸에 출발지, 목적지를 입력하고 목록 중 첫번 째를 선택하는 함수
def airway(part):
    driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[1]/div/input').send_keys(part)
    time.sleep(0.1)
    driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[2]/section/div').click()
    time.sleep(0.5)

# 출발지 선택
departure = "GMP"  # 김포
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[1]/button[1]').click()
time.sleep(0.1)
# airway 함수 인수에 출발지 입력
airway(departure)

# 도착지 선택
destination = "CJU"  # 제주
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[1]/button[2]').click()
time.sleep(0.1)
# airway 함수 인수에 도착지 입력
airway(destination)



3. 출발지 도착지 선택하기(간결한 코드)

반복되는 동일한 구조를 간결한 코드로 구성

# 이 프로젝트에서는 왕복 항공권을 기준으로 작성되었습니다.
# selenium Ver : 3.14.1
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 웹드라이버 열기 (네이버 항공권)
driver = webdriver.Chrome()
driver.get("https://flight.naver.com/")

#입력칸에 출발지, 목적지를 입력하고 목록 중 첫번 째를 선택하는 함수
def airway(parts):
    for part in parts:
        # Xpath를 분석 > 출발지:button[1], 도착지:button[2]인 것을 반복문을 통해 간소화 list Index : 0, 1
        index = parts.index(part)
        driver.find_element_by_xpath(f'//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[1]/button[{int(index)+1}]').click()
        time.sleep(0.1)
        driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[1]/div/input').send_keys(part)
        time.sleep(0.1)
        driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[4]/div/div/button/span').click()
        time.sleep(0.5)

# 출발, 도착지 {김포, 제주}
points = ['GMP', 'CJU']
airway(points)



관련글 모아보기



python3.9 | camp-lee@naver.com


python3.9 | camp-lee@naver.com


python3.9 | camp-lee@naver.com

반응형
반응형

[파이썬 기초] 다른 폴더 파일 import 하는 방법

main.py 파일과 다른 경로에 있는 class를 import하는 방법에 대해 소개합니다.

프로그램이 복잡하고 길어질수록 접근성 향상을 위해 기능별로 묶어 관리하는 것이 유지보수에 적합합니다.
다른 폴더에 정리한 내용을 import 하는 방법에 대해서 소개합니다.




목차:




1. __init__.py 파일 생성

_otherModules 폴더에서 init_class.py를 불러옵니다.

  • 불러오고자 하는 폴더( _otherModules )에 __init__.py 파일을 생성합니다.

  • 예시 _otherModules 폴더에 __init__.py 생성

  • 불러오고자 하는 class의 스크립트

      # init_class.py
      class showMessage:
          def msg(self):
              print("showMessage Class를 불러왔습니다.")
  • 위의 showMessage Class를 불러오기 위해 아래와 같이 __init__.py를 작성합니다.

      # __init__.py
      from . init_class import showMessage



2. main 스크립트에서 불러오기

_otherModules 폴더에서 init_class.py를 불러옵니다.

  • 메인 스크립트에서 _otherModules 폴더의 모든 내용을 import 하고 class showMessage를 불러옵니다.
      #main.py
      from _otherModules import showMessage
      test = showMessage()
      test.msg()


python3.9 | camp-lee@naver.com

반응형
반응형

[PyQt 2편] ui 파일 py 파일로 변환

파이썬 PyQt5 패키지를 사용하여 직접 GUI를 만들어 사용하는 방법을 공유합니다.




목차:




1. Qt Designer로 간단한 GUI 만들기

Qt Designer를 실행합니다. 아직 설치가 되어 있지 않다면 Qt Designer 설치
를 클릭해주세요.

  1. Main Window 생성

  2. Label과 Push Button을 배치합니다.

  3. Label과 Push Button의 정보를 수정합니다.

  4. ui파일을 저장합니다.




2. ui 파일 py 파일로 변환 (cmd를 사용한 변환)

Qt Designer에서 만든 ui파일을 Python에서 불러오기 위해 ui to py 변환이 필요합니다.

  1. cmd 실행 : 시작키를 누르고 CMD를 입력하여 명령 프롬프트를 실행합니다.
  2. ui파일이 있는 곳으로 경로 재설정
    • cd ui파일이 저장된 경로 입력
    • 예시 : cd C:/python/_uiFiles
  3. 입력 : python -m PyQt5.uic.pyuic -x main.ui -o main_cmd.py
    • ui 파일 이름과 변환할 파일 이름을 확인하세요.



3. ui 파일 py 파일로 변환 (Qt Designer에서 바로 변환)

Qt Designer에서 만든 ui파일을 Python에서 불러오기 위해 ui to py 변환이 필요합니다.

  1. ui파일을 저장
  2. 폼(O)탭에서 Python 코드 보기(P) 후 저장

  • 오류 : C:\Python39\Lib\site-packages\qt5_applications\Qt\bin\uic을(를) 실행할 수 없음: 프로세스를 시작할 수 없음: 지정된 파일을 찾을 수 없습니다.

uic.exe
378.4 kB

  • 해결방법 :
    1. uic.exe 파일을 다운로드
    2. 오류코드의 해당 경로에 uic.exe 파일 이동
  • 이 방법을 사용하면 Pyside2를 import한 ui to py 코드가 생성됩니다.

python3.9 | camp-lee@naver.com

반응형

'[GUI] PyQt5' 카테고리의 다른 글

[PyQt 1편] pyqt5 패키지 설치 및 Qt Designer  (0) 2021.10.23
반응형

[PyQt 1편] pyqt5 패키지 설치 및 Qt Designer

파이썬 PyQt5 패키지를 사용하여 직접 GUI를 만들어 사용하는 방법을 공유합니다.




목차:



1. PyQt5 패키지 설치 및 간단 예제

  • PyQt5 패키지 설치 pip install pyqt5
  • 패키지 설치 시 Qt Designer 가 같이 설치 됩니다.
  • 간단한 예제
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

def main():
    app = QApplication(sys.argv)
    widgets = QWidget()
    widgets.resize(200,50)
    widgets.setWindowTitle("PyQt5 GUI")
    # 푸시 버튼
    btn1 = QPushButton('O', widgets)
    btn1.resize(100,30)
    btn1.move(0,20)
    btn2 = QPushButton('X', widgets)
    btn2.resize(100,30)
    btn2.move(100,20)
    # 푸시 버튼 클릭
    btn1.clicked.connect(lambda: print("O 클릭"))
    btn2.clicked.connect(lambda: print("X 클릭"))
    widgets.show()
    sys.exit(app.exec_())
main()



2. Qt Designer 소개

위 예제와 같이 직접 GUI 코드를 작성하여 GUI를 구성할 수 있습니다. 하지만 Qt Designer를 사용하여 드래그&드롭으로 편리한 GUI구성을 할 수 있습니다.

  • 실행화면
  • 드래그&드롭



3. Qt Designer 설치

이 번 포스팅에서는 Qt Designer 5.15.2 버전을 사용합니다.

  1. PyQt5 패키지 설치 시 Qt Designer가 자동으로 다운로드됩니다.
    • Python 설치폴더/Lib/site-packages/qt5_applications/Qt/bin/designer.exe
  2. 직접 다운로드를 하실 수 있습니다.


python3.9 | camp-lee@naver.com

반응형

'[GUI] PyQt5' 카테고리의 다른 글

[PyQt 2편] ui 파일 py 파일로 변환  (0) 2021.11.03
반응형

[셀레니움 기초 4편] html 데이터 읽기 bs4

파이썬, 셀레니움을 사용하여 인터넷에 원하는 정보를 자동으로 스크랩하는 방법을 소개합니다.




목차:




1. BeautifulSoup 소개

html 정보를 파싱하는 도구

  • BeautifulSoup의 bs4 패키지를 사용하여 html을 분석하여 원하는 데이터를 얻을 수 있습니다.
  • 셀레니움, requests 패키지 등과 사용할 수 있습니다.
  • bs4 패키지 설치 pip install beautifulsoup4



2. 네이버 현재 상영작 정보 개발자 도구로 분석

네이버 현재상영작 검색 바로가기

  1. 네이버에서 현재상영작을 검색합니다.
  2. [F12] 또는 [우클릭 > 검사]개발자 도구 를 열어줍니다.
  3. 개발자 도구 를 사용해서 해당 영역의 html을 분석합니다.
    • ※ 어느 영역을 선택하느냐에 따라 결과가 달라질 수 있습니다.
    • ※ 중복되는 class name이 있을 수 있습니다.


  1. 해당 영역이 'data_box' 라는 class 로 묶여 있는 것을 확인할 수 있습니다.
  2. class name의 데이터를 텍스트형식으로 얻어보겠습니다.



3. 셀레니움 + html 파싱

class : data_box 의 텍스트 데이터를 추출해보겠습니다.

# selenium Ver : 3.14.1
from selenium import webdriver
# pip install beautifulsoup4
from bs4 import BeautifulSoup as bs

# 웹드라이버 열기 (네이버에 현재상영작 검색 URL)
url = "https://search.naver.com/search.naver?sm=tab_hty.top&query=현재상영작"
driver = webdriver.Chrome()
driver.get(url)

# 크롬드라이버의 현재 페이지의 url 얻기
page_url = driver.page_source
# 현재 url 주소의 html 데이터를 파싱
soup = bs(page_url, "html.parser")
movie_list = soup.find_all(class_='data_box')

# 8개의 영화 정보가 리스트로 저장되어 있습니다.
for movie_info in movie_list:
    print(movie_info.text)

결과 (날짜에 따라 결과가 다를 수 있습니다.)

   듄     개요 모험 155분   개봉 2021.10.20. 평점 8.33   출연  티모시 샬라메, 레베카 퍼거슨, 오스카 아이삭, 조슈 브롤린, 제이슨 모모아, 하비에르 바르뎀    
   베놈 2: 렛 데어 비 카니지     개요 액션 97분   개봉 2021.10.13. 평점 6.28   출연  톰 하디, 미셸 윌리엄스, 나오미 해리스, 레이드 스콧, 스테판 그레이엄, 우디 해럴슨    
   보이스     개요 범죄 109분   개봉 2021.09.15. 평점 8.43   출연  변요한, 김무열, 김희원, 박명훈, 이주영, 조재윤    
   007 노 타임 투 다이     개요 액션 163분   개봉 2021.09.29. 평점 7.09   출연  다니엘 크레이그, 라미 말렉, 라샤나 린치, 레아 세이두, 벤 위쇼, 아나 디 아르마스    
   라스트 듀얼: 최후의 결투     개요 액션 152분   개봉 2021.10.20. 평점 9.80   출연  맷 데이먼, 아담 드라이버, 조디 코머, 벤 애플렉, 해리엇 월터, 나다니엘 파커    
   기적     개요 드라마 117분   개봉 2021.09.15. 평점 9.11   출연  박정민, 이성민, 윤아, 이수경, 김강훈, 정문성    
   노회찬6411     개요 다큐멘터리 127분   개봉 2021.10.14. 평점 9.30   출연  노회찬    
   한창나이 선녀님     개요 다큐멘터리 83분   개봉 2021.10.20. 평점 10.00   출연  임선녀  



4. requests + html 파싱

pip install requests

# selenium Ver : 3.14.1
# pip install beautifulsoup4
from bs4 import BeautifulSoup as bs
# pip install request
import requests

# 네이버에 현재상영작 검색 바로가기 URL
url = "https://search.naver.com/search.naver?sm=tab_hty.top&query=현재상영작"
response = requests.get(url)

# 상태체크 "200" : "정상", 정상일 경우 파싱
if response.status_code == 200:
    html = response.text
    soup = bs(html, "html.parser")
    movie_list = soup.find_all(class_='data_box')

    # 8개의 영화 정보가 리스트로 저장되어 있습니다.
    for movie_info in movie_list:
        print(movie_info.text)

결과 (날짜에 따라 결과가 다를 수 있습니다.)

   듄     개요 모험 155분   개봉 2021.10.20. 평점 8.33   출연  티모시 샬라메, 레베카 퍼거슨, 오스카 아이삭, 조슈 브롤린, 제이슨 모모아, 하비에르 바르뎀    
   베놈 2: 렛 데어 비 카니지     개요 액션 97분   개봉 2021.10.13. 평점 6.28   출연  톰 하디, 미셸 윌리엄스, 나오미 해리스, 레이드 스콧, 스테판 그레이엄, 우디 해럴슨    
   보이스     개요 범죄 109분   개봉 2021.09.15. 평점 8.43   출연  변요한, 김무열, 김희원, 박명훈, 이주영, 조재윤    
   007 노 타임 투 다이     개요 액션 163분   개봉 2021.09.29. 평점 7.09   출연  다니엘 크레이그, 라미 말렉, 라샤나 린치, 레아 세이두, 벤 위쇼, 아나 디 아르마스    
   라스트 듀얼: 최후의 결투     개요 액션 152분   개봉 2021.10.20. 평점 9.80   출연  맷 데이먼, 아담 드라이버, 조디 코머, 벤 애플렉, 해리엇 월터, 나다니엘 파커    
   기적     개요 드라마 117분   개봉 2021.09.15. 평점 9.11   출연  박정민, 이성민, 윤아, 이수경, 김강훈, 정문성    
   노회찬6411     개요 다큐멘터리 127분   개봉 2021.10.14. 평점 9.30   출연  노회찬    
   한창나이 선녀님     개요 다큐멘터리 83분   개봉 2021.10.20. 평점 10.00   출연  임선녀  




[셀레니움 기초 1편] 패키지 설치 및 웹페이지 열기
[셀레니움 기초 2편] 텍스트 입력 | 버튼 클릭 | 페이지 이동
[셀레니움 기초 3-1편] 네이버 자동 로그인
[셀레니움 기초 3-2편] 쿠팡 자동 로그인
[셀레니움 기초 4편] html 데이터 읽기 bs4


python3.9 | camp-lee@naver.com

반응형
반응형

1.  다음은 사용자로부터 정수를 입력받아 이 정수가 2와 3으로 나누어떨어지는지를 확인하는 프로그램이다. 밑줄부분을 채우시오. (논리연산자 사용)


<프로그램>

n = int(input("정수를 입력하시오: "))

print("2와 3으로 나누어떨어집니다.")

else :

print("2와 3으로 나누어떨어지지 않습니다.")

# 1
n = int(input("정수를 입력하시오: "))
if n%2 == 0 or n%3 == 0:
    print("2와 3으로 나누어떨어집니다.")
else :
    print("2와 3으로 나누어떨어지지 않습니다.")

 

 

2. 회사의 한 부서의 출근 시간은 아침 9시 30분까지이다. “정시 출근”인지 “지각”인지 판단하는 프로그램을 작성하시오.

1) 시와 분을 따로 입력 받아야 한다.

2) 9시 30분까지는 정시 출근이고 9시 30분을 초과하면 지각이다.




<출력결과 예시1>

출근 시간은 9시 30분까지입니다.
출근 시각의 시를 입력하세요: 9
출근 시각의 분을 입력하세요: 25
정시 출근입니다.


<출력결과 예시2>

출근 시간은 9시 30분까지입니다.
출근 시각의 시를 입력하세요: 10
출근 시각의 분을 입력하세요: 10
지각입니다.

# 2. 문제가 모호하네요.
print("출근 시간은 9시 30분까지입니다.")
go_work_hour = int(input("출근 시각의 시를 입력하세요:"))
go_work_min = int(input("출근 시각의 분을 입력하세요:"))
replace_hour_to_min = go_work_hour*60

if replace_hour_to_min+go_work_min > 570:
    print("지각입니다.")
else:
    print("정시 출근입니다.")

 

 

3. 조건에 따라 10보다 큰 짝수와 홀수, 그리고 10보자 작은 짝수와 홀수를 출력하려고 합니다. 다음 프로그램을 완성하시오.

a=int(input("수를 입력하세요: "))
print('10보다 큰 짝수')
print("10보다 큰 홀수")
print("10이하의 짝수")
print('10이하의 홀수')

# 3.
a=int(input("수를 입력하세요: "))

if a % 2==0 and a > 10:
    print('10보다 큰 짝수')
elif a % 2==1 and a > 10:
    print("10보다 큰 홀수")
elif a % 2 == 0 and a <= 10:
    print("10이하의 짝수")
elif a % 2 == 1 and a <= 10:
    print('10이하의 홀수')​
반응형
반응형
반응형
반응형

[파이썬 연습] 파이썬으로 계산기 만들기 Tkinter

Python과 Tkinter 패키지을 이용하여 간단한 계산기를 만듭니다.




목차:




1. Tkinter 패키지 설치




2. 계산기 예제

## tkinter를 tk로 선언
import tkinter as tk

## Tk init
root = tk.Tk()
## GUI window title, size
root.title("Calculator")
root.geometry("250x260")

## GUI Frames
# display frames
frame_display = tk.Frame()
frame_display.pack()
# btn frames
frame_btns = tk.Frame()
frame_btns.pack()
# font display, btn
font = ("Courier", 30, "bold")
font_nums = ("Courier", 12, "bold")
# display setup
display = tk.Entry(frame_display, width=45, justify='right', font=font)
display.pack()

# globals
global num_operator
num_operator = []

## btn clicked insert number on display
def btn_click(num):
    display.insert(tk.END, num)
## display, list clear
def btn_allclear():
    print("Clear Numbers")
    global num_operator
    num_operator.clear()
    display.delete(0, tk.END)
## 계산 (def main)
def btn_cal(button):
    # 연산자 [더하기 빼기 나누기 곱하기]
    operators = ['+', '-', '/', '*']
    # Display의 숫자와 연산자를 같이 List에 담기 ex : [1+] or [2-] or [3/]
    num_operator.append(display.get()+button)
    display.delete(0, tk.END)
    print(num_operator)
    # List의 index가 2개 이상이 되면 계산 > ex :[1+, 2=] 가 되었을 때
    if len(num_operator)>=2:
        # 처음 연산자 ['+', '-', '/', '*']
        operator = num_operator[0][-1]

        try:
            first_num = int(num_operator[0].split(operator)[0])
        except:
            first_num = float(num_operator[0].split(operator)[0])

        # 두번 째 연산자가 등호일 때 결과값 출력, 아닐 때 중첩 계산
        if num_operator[1][-1] == '=':
            result = calculate(operator,first_num,int(num_operator[1].split("=")[0]))
            display.insert(tk.END, result)
            num_operator.clear()
        else:
            for op in operators:
                if op == num_operator[1][-1]:
                    second_num = num_operator[1].split(op)
                    reset = str(calculate(operator, first_num, int(second_num[0])))
                    num_operator.clear()
                    num_operator.append(reset+op)
                    break

# 연산자에 따라 return하는 함수
def calculate(op, num1, num2):
    if op == '+': # plus
        return num1 + num2
    if op == '-': # minus
        return num1 - num2
    if op == '/': # div
        return num1 / num2
    if op == '*': # multi
        return num1 * num2

# 버튼 GUI SETTINGS
def gui_settings():
    # 버튼 크기 설정
    height = 2
    width = 5

    # 숫자 버튼
    btn_0 = tk.Button(frame_btns, text='0', height=height, width=width, font=font_nums, command=lambda: btn_click(0))
    btn_1 = tk.Button(frame_btns, text='1', height=height, width=width, font=font_nums, command=lambda: btn_click(1))
    btn_2 = tk.Button(frame_btns, text='2', height=height, width=width, font=font_nums, command=lambda: btn_click(2))
    btn_3 = tk.Button(frame_btns, text='3', height=height, width=width, font=font_nums, command=lambda: btn_click(3))
    btn_4 = tk.Button(frame_btns, text='4', height=height, width=width, font=font_nums, command=lambda: btn_click(4))
    btn_5 = tk.Button(frame_btns, text='5', height=height ,width=width, font=font_nums, command=lambda: btn_click(5))
    btn_6 = tk.Button(frame_btns, text='6', height=height, width=width, font=font_nums, command=lambda: btn_click(6))
    btn_7 = tk.Button(frame_btns, text='7', height=height, width=width, font=font_nums, command=lambda: btn_click(7))
    btn_8 = tk.Button(frame_btns, text='8', height=height, width=width, font=font_nums, command=lambda: btn_click(8))
    btn_9 = tk.Button(frame_btns, text='9', height=height, width=width, font=font_nums, command=lambda: btn_click(9))
    btn_0.grid(row=4, column=2)
    btn_1.grid(row=3, column=1)
    btn_2.grid(row=3, column=2)
    btn_3.grid(row=3, column=3)
    btn_4.grid(row=2, column=1)
    btn_5.grid(row=2, column=2)
    btn_6.grid(row=2, column=3)
    btn_7.grid(row=1, column=1)
    btn_8.grid(row=1, column=2)
    btn_9.grid(row=1, column=3)

    # 연산자, 클리어 버튼
    btn_clear = tk.Button(frame_btns, text='C', height=height, width=width, font=font_nums, command=btn_allclear)
    btn_plus = tk.Button(frame_btns, text='+', height=height, width=width, font=font_nums, command=lambda: btn_cal("+"))
    btn_minus = tk.Button(frame_btns, text='-', height=height, width=width, font=font_nums, command=lambda: btn_cal("-"))
    btn_mul = tk.Button(frame_btns, text='X', height=height, width=width, font=font_nums, command=lambda: btn_cal("*"))
    btn_equal = tk.Button(frame_btns, text='=', height=height, width=width, font=font_nums, command=lambda: btn_cal("="))
    btn_div = tk.Button(frame_btns, text='/', height=height, width=width, font=font_nums, command=lambda: btn_cal("/"))
    btn_plus.grid(row=4, column=4)
    btn_minus.grid(row=3, column=4)
    btn_mul.grid(row=2, column=4)
    btn_div.grid(row=1, column=4)
    btn_equal.grid(row=4, column=3)
    btn_clear.grid(row=4, column=1)


gui_settings()
root.mainloop()

실행(Run) 방법:

  • 우측 상단 ▶ 버튼
  • 실행 : Shift + F10
  • 선택 실행 : Alt + Shift + F10


python3.9 | camp-lee@naver.com

반응형
반응형

[셀레니움 기초 3-2편] 쿠팡 자동 로그인

파이썬, 셀레니움을 사용하여 인터넷에 원하는 정보를 자동으로 스크랩하는 방법을 소개합니다.




목차:




1. 셀레니움 패키지 설치

이 번 포스팅에서는 selenium 3.14.1 버전을 사용합니다.




2. 예제

쿠팡 로그인

  • 아래의 코드를 붙여넣고 아이디, 비밀번호를 수정합니다.
# selenium Ver : 3.14.1
from selenium import webdriver
import time

# 웹드라이버 열기 (쿠팡)
driver = webdriver.Chrome()
#
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
                       { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ })
driver.get("https://www.coupang.com/")
time.sleep(1)
# 쿠팡 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="login"]/a').click()
time.sleep(1)

# 로그인 창에 아이디/비밀번호 입력
driver.find_element_by_xpath('//*[@id="login-email-input"]').send_keys("아이디")
time.sleep(1)
driver.find_element_by_xpath('//*[@id="login-password-input"]').send_keys("비밀번호")
time.sleep(1)

# 로그인 버튼 클릭
driver.find_element_by_xpath('/html/body/div[1]/div/div/form/div[5]/button').click()



  • 1. 크롬 검사도구를 사용해 xpath, id 등 elements를 얻을 수 있고 element에 맞게 수정해서 사용할 수 있습니다.
    • 이 예제에선 Xpath를 사용했습니다.
      #다양한 find_element_by_ 들을 사용할 수 있습니다.
      driver.find_element_by_xpath(self, xpath)
      driver.find_element_by_css_selector(self, css_selector)
      driver.find_element_by_class_name(self, name)
      driver.find_element_by_link_text(self, link_text)
      driver.find_element_by_name(self, name)
      driver.find_element_by_id(self, id_)
      driver.find_element_by_tag_name(self, id_)
      driver.find_element_by_partial_link_text(self, link_text)



[셀레니움 기초 1편] 패키지 설치 및 웹페이지 열기
[셀레니움 기초 2편] 텍스트 입력 | 버튼 클릭 | 페이지 이동
[셀레니움 기초 3-1편] 네이버 자동 로그인
[셀레니움 기초 3-2편] 쿠팡 자동 로그인
[셀레니움 기초 4편] html 데이터 읽기 bs4


python3.9 | camp-lee@naver.com

반응형
반응형

[셀레니움 기초 3-1편] 네이버 자동 로그인

파이썬, 셀레니움을 사용하여 인터넷에 원하는 정보를 자동으로 스크랩하는 방법을 소개합니다.




목차:




1. 셀레니움 패키지 설치

이 번 포스팅에서는 selenium 3.14.1 버전을 사용합니다.




2. 클립보드 패키지 설치

네이버는 로그인 시 로봇 입력 방지 'captcha' 때문에 클립보드(복사)를 거쳐 ID PW를 입력해야하므로 필요합니다.




3. 예제

네이버 로그인

  • 아래의 코드를 붙여넣고 아이디, 비밀번호를 수정합니다.
# selenium Ver : 3.14.1
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import clipboard
import time

# 웹드라이버 열기 (네이버 메인 화면)
driver = webdriver.Chrome()
driver.get("https://www.naver.com/")

# 네이버 메인화면에서 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="account"]/a').click()
time.sleep(1)   # 1초 시간 지연

# 로그인 창에 아이디/비밀번호 입력
loginID = "아이디"
clipboard.copy(loginID)
driver.find_element_by_xpath('//*[@id="id"]').send_keys(Keys.CONTROL, 'v')

loginPW = "비밀번호"
clipboard.copy(loginPW)
driver.find_element_by_xpath('//*[@id="pw"]').send_keys(Keys.CONTROL, 'v')
time.sleep(1)

# 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="log.login"]').click()
  • 네이버 로그인의 경우 로봇 입력 방지 captcha를 우회하기 위해 클립보드에 복사, 입력 칸에 붙여넣기 방식을 사용하였습니다. 다른 사이트의 경우, xpath.send_key("ID/PW") 적용할 수 있습니다.

  • 1. 크롬 검사도구를 사용해 xpath, id 등 elements를 얻을 수 있고 element에 맞게 수정해서 사용할 수 있습니다.

    • 이 예제에선 Xpath를 사용했습니다.
      #다양한 find_element_by_ 들을 사용할 수 있습니다.
      driver.find_element_by_xpath(self, xpath)
      driver.find_element_by_css_selector(self, css_selector)
      driver.find_element_by_class_name(self, name)
      driver.find_element_by_link_text(self, link_text)
      driver.find_element_by_name(self, name)
      driver.find_element_by_id(self, id_)
      driver.find_element_by_tag_name(self, id_)
      driver.find_element_by_partial_link_text(self, link_text)



[셀레니움 기초 1편] 패키지 설치 및 웹페이지 열기
[셀레니움 기초 2편] 텍스트 입력 | 버튼 클릭 | 페이지 이동
[셀레니움 기초 3-1편] 네이버 자동 로그인
[셀레니움 기초 3-2편] 쿠팡 자동 로그인
[셀레니움 기초 4편] html 데이터 읽기 bs4


python3.9 | camp-lee@naver.com

반응형

+ Recent posts