반응형

파이썬, 셀레니움 옵션 최적화 스크롤링 예제 

 

글. 수알치 오상문 

 

Daum 사이트에 접속하여 '수알치'를 검색하고 수알치 블로그를 찾아서 블로그로 이동하는 예제이다.

시간 테스트를 해봤는데 일단 현재 옵션에서도 좋은 결과가 나오는 것 같다.  

크롬 브라우저를 동작하고 다른 옵션을 사용하지 않는 경우에 비해 시간은 30% 걸린 것 같다.

사용자 환경에 따라서 성능은 달라질 수 있지만, 이런 옵션을 적용하면 속도 향상에는 확실히 효과가 있다.

 

[참고] Chrome Webdriver를 Headless 모드로 실행하면 profile들이 적용되지 않는다는 글을 본 적 있는데, 실제로 이렇게 적용하고 실행해면 오류 메시지가 나오기는 하는데 크롤링에는 지장 없다.

 

#selenium options 예제
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# ----------
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from multiprocessing import Pool
import urllib.request
import pandas as pd
import time
import os
# -----------
options = Options()
# 웹브라우저 사용 안함
options.add_argument('headless')
# 창 크기 
options.add_argument('window-size=1920x3072')
# 전체 화면 
options.add_argument('--start-fullscreen')
# user-agent 설정하기
user_agent = "Mozilla/5.0 (Linux; Android 9; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.83 Mobile Safari/537.36"
options.add_argument('user-agent=' + user_agent)
# 이미지 로딩 금지
options.add_argument('--blink-settings=imagesEnabled=false')
# 음소거
options.add_argument('--mute-audio')
# 시크릿 모드 실행
options.add_argument('incognito')
# 속도 향상을 위한 옵션 해제 (10% 속도 향상?)
prefs = {
    'profile.default_content_setting_values': {
        'cookies': 2,
        'images': 2,
        'plugins': 2,
        'popups': 2,
        'geolocation': 2,
        'notifications': 2,
        'auto_select_certificate': 2,
        'mouselock': 2,
        'mixed_script': 2,
        'media_stream': 2,
        'media_stream_mic': 2,
        'media_stream_camera': 2,
        'protocol_handlers': 2,
        'ppapi_broker': 2,
        'automatic_downloads': 2,
        'midi_sysex': 2,
        'push_messaging': 2,
        'ssl_cert_decisions': 2,
        'metro_switch_to_desktop': 2,
        'protected_media_identifier': 2,
        'app_banner': 2,
        'site_engagement': 2,
        'durable_storage': 2}
    } 
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(options=options)  # Deprecation: chrome_options=options
start = time.time()
driver.get("https://www.daum.net")
el = WebDriverWait(driver, 10).until(
         EC.presence_of_element_located((By.XPATH, '//*[@id="q"]'))) 
try:
    el = driver.find_element(By.XPATH, '//*[@id="q"]')
    el.send_keys("수알치")
    el.send_keys(Keys.ENTER)
except Exception as e:
    print("Error:", e)
try:  # 수알치 블로그 클릭 
    el = WebDriverWait(driver, 10).until(
             EC.presence_of_element_located((By.XPATH,
                 '//*[@id="siteColl"]/div[2]/ul/li[1]/a/div[1]/span/span[2]')))
    el.click()
except Exception as e:
    print("Error:", e)
else:
    print("시간: %.2f초" %(time.time() - start))
    print("OK, 수알치 블로그!")
input("QUIT(press <Enter>): ")
driver.close()
driver.quit()

 

 

반응형

+ Recent posts