Programming Language/Python

[Python] Selenium을 이용한 동적 크롤링

LeeJaeJun 2023. 12. 29. 10:25
728x90
반응형

- 정적 데이터와 동적 데이터의 차이

  • 정적 데이터: 한 페이지 안에서 원하는 정보가 모두 드러나는 것
  • 동적 데이터: 입력, 클릭, 로그인 등을 통해 데이터가 바뀌는 것

일반적인 크롤링으로는 정적 데이터(변하지 않는 데이터)만 수집할 수 있습니다.

 

 

- Selenium

셀리니움을 이용하면 정적 페이지와 동적 페이지를 모두 크롤링할 수 있지만 상대적으로 속도가 느립니다.

구분 정적 크롤링 동적 크롤링
사용 패키지 requests selenium
수집 커버리지 정적 페이지 정적 / 동적 페이지
수집 속도 빠름 상대적으로 느림
파싱 패키지 beautifulsoup beautifulsoup / selenium
  • 다양한 브라우저 및 플랫폼에서 웹 응용 프로그램을 테스트할 수 있게 해줍니다.
  • 웹 자동화 테스트 용도로 개발되어 실제 브라우저를 사용하고 페이지가 변화하는 것도 관찰이 가능하기에 동적 크롤링에 사용 가능합니다.
# chrome 기준
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager # 크롬 버전에 맞는 드라이버를 설치해줌
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# driver = webdriver.Chrome(ChromeDriverManager().install())

url = 'https://www.naver.com'
driver.get(url) # 드라이버는 현재 열려있는 창을 의미
driver.page_source # 현재 보고있는 페이지의 HTML 정보를 가져옴

# find_element를 통해 다양한 방법으로 엘레먼트에 접근할 수 있음
# By. 를 통해 어떠한 방법으로 엘레먼트에 접근할 지 선언
# LINK_TEXT의 경우 링크가 달려있는 텍스트로 접근
# .click()을 하면 해당 엘레먼트를 클릭
#driver.find_element(By.LINK_TEXT , value= '뉴스').click() # 브라우저 상에서 보이는 버튼, 검색창, 사진, 테이블, 동영상 등을 엘레먼트라고 함.


# 뒤로가기
#driver.back()

# 네이버 검색창 이용. id가 query. class가 search_input
driver.find_element(By.CLASS_NAME, value= 'search_input').send_keys('색깔없는과일 티스토리') # send_keys 내의 텍스트가 웹페이지에 입력됨
# 엔터키를 누르거나 돋보기 버튼을 누르면 검색이 될 것임.
# 돋보기 모양은 id가 search_btn, class가 btn_search
driver.find_element(By.CLASS_NAME, value= 'btn_search').send_keys(Keys.ENTER) # keys. 은 키보드에서 어떠한 동작을 수행하라는 의미. 여기서는 엔터키를 눌러라

driver.find_element(By.CLASS_NAME, value='box_window').clear() # 해당 입력한 부분이 지워짐
driver.find_element(By.CLASS_NAME, value='box_window').send_keys('네트워크')
driver.find_element(By.CLASS_NAME, value='bt_search').click() # 해당버튼을 클릭

# XPATH를 이용한 접근. XPATH란 HTML이나 XML 중 특정 값의 태그나 속성을 찾기 쉽게 만든 주소
# 원하는 부분에 대해 개발자도구에서 html영역을 찾고 마우스 우클릭 -> Copy -> Copy Xpath 
# driver.find_element(By.XPATH, value = '원하는 부분의 XPATH')

# 페이지 다운
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') # document.body.scrollHeight는 웹페이지의 높이. 따라서 웹페이지의 가장 하단까지 스크롤을 내리라는 자바스크립트 명령어임.
# driver.find_element(By.TAG_NAME, value = 'body').send_keys(Keys,PAGE_DOWN) 도 가능

# 스크롤을 한 번만 내리는 것이 아니라 모든 결과가 나올 때까지 내리는 동작을 실행
prev_height = driver.execute_script('return document.body.scrollHeight') # 현재 창의 높이를 저장
while True:
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
    time.sleep(2)
    curr_height = driver.execute_script('return document.body.scrollHeight')
    if curr_height == prev_height: # 페이지가 끝까지 내려왔을 때
        break
    prev_height = curr_height

# 모든 검색결과가 나타났으면 정적크롤링을 통해 크롤링을 할 수 있습니다. 기존의 방식을 이용해서 크롤링을 합니다.

# 그냥 실행하면 크롬 화면이 켜졌다가 프로그램이 종료되면서 바로 꺼지게 될 것입니다. 셀레니움 동작이 쓰레드를 통해 브라우저를 키는 방식이기에
# 프로세스가 종료되면 스레드가 종료되면서 같이 꺼집니다. 킨 상태로 더 페이지를 보기위해서는 sleep 등을 이용해 프로그래을 유지하면 됩니다.
time.sleep(1000)


driver.quit() # 페이지 닫기

동적페이지의 경우 셀레니움을 통해 웹페이지를 제어한 후에 기존의 크롤링처럼 원하는 부분을 추출합니다.

https://blog.naver.com/leebisu/223011184115

 

[파이썬 퀀트] 11강 - 셀레니움을 이용한 동적 크롤링 실습하기

blog.naver.com

 

728x90
반응형