인프런 커뮤니티 질문&답변

박재현님의 프로필 이미지
박재현

작성한 질문수

파이썬 무료 강의 (활용편3) - 웹 스크래핑 (5시간)

Selenium 활용 1-1 (네이버 항공권)

네이버 항공권 관련 제가 작성한 코드 조심스럽게 공유해드립니다.ㅜ

작성

·

2K

·

수정됨

5

안녕하세요

먼저 좋은 강의 해주시는 나도코딩님께 감사드립니다.

 

이전에 나름 정성들여 글을 작성했는데, 확인이 안돼서 다시 작성해봅니다.

 

제가 강의를 보고있는 2023년 1월 19일과 강의날인 2020년 8월과 네이버 항공권 인터페이스가 많이 상이하고, 셀레니움과 파이썬 버전이 달라 저의경우 아래와 같이 코드를 작성했습니다.

 

다른분들께 도움이 되었으면 좋겠습니다.

 

현재 저의 환경의 경우 python버전 3.10.7 버전이고 selenium또한 강의때 사용하신것 보다 더 높은 것으로 보입니다.

 

현재 제 경우와 강의내용과 상이한 부분은 아래와 같습니다.

 

  • 네이버 항공권 진입시, "지금 바로 혜택 확인하기" 광고 팝업창 발생, 해당부분 get_attribute메소드를 사용해 title을 비교해, 팝업이 있다면 팝업을 삭제하는 XPATH를 확인해 해당 엘리먼트를 클릭하도록 구현

  • browser.find_element_by_class_name과 같이 find_element_by_~~ 메소드 사용불가

    => 현재 제가 사용중인 셀레니움 버전이 상위 버전으로 보이는데, 이는 3 line과 같이 import By로 쉽게 수정 가능

  • find_elements_link_text 메소드 사용 불가

    => 2020년대비 2023년 현재 네이버 항공권 웹페이지 인터페이스의 변화때문인지 "가는 날" 및 날짜 선택을 위해 해당 메소드 사용시 빈리스트만 반환

  • "가는 날"은 XPATH로 엘리먼트를 얻어와 클릭하도록 구현

  • 원하는 날짜의 경우 class이름을 확인해 모든 날짜정보를 갖고와 원하는 날짜정보만 사용하도록 구현 (compute_date 함수 참고 부탁 드립니다.)

    추가적으로, 이 경우에 1년치 달력정보를 모두 읽어와 속도가 매우 느린데 더 좋은 방법을 알고계신분은 공유 부탁드립니다. ( _ _ )

  • compute_date(dates, 30)[1].click()
    코드를 이렇게 수정해 오는날을 2월 30일을 선택하려 했으나 3월 30일을 선택해, 코드 오류인줄 알고 디버깅해보니 2월달은 30일이 없었습니다...ㅎ
    정상동작 중 입니다.

저와같이 초반에 고생하시는 분들께 조금이나마 도움이 되었으면 좋겠습니다.

감사합니다.

 

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

URL = "https://flight.naver.com/"


def compute_date(dates, target) -> list:
    print("compute entire date information from current month to limit")
    return [date for date in dates if date.text == str(target)]


browser = webdriver.Chrome()
# browser.maximize_window()

browser.get(URL)
time.sleep(1)

# remove AD popup
find = browser.find_elements(By.CLASS_NAME, "anchor")
for f in find:
    if f.get_attribute("title") == "지금 바로 혜택 확인하기":
        browser.find_element(By.XPATH, '//*[@id="__next"]/div/div[1]/div[9]/div/div[2]/button[1]').click()
        print("remove pop up")
        break

# push 가는 날 button also delay 1 sec is necessary, if don't use this, can not read date information.
browser.find_element(By.XPATH, '//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[2]/button[1]').click()
time.sleep(1)

# read date information and push 25 day
dates = browser.find_elements(By.CLASS_NAME, "sc-evZas dDVwEk num".replace(" ", "."))
compute_date(dates, 25)[0].click()
# read date information and push 30 day
dates = browser.find_elements(By.CLASS_NAME, "sc-evZas dDVwEk num".replace(" ", "."))
compute_date(dates, 30)[0].click()


while True:
    pass

답변 1

0

정말 고맙습니다. 셀레니움 엘레멘트 선택부터 다 달라져서 막혀서 어려웠습니다. 강의 업데이트나 질문이 없어 이상하다 했거든요

박재현님의 프로필 이미지
박재현
질문자

도움이 되셨다고하니 제가 더 감사합니다 :)

혹 막히시는 부분이 있으시면 가감없이 질문주시면 제가 아는 지식선에서는 도움드릴 수 있습니다.

즐거운 코딩 되셨으면 좋겠습니다.

감사합니다 :)

박재현님의 프로필 이미지
박재현

작성한 질문수

질문하기