본문 바로가기
프로그래밍_기타 언어

selenium 파이썬 스크래핑, 크롤링(Crawling)

by 떠도리c 2024. 9. 22.
반응형

selenium

selenium은  웹 애플리케이션 테스트를 위한 프레임워크이고,

selenium WebDriver를 통해 웹 브라우저를 제어하여 크롤링(스크래핑)을 진행합니다.

  • 크롤링(crawling) 혹은 스크래핑(scraping)은 웹 페이지를 그대로 가져와서 거기서 데이터를 추출 또는 제어하는 행위
    크롤링하는 소프트웨어를 크롤러(crawler)라고 부릅니다.
     
  • BeautifulSoup 라이브러리를 사용하여 스크래핑도 가능하나
    대부분의 웹 사이트는 자바스크립트 사용하여 동적인 정보를 표현하여 한계점이 있습니다.
     
  • 동적인 정보를 크롤링하기 위해 selenium을 많이 사용합니다.

크롤링과 스크래핑 차이

웹 크롤링과 웹 스크래핑은 모두 정보를 추출한다는 점에서 공통점을 지닙니다.

크롤링은 특정 웹 페이지를 목표로 하지 않습니다.
일단 탐색부터 하고, 정보를 가져옵니다.
'선탐색 후추출'

스크래핑을 할 때는 목표로 하는 특정 웹페이지가 있습니다.
정보를 어디서 가져올지 타겟이 분명하고, 그 타겟에서 정보를 가져옵니다.
'선결정 후추출'

웹 크롤링에서는 중복 제거가 필수적이라 웹 인덱싱(web indexing)이라고도 부르고,
웹 스크래핑에서는 중복 제거가 필수가 아닙니다.

selenium 설치 방법

selenium 설치

pip install selenium

Chrome WebDriver

크롬 브라우저로 크롤링을 하기 위해 Chrome WebDriver를 다운로드 받아야 합니다.

WebDriver는 크롬 브라우저 버전에 맞는 드라이버를 매번 다운로드 해야하는데,

크롬 브라우저 버전 체크와 드라이버 버전을 자동으로 다운로드 하는 방법은 아래 코드에서 참고 바랍니다.

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

코드 예제

아래 예제는 웹 페이지에 접근해 특정 카테고리 클릭을 수행하는 예제입니다.

from selenium import webdriver 
import chromedriver_autoinstaller 
from selenium.webdriver.common.by import By 
import time 


# 크롬 드라이버 버전 확인 및 WebDriver 설치 
chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0] 
try: 
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe') 
except: 
    chromedriver_autoinstaller.install(True) 
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe') 
driver.implicitly_wait(10) 


# 웹페이지 접근 경고 무시 
options = webdriver.ChromeOptions() 
options.add_argument('--ignore-ssl-errors=yes') 
options.add_argument('--ignore-certificate-errors') 


# 접속 
# 접근 할 주소 
URL = 'https://www.naver.com' 


# WebDriver를 통해 URL 접근 후 2초 기다림 
driver = webdriver.Chrome( 
    executable_path=f'./{chrome_ver}/chromedriver.exe', options=options) 
driver.get(url=URL) 
time.sleep(2) 


# 네이버 뉴스 카테고리 클릭 
driver.find_element( 
    By.XPATH, '//*[@id="NM_FAVORITE"]/div[1]/ul[2]/li[2]/a').click() 
time.sleep(2) 


# IT/과학 카테고리 클릭 
driver.find_element( 
    By.XPATH, '/html/body/section/header/div[2]/div/div/div[1]/div/div/ul/li[6]/a').click() 
time.sleep(2)


# WebDriver close or quit 사용
driver.close()

# 크롬 드라이버 버전 확인 및 WebDriver 설치
- 크롬 브라우저의 버전을 확인하고 버전에 맞는 WebDriver를 자동으로 다운로드 한다.

# 웹페이지 접근 경고 무시
- 웹 페이지 접근 시 인증서 이슈로 인한 보안 위험/경고 웹 페이지가 있는데 이 부분을 무시한다.

# 접근 할 주소
- URL 변수 값에 크롤링 할 주소를 입력한다.

# WebDriver를 통해 URL 접근 후 2초 기다림
- WebDriver를 통한 URL 접근 - time.sleep(2) - 이벤트 수행 후 2초 기다림

# 네이버 뉴스 카테고리 클릭
- 접근 URL에서 XPATH 값에 대한 이벤트를 수행
- time.sleep(2)
- 이벤트 수행 후 2초 기다림

# IT/과학 카테고리 클릭
- 접근 URL에서 XPATH 값에 대한 이벤트를 수행
- time.sleep(2)
- 이벤트 수행 후 2초 기다림

# WebDriver close or quit  사용
- WebDriver 종료 방식을 close 로 사용함

selenium element 종류

위 예제에서는 XPATH만으로 이벤트가 진행되도록 작성되어 있지만, XPATH 외 다른 element도 존재합니다.

XPATH로 이벤트 수행이 곤란한 경우도 발생하기 때문에 상황에 맞는 element를 사용하도록 해야 합니다.

  • driver.find_element(By.XPATH, '//button')
  • driver.find_element(By.ID, 'loginForm')
  • driver.find_element(By.LINK_TEXT, 'Continue')
  • driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti')
  • driver.find_element(By.NAME, 'username')
  • driver.find_element(By.TAG_NAME, 'h1')
  • driver.find_element(By.CLASS_NAME, 'content')
  • driver.find_element(By.CSS_SELECTOR, 'p.content')

웹 페이지에서 element 복사하는 방법

1. 웹 페이지에서 개발자 도구(f12 키 or 화면 우클릭 - 검사)로 이동

2. 아래 스크린샷과 같이 '요소 검사/선택 도구'를 이용하여 element 선택

3. 마우스 우 클릭 - Copy - 원하는 타입으로 복사

4. 코드에 붙여넣기
복사한 코드를 위에서 설명한 'selenium element 종류'에 맞는 타입으로 코드 작성

# XPATH 예시

driver.find_element(  
    By.XPATH, '/html/body/section/header/div[2]/div/div/div[1]/div/div/ul/li[6]/a').click()

참고 자료 - Selenium WebDriver Documentation

아래 사이트에 가시면 다양한 옵션 및 사용 예제, 기본 사용법 등 많은 자료를 얻을 수 있습니다.

Selenium Documentation

반응형