본문 바로가기

Code Snippets/파이썬

[파이썬-셀레니움] 셀레니움 속도 향상을 위한 5가지 팁

셀레니움으로 크롤링을 하다 보면 보다 빠르게 크롤링을 하고 싶을 때가 있다.

 

이 경우 아래 5가지 팁을 활용하면 속도를 향상시킬 수 있다.

 

1. 드라이버를 Headless로 만들기

 

셀레니움을 그냥 작동시키면 브라우져가 새로운 창에서 열리는 것을 볼 수 있다.

 

이 창이 없는 상태로 셀레니움이 돌아가는 것을 'Headless'라고 하는데,

이렇게 설정하면 속도를 향상시킬 수 있다.

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# headless 설정
chrome_options.headless = True

 

2. Pageload Strategy 설정 변경

 

셀레니움 드라이버의 설정에서 Pageload strategy를 변경하면 페이지가 완전히 로드되는 것을 기다릴 필요가 없다.

 

빨리 다음 화면으로 넘어갈 때 유용하다.

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities().CHROME
caps["pageLoadStrategy"] = "none"

# 원래 default는 caps["pageLoadStrategy"] = "normal"

 

 

3. time.wait(10) 대신 selenium의 wait, expected conditions 활용

 

셀레니움으로 Page Navigation을 하려면 내가 원하는 Element의 로딩이 완료될 때까지 기다려야하는 경우가 많다.

보통 time.wait(10) 등으로 고정된 시간을 기다리게 할 수 있지만,

내가 원하는 특정 element의 로딩이 끝나자마자 다음 동작을 수행하기 위해서는 wait, expected condition object를 활용하는 것이 유용하다.

 

로딩이 끝나면 click, send keys 등으로 다음 동작을 바로 수행할 수 있게 할 수 있다.

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

# 최대 10초 기다리라는 뜻
# 바로 이어서 send key method chaining.
wait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'textarea.commentWrite._use_keyup_event._messageTextArea'))).send_keys('o',Keys.CONTROL, Keys.RETURN)

 

4. send_keys 대신 execute_script 활용

 

보통 셀레니움으로 특정 문자를 입력하고 버튼을 클릭하는 동작을 수행한다.

그럴 때 가장 일반적으로 사용하는 method가 send_keys이다.

그런데 send_keys보다 직접 Javascript 코드를 이용해서 내가 원하는 객체의 속성을 바꿔주는 것이 더 빠르다.

 

## send keys 의 경우
element = wait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'textarea.commentWrite._use_keyup_event._messageTextArea')))
element.send_keys('o') 

## execute_scripts 의 경우
driver.execute_script("document.getElementsByTagName('textarea')[0].value='o'")

 

5. While Loop 대신 For loop 사용

 

셀리니움 내에서, 특정 조건을 만족시키는 경우에 다음 동작을 수행할 때 While loop를 많이 사용한다.

 

하지만 While Loop보다 For Loop를 사용할 경우, Loop가 돌아가는 속도가 더 빨라 특정 조건이 만족되는 시점을 더욱 빨리 포착할 수 있다.

 

## While loop
while True:
	if int(current_num) == target_num:
		break
	else:
		response = requests.get(url=url,headers=headers).json()
		current_num = response['result_data']
        
## for loop
for i in range(10000000000):
	response = requests.get(url=url,headers=headers).json()
	current_num = response['result_data']
    
	if int(current_num) == target_num:
		break