본문으로 바로가기

파이썬 셀레늄(selenium) 기다리기

category Language/Python 2019.04.27 04:36

셀레늄을 왜 쓰냐면 그냥 http request를 보내면 데이터가 오기전에 크롤이 끝나버린다.
그래서 내가 원하는 데이터는 오지 않고 껍데기만 오는 경우가 많다.
원하는 데이터가 로딩될때까지 기다렸다가 크롤링 하기 위해서 셀레늄을 쓴다.

다음 코드는 인스타그램에 '발레'라는 해쉬태그를 검색한 페이지를 크롤하는 코드이다.

import os
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# rootPath = os.path.split(os.environ['VIRTUAL_ENV'])[0]
rootPath = ".."
chrome_options = Options()
# chrome_options.add_argument("--headless")
driver = webdriver.Chrome(
    executable_path="{}/chrome/chromedriver".format(rootPath),
    options=chrome_options
)

url = "https://instagram.com/explore/tags/발레"
driver.get(url)

wait = WebDriverWait(driver, 2)
wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".EZdmt"))
)
pageString = driver.page_source
print(pageString)
driver.close()
wait = WebDriverWait(driver, 2)
wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".EZdmt"))

위 로직이 특정 css 셀렉터가 나올때까지 기다리는 코드이다.
이 코드를 쓰려면 여러가지 라이브러리가 필요하다.

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

WebDriverWait, EC, By 이렇게 세가지가 있어야 한다.


댓글을 달아 주세요