오늘도 셀레니움 공부를 위해 화띵 ..!

나도코딩님의 영상보면서 활용편 공부 (25-26 chapter. selenium 활용 1-1, 1-2 (네이버 항공권)
https://www.youtube.com/watch?v=yQ20jZwDjTE
네이버 항공권
목적: 특정 일자, 장소에 맞춰 나오는 결과들을 가지고 웹스크래핑
예시: 아래 이미지와 같이 노란 음영 부분의 결과를 웹스크래핑

셀레니움 세팅
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
options = Options()
options.add_argument("--start-maximized")
options.add_experimental_option("detach", True)
1. 네이버 이동
여기까진 이제 익숙해졌을 거라고 생각함
근데 이벤트 뜨는 거 삭제 코드를 짠 이유는 네이버 항공권 사이트 들어가면 이벤트 뜨는거에 막혀서 다음 코드로 진행이 안되기 때문 ... !
# 1. 네이버 이동
browser = webdriver.Chrome(options= options)
url = "https://flight.naver.com/"
browser.get(url)
# 이벤트 뜨는 거 삭제 (7일간 보지 않기 클릭)
browser.find_element(By.XPATH, '//*[@id="layer"]/button[1]').click()
2. 가는 날, 오는 날 선택
= 가는 날 선택하여 원하는 날짜 (가는 날, 오는 날) 선택
# 2. 가는날 선택
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div/div[2]/div[2]/button[1]').click()
# # 이번 달 27일, 28일 선택 (10/27, 10/28)
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[1]/div[2]/div/div/div[2]/table/tbody/tr[5]/td[2]/button/b').click()
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[1]/div[2]/div/div/div[2]/table/tbody/tr[5]/td[3]/button/b').click()
이미 기초와 심화편에서 알려줬으나, 다시 반복하자면 ;
- ctrl + shift + I 클릭 (또는 f12) > 개발자 도구 > 노란 음영 아이콘 클릭 > 원하는 부분 ("가는날") 부분 클릭 > 개발자 도구에 있는 파란색 박스 확인 > (Xpath 사용 시) 우클릭 > copy > copy xpath

이번 달 27일, 다음 달 27일 클릭
'나도코딩'님 영상에서는 문제 없이 잘 돌아갔는데, 내가 봤을 땐 사이트의 구성이 달라져서 문제가 생기는 듯 함
# 이번 달 27일, 다음 달 27일 선택 (10/27, 11/27)
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[1]/div[2]/div/div/div[2]/table/tbody/tr[5]/td[2]/button/b').click()
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[1]/div[2]/div/div/div[3]/table/tbody/tr[3]/td[1]/button').click()
불가능. . . 화면에서 다음 달 27일이 나오지 않아서 그런 듯 함. 아직 스크롤 내리는 건 배우지 않았고, chat gpt로 스크롤 내리는 코드 달라고 해서 해봤는데 작동이 안됨 . .
왜 스크롤 때문이라고 생각했냐면, 아래 이미지와 같이 화면이 나오고 저 화면의 끝 일자인 '8'일을 선택 코드 넣을 땐 잘 작동됨
근데 '9'일부터 작동이 안됨
스크롤 내리는 것 제대로 배우고 나서 다시 이 내용은 수정할 예정.

3. 제주도 선택 & 항공권 검색 클릭
중간에 time.sleep(2)를 해준 이유 :
- 너무 빠르게 클릭 되면서 로딩 속도에 맞지 않아서 제주도 선택과 항공권 검색 클릭 부분 실행되지 XX
- => 대기 시간을 부여해줌으로써 로딩된 후, 클릭될 수 있도록 시간 부여
# 3. 제주도 선택 & 항공권 검색 클릭
# 목적지 선택
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div/div[2]/div[1]/button[2]/b').click()
time.sleep(2)
# 제주도 선택
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[2]/div[2]/ul[1]/li[1]/button').click()
time.sleep(2)
# 항공권 검색 클릭
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div/div[2]/button/span').click()
4. 항공권 정보 수집
위에서도 time.sleep을 주었는데, 다른 방법도 공유 :
1. time.sleep(원하는 초) : 원하는 초 만큼 대기 시간 제공
# 항공권 검색 클릭
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div/div[2]/button/span').click()
time.sleep(5)
# 결과 출력
# 첫 번째
elm= browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[4]/div/div[2]/div[2]/div[1]')
print(elm.text)
2. 아래 코드 확인
time.sleep의 경우, 시간 낭비 가능성 있음
예) 원하는 초 만큼 제공 하기 때문에 만약 로딩이 1초 걸렸으나,time.sleep(10)으로 한 경우 9초의 시간 낭비
=> 2번의 방법 추천
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
try : # 10 초 초과 시, error 발생. 따라서 error가 나면 바로 종료시키기 위해 try, finally 사용
elm = WebDriverWait(browser, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="__next"]/div/main/div[4]/div/div[2]/div[2]/div[1]')) #browser에 대해 xpath값에 해당하는 element가 위치할 때 까지 최대 10초 동안 기다림
)
# 성공했을 때 동작 수행
####출력 방법 1
print(elm[0].text)
####출력 방법 2
for e in elm:
print(e.text)
finally :
browser.quit()
이미 적혀있지만 다시 설명하자면,
- WebDriverWait(browser, 10) : 브라우저에 대해 10초 동안 기다림 (최대 10초)
- .until(EC.presence_of_all_elements_located() : elements 가 위치할 때 까지 기다림
- (By.XPATH, '원하는 부분의 xpath') : 해당 xpath 값
- 즉, browser에 대해 xpath값에 해당하는 element가 위치할 때 까지 최대 10초 동안 기다림
- 주의할 점 ! By.XPATH값 넣을 때, 괄호 2번 감싸기
10초 초과하게 되면 error 발생. error 없애기 위해 보통 try를 사용하고, error 나면 바로 종료시키기 위해 finally 사용
출력 부분 2가지 방법:
print(elm.text) 로 했더니, 진행 안됨.
- print(elm[0].text)
첫 번째 텍스트 출력을 의미하는 [0]을 추가 입력 - for e in elm:
print(e.text)
elm에 나온 값을 for를 통해 모두 출력

'공부 & 프로젝트 > 파이썬' 카테고리의 다른 글
| [파이썬] 웹크래핑 기초 3-1 : BeautifulSoup4 기본 (0) | 2025.10.20 |
|---|---|
| [파이썬] 웹스크래핑 기초 5-4: Selenium 동적 페이지 웹스크래핑 (0) | 2025.10.20 |
| [파이썬] 웹크래핑 기초 5-2: Selenium 심화 - 로그인 (0) | 2025.10.20 |
| [파이썬] 웹스크래핑 기초 5-1: selenium 기본 (0) | 2025.10.18 |
| [파이썬] 웹스크래핑 기초 2: Requests, 정규식, User Agent (0) | 2025.10.17 |