셀레니움(Selenium)을 활용하여 동적인 웹 사이트의 데이터를 크롤링하는 방법을 간단하게 설명하는 글이다.
프로젝트에 필요한 라이브러리와 의존성을 관리하기 위해, 먼저 가상 환경을 생성하고 활성화한다. PowerShell에서 다음 명령어를 실행한다.
python -m virtualenv venv
.\venv\Scripts\activate
가상 환경이 활성화된 후, 셀레니움과 크롬 드라이버 자동 설치를 위한 chromedriver_autoinstaller를 설치한다.
pip install selenium chromedriver_autoinstaller
셀레니움을 사용하여 네이버에서 "python flask"에 대한 검색 결과 중 특정 블로그 글의 랭킹을 찾는 과정은 다음과 같다.
from selenium import webdriver
from selenium.webdriver.common.by import By
import chromedriver_autoinstaller
import time
chromedriver_autoinstaller.install()
driver = webdriver.Chrome()
chromedriver_autoinstaller를 사용하여 크롬 드라이버를 자동으로 설치하고, 셀레니움 웹 드라이버를 초기화한다.
query = "python flask"
search_link = f"https://search.naver.com/search.naver?where=view&sm=tab_jum&query={query}"
driver.get(search_link)
time.sleep(2)
"python flask" 검색 결과 페이지로 이동한다.
target_blog_link = "https://blog.naver.com/surper_/223140462387"
link_selector = f'a[href^="{target_blog_link}"]'
페이지 내에서 특정 블로그 링크를 찾기 위해 CSS 선택자를 사용한다. 이 링크는 동적 요소이므로 페이지를 스크롤하여 랭크 정보가 로드될 때까지 기다린다.
element = driver.find_element(By.CSS_SELECTOR, link_selector)
while True:
new_element = element.find_element(By.XPATH, "./..")
rank = new_element.get_attribute("data-cr-rank")
if rank:
print("랭크 찾음 : ", rank)
break
element = new_element
블로그의 랭킹 정보를 포함하는 상위 요소를 찾기 위해 XPATH를 사용하여 부모 요소로 이동한다. data-cr-rank 속성에서 랭킹 정보를 추출한다.
for _ in range(7):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3)
만약 특정 요소를 찾지 못하면, 페이지를 더 스크롤하여 추가적인 데이터를 로드해야 할 수도 있다. 이를 위해 driver.execute_script 메소드를 사용하여 페이지 하단으로 스크롤한다.