환경 : Windows 10 / Python 3.7.2
에디터 : Visual Studio Code
에디터 : Visual Studio Code
Seleninum 설치
먼저 pip 를 사용해 Selenium 모듈을 설치합니다.
pip install selenium
다음은 사용할 브라우저 드라이버를 다운로드 합니다. 다운로드 후 해당 드라이버를 실행할 경로에 넣어 줍니다. 이 포스트에서는 크롬 드라이버를 기준으로 설명합니다.
Chrome : https://sites.google.com/a/chromium.org/chromedriver/downloads
Firefox : https://github.com/mozilla/geckodriver/releases
Edge : https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox : https://github.com/mozilla/geckodriver/releases
Edge : https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
저는 다운로드 후 해당 폴더에 그대로 위치해 두었습니다.
Selenium 사용법
Selenium을 사용하기 위해서는 먼저 webdriver 모듈을 import 한 후 webdriver.Chrome() 을 호출하여 브라우져를 실행합니다. 브라우저를 실행하고 특정 웹사이트로 이동하기 위해 get() 메소드를 사용합니다.
from selenium import webdriver
driver = webdriver.Chrome()
driver = driver.get("http://python.org")
이 과정에서 Chrome 메소드 호출에 대한 에러가 아래와 같이 발생한다면 조금전에 다운로드한 드라이버 경로를 입력해주어야 합니다. 사진 밑에 코드를 참조하세요.
드라이버가 설치된 경로 입력합니다.
driver = webdriver.Chrome(r'C:\Users\Administrator\Downloads\chromedriver.exe')
다음은 브라우저 사이즈, 크롬 시크릿, 창 사이즈, 로딩 설정 코드입니다.
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--incognito")
driver = webdriver.Chrome(r'C:\Users\Administrator\Downloads\chromedriver.exe',
chrome_options=chrome_options)
driver.set_window_size(1024,800)
driver.implicitly_wait(3)
driver.get('http://python.org')
ChromeOptions 메소드를 사용해 크롬 시크릿 옵션을 추가하며, 윈도우 설정을 하고 implicitly_wait 메소드를 사용해 브라우저가 웹 요소들이 로딩될 수 있도록 기다려줍니다.
implicitly_wait
Selenium WebDriver를 이용해 크롤링을 진행할 때 NoSuchElementException 에러를 간혹 볼 수 있는데, 이 에러는 아직 로딩이 되지 않은 엘리먼트 요소를 가져오려고 했기 때문입니다. 따라서 implicitly_wait(3) 코드 경우는 브라우저에서 최대 3초를 기다려 줍니다.
Explicitly wait
크롤링을 하면서 웹 사이트 로딩이 되는 시간을 알 수 없다거나, VPN 등 특정한 상황에서 로딩이 매우 느려진 경우 implicitly_wait 을 사용하면 설정해둔 시간을 넘을 수 있습니다. 이 과정에서 Exception이 발생하게 되며 작업이 중단될 수도 있는데요. Explicitly wait 은 이를 보완하기 위한 메소드로 특정 엘리먼트가 완전히 로드될때까지 기다려줍니다. 아래 코드를 통해 찾으려는 엘리먼트를 '10초'를 기다리도록 해줍니다.
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
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--incognito")
driver = webdriver.Chrome(r'C:\Users\Administrator\Downloads\chromedriver.exe',
chrome_options=chrome_options)
driver.set_window_size(1024,800)
driver.implicitly_wait(3)
driver.get('http://python.org')
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "About"))
)
element.click()