데이터과학 삼학년

[크롤링] selenium implicitly Wait VS Explicitly Wait 본문

Natural Language Processing

[크롤링] selenium implicitly Wait VS Explicitly Wait

Dan-k 2022. 5. 31. 19:29
반응형

selenium은 브라우저를 직접  띄워 크롤링을 하는 도구이다.

즉, 브라우저를 띄우고, 브라우저가 온전히 다 로딩된 이후에 크롤링을 해야 내가 원하는 정보를 긁어올 수있다. implicitly Wait과 Explicitly Wait은 웹이 완전히 로딩될때까지 기다리는 도구이다.

단순히, 일정 n초를 기다리려면 sleep을 이용해서 기다릴 수 있지만, 일정 시간을 무조건 기다려야한다는 점에서 비효율적이라 위의 selenium에서 제공하는 wait를 사용한다.

 

implicitly Wait VS Explicitly Wait

- 보통 셀레니움을 이용해 웹 정보를 가져오는 것은 아래와 같음

- driver.get(‘https://pythondocs.net’) -> 파이썬은 셀레니움에 요청 -> 셀레니움은 브라우저에 url 을 이동 ->  브라우저는 pythondocs 서버로 웹페이지를 보여달라는 신호 ->  html, css, 자바스크립트라는 언어로 된 웹페이지 정보를 나의 브라우저 받음

- 브라우저는 수신한 언어를 사람들의 눈에 보기 좋은 화면으로 변환(render, 렌더)해서 브라우저 화면으로 보여줌

- implicitly wait : (웹페이지 전체가 넘어올때까지 기다리기) 웹페이지가 모두 열릴때까지 기다림(설정한 시간 이내에 웹페이지가 넘어오면 조기 종료됨

- explicitly wait : (웹페이지의 일부분이 나타날때까지 기다리기) 내가 원하는 정보가 로딩될때가지 선택적으로 기다림 

 

기본적으로 물리적인 시간을 기다리는 명령어는 time.sleep 이다.

from time import sleep
from selenium import webdriver

driver = webdriver.Chrome('chromedriver.exe')
sleep(1) #1초간 기다림

 

Implicitly Wait

from selenium import webdriver

driver = webdriver.Chrome('chromedriver.exe')
driver.implicitly_wait(10)

- 페이지 이동등의 명령어를 줬을 때 다음 웹페이지가 넘어올때까지 기다리라는 뜻

- 괄호 안에 숫자의 의미는 10초동안 웹페이지가 로딩될때까지 기다리고 10초가 넘어가면 웹페이지가 로딩이 됐던 안됐던 다음 명령어를 실행하겠다는 것

- 페이지가 넘어오기까지 최대 10초까지 기다리겠다는 의미이지 요청하고나서 무조건 10초를 기다리겠다는 것이 아님

 

Explicitly Wait

- 어떤 사이트에 접속을 하면 전체 페이지의 일부분이 먼저 나오거나 늦게 나오는 경우가 있음

- 예를 들어 우리는 임플리시틀리 웨이트를 10초로 설정해놓았다. 그런데 웹페이지가 1초만에 넘어왔다면 1초 후에 다음 명령어를 실행하는데,  웹페이지는 1초만에 넘어왔는데 넘어온 웹페이지의 일부분이 자바스크립트로 구현되어 있어서 그 일부분이 화면상에서 렌더링 되느라 비교적 늦게 브라우저에 표시되었다고 가정하자.

(이런 경우는 우리가 온라인상에서 흔하게 볼 수 있다. 어떤 블로그를 방문하였는데 블로그 내용이 먼저 보이고 몇초 후에 광고가 나타나는 경우가 이를 설명하는 좋은 예일 수 있겠다.)

- implicitly wait를 충분히 설정하더라도  웹페이지가 넘어오는 순간 다음 명령어가 실행되어 버릴 것이고 웹페이지는 넘어왔으나 일부 자바스크립트의 내용이 렌더링 되기도 전에 그 다음 명령어가 작동이 되어버린다면 제대로 된 수집이 불가능 함

- 이러한 문제를 해결하기 위해서 explicitly wait가 존재, 필요한 부분이 표시될때까지 기다려라! 를 의미

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

driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://pythondocs.net")

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "idname")))

- search 방법

(By.ID, ‘아이디이름’)
(By.CLASS_NAME, ‘클래스명’)
(By.XPATH, ‘xpath경로’)
(By.NAME, ‘네임명’)
(By.CSS_SELECTOR, ‘CSS셀렉터’)
(By.PARTIAL_LINK_TEXT, ‘링크텍스트일부분’)
(By.LINK_TEXT, ‘링크텍스트(전부일치)’)

- expected_conditions 종류

EC.title_is(...)
EC.title_contains(...)
EC.presence_of_element_located(...)
EC.visibility_of_element_located(...)
EC.visibility_of(...)
EC.presence_of_all_elements_located(...)
EC.text_to_be_present_in_element(...)
EC.text_to_be_present_in_element_value(...)
EC.frame_to_be_available_and_switch_to_it(...)
EC.invisibility_of_element_located(...)
EC.element_to_be_clickable(...)
EC.staleness_of(...)
EC.element_to_be_selected(...)
EC.element_located_to_be_selected(...)
EC.element_selection_state_to_be(...)
EC.element_located_selection_state_to_be(...)
EC.alert_is_present(...)

 

참고

https://pythondocs.net/selenium/%EC%85%80%EB%A0%88%EB%8B%88%EC%9B%80-wait-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-implicitly-wait-vs-explicitly-wait/

 

셀레니움 wait 개념 이해하기 (implicitly wait VS explicitly wait) - 뻥뚫리는 파이썬 코드 모음

이 문서는 셀레니움 wait 에 관한 implicitly wait 와 explicitly wait 에 대해서 다루고 있습니다. 셀레니움 사용법 전반에 대해서 알아보시려면 셀레니움 크롤러 기본 사용법을 확인하시기 바랍니다. 목

pythondocs.net

 

728x90
반응형
LIST
Comments