네이버 항공권 관련 제가 작성한 코드 조심스럽게 공유해드립니다.ㅜ
2525
작성한 질문수 4
안녕하세요
먼저 좋은 강의 해주시는 나도코딩님께 감사드립니다.
이전에 나름 정성들여 글을 작성했는데, 확인이 안돼서 다시 작성해봅니다.
제가 강의를 보고있는 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
답변 2
selenium 업그레이드됨... 문법도 바뀜
1
286
1
2024.08.28 수요일 기준 날씨 정보 가져오기 소스코드입니다 (참고하세요 : ) )
0
230
1
24년, 부동산 퀴즈 코드입니다. 참고하세요!!
0
177
1
git hub에 push할때 user-agent가 노출되도 상관이 없나요 ?
0
185
1
selenium 관련 web push notification 제어 질문
0
568
1
print(soup.a) 태그 값이 None으로 나옵니다.
0
1177
4
soup으로 검색한 버튼 또는 text를 click할때 어떻게 하나요 ?
1
3561
1
웹툰 사이트 body 안에가 안불러져옵니다.
0
677
2
네이버 웹툰을 활용한 BeautifulSoup 강좌에서 인터페이스가 달라졌습나다.
0
993
1
구글 무비 강좌에서요
0
399
0
네이버 IT뉴스 화면 requets.get 에러가 발생합니다ㅜ
0
432
0
23년 2월 7일, 다음 부동산 화면이 다름
0
403
0
bs4 활용 2-1 질문합니다.
0
504
2
csv파일 깨짐
0
313
0
url 에러? (\UXXXXXXXX escape)
0
310
0
네이버 쇼핑으로 하면 왜 결과가 안 뜰까요?
0
380
0
쿠팡대신 네이버 쇼핑에서하는데, 5개 아이템만 나옵니다.
0
366
0
쿠팡 requests에 오류가 생기네요
0
2905
1
URL 문제
0
389
0
request 설치
0
315
0
from selenium import webdriver ?
0
348
1
네이버웹툰 랭크가 안불러져요...;;
0
298
0
안녕하세요 에러문의드려요
0
215
0
안녕하세요 오류해결부탁드립니다
0
336
0





