일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- session 유지
- requests
- Counterfactual Explanations
- XAI
- API
- correlation
- gather_nd
- flask
- Retry
- TensorFlow
- top_k
- youtube data
- chatGPT
- subdag
- hadoop
- tensorflow text
- airflow subdag
- login crawling
- 상관관계
- BigQuery
- 공분산
- 유튜브 API
- spark udf
- GCP
- Airflow
- grad-cam
- integrated gradient
- GenericGBQException
- API Gateway
- UDF
- Today
- Total
데이터과학 삼학년
[크롤링] selenium implicitly Wait VS Explicitly Wait 본문
[크롤링] selenium implicitly Wait VS Explicitly Wait
Dan-k 2022. 5. 31. 19:29selenium은 브라우저를 직접 띄워 크롤링을 하는 도구이다.
즉, 브라우저를 띄우고, 브라우저가 온전히 다 로딩된 이후에 크롤링을 해야 내가 원하는 정보를 긁어올 수있다. 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(...)
참고
'Natural Language Processing' 카테고리의 다른 글
[크롤링] 로그인이 필요한 웹사이트 크롤링 방법(feat. requests) (0) | 2023.03.20 |
---|---|
PMI(Pointwise Mutual Information); 점별 상호 정보량 (0) | 2022.11.27 |
[크롤링] What is the differences between requests and selenium? (0) | 2022.05.27 |
ROUGE : text summarization metric (0) | 2022.05.09 |
TextRank for Text Summarization (0) | 2022.05.04 |