활용3. 웹스크래핑(0825-0829)/selenium

웹스크래핑3 셀레니움 1 네이버 항공권 WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, xpath_str)))

나도초딩 2022. 8. 29.

삽질

기존 강의로 꾸역꾸역 따라하다가, 변화된 것이 많아서 울고 있다가,

2022버전으로 업데이트 강좌가 있어서 진행할 수 있었다.

하기 예제에서 xpath 추출 시, find_element"s" 로 배열로 추출할 경우, 배열값이 [0] 이 아닌, [1]도 있을 수 있으므로, xpath 절대경로를 사용하는 것이 좋겠다.

단, 예제대로 따라하면, xpath 경로 추출시, text 포함, 일치의 조건 사용방법을 익힐 수 있었다.

나도코딩님은 강의 천재야... 난이도가 분명히 올라갔는데, 슬쩍슬쩍 할 수 있을만큼 올라간다. +_+

 

키포인트

  • 클릭 후, 로딩되기 전까지 기다리기
  • find_element(By.XPATH, '//button[text() = "가는 날"]') # (By.XPATH, '//button[ 추출조건 ]')
  • find_element(By.XPATH, '//button[contains(text(), "가는"]')
  • time.sleep(1)
  • from selenium.webdriver.support import expected_conditions as EC
  • WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, xpath_str)))
  • XPATH 클래스명으로 가져오기 : ((By.XPATH, '//div[@class="클래스명"]'))
  • print(elem.text)
def wait_until(xpath_str):
	WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, xpath_str))) #튜플

wait_until('//b[text() = "27"]')
day27 = browser.find_elements(By.XPATH, '//b[text() = "27"]')
day27[0].click()

네이버 항공권 (2022 예제)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def wait_until(xpath_str):
    WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, xpath_str)))

browser = webdriver.Chrome()
browser.maximize_window()
browser.get("https://flight.naver.com/")

# browser.find_elemnet_link_text("가는 날").click()
# <a href="" 라면... _link_text / class 가 있다면, button class 는 안되나??--> 이름에 공백 때문?
# begin_date = browser.find_element(By.CLASS_NAME, 'tabContent_option__2y4c6 select_Date__1aF7Y')
begin_date = browser.find_element(By.XPATH, '//button[text() = "가는 날"]')
begin_date.click()

time.sleep(1) # 대기 time.sleep() 사용->expected_conditions -> 함수로
day9 = browser.find_element(By.XPATH, '//*[@id="__next"]/div/div[1]/div[9]/div[2]/div[1]/div[2]/div/div[3]/table/tbody/tr[2]/td[6]/button') #element's'
day9.click()
# day9 = browser.find_elements(By.XPATH, '//b[text() = "9"]') #element's'
# day9[0].click # 9일이 지나간 일자라면, [0]이 아님.--> xpath 전체 경로가 낫다
# 하지만, 절대경로를 사용하고, 날짜가 지나면, xpath 경로가 금방 바뀔 것이다.
# print(len(day9))
WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, '//b[text() = "16"]')))
day16 = browser.find_elements(By.XPATH, '//b[text() = "16"]')
day16[1].click() # 월 선택은 눈으로 하고 있으니, 배열(월)을 눈으로 판단해서 배열을 선택

wait_until('//b[text() = "도착"]')
arrival = browser.find_element(By.XPATH, '//b[text() = "도착"]')
arrival.click()

wait_until('//button[text() = "동남아"]')
asia = browser.find_element(By.XPATH, '//button[text() = "동남아"]')
asia.click()

wait_until('//i[contains(text(), "DAD")]')
dad = browser.find_element(By.XPATH, '//i[contains(text(), "DAD")]')
dad.click()

# time.sleep(1)
# city_name.send_keys("다낭")
# time.sleep(1)
# browser.send_keys(Keys.ENTER)
# time.sleep(1)



# 항공권 검색 클릭
time.sleep(1)
search = browser.find_element(By.XPATH, '//span[contains(text() , "항공권")]') # ok
# search = browser.find_element(By.XPATH, '//span[contains(text(),"항공권 검색")])') # ok
# # search = browser.find_element(By.XPATH, '//*[@id="__next"]/div/div[1]/div[4]/div/div/button/span') #ok
search.click()

# elem = WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, '//div[@class="클래스이름"]')))
elem = WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, '//div[@class="concurrent_ConcurrentItemContainer__2lQVG result"]')))
# (()) 튜플!

print(elem.text)

browser.quit()

 

 

네이버 항공권 (구 예제)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


browser = webdriver.Chrome()
browser.maximize_window() # 창 최대화

url = "https://flight.naver.com/flights/"
browser.get(url) # url 로 이동

# 가는 날 선택 클릭
browser.find_element_by_link_text("가는날 선택").click()

# 이번달 27일, 28일 선택
# browser.find_elements_by_link_text("27")[0].click() # [0] -> 이번달
# browser.find_elements_by_link_text("28")[0].click() # [0] -> 이번달

# 다음달 27일, 28일 선택
# browser.find_elements_by_link_text("27")[1].click() # [1] -> 다음달
# browser.find_elements_by_link_text("28")[1].click() # [1] -> 다음달

# 이번달 27일, 다음달 28일 선택
browser.find_elements_by_link_text("27")[0].click() # [0] -> 이번달
browser.find_elements_by_link_text("28")[1].click() # [1] -> 다음달

# 제주도 선택
browser.find_element_by_xpath("//*[@id='recommendationList']/ul/li[1]").click()

# 항공권 검색 클릭
browser.find_element_by_link_text("항공권 검색").click()

try:
    elem = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='content']/div[2]/div/div[4]/ul/li[1]")))
    # 성공했을 때 동작 수행    
    print(elem.text) # 첫번째 결과 출력
finally:
    browser.quit()

# 첫번째 결과 출력
# elem = browser.find_element_by_xpath("//*[@id='content']/div[2]/div/div[4]/ul/li[1]")
# print(elem.text)

 

댓글