[WebCrawling] Selenium 라이브러리

MINJEE·2023년 12월 8일
0

SMHRD_5_WebCrawling

목록 보기
4/4
post-thumbnail

Selenium

: 웹 애플리케이션을 자동화하기 위한 도구/라이브러리

◉ Selenium 기능

기능

  • 웹 브라우저를 제어
    • 사용자가 브라우저를 조작하는 것과 같은 방식으로 웹 페이지에 액세스하고 데이터를 수집
    • 사람이 조작하듯, 컴퓨터가 웹을 조작
    • 웹 페이지의 요소를 찾아 조작하는 기능을 제공
    • 웹 페이지의 뒤로 가기, 앞으로 가기, 새로고침 등과 같은 페이지 제어 작업도 수행
  • 웹 드라이버 (Web Driver)
    • 다양한 브라우저를 자동으로 제어하기 위해 웹 드라이버를 사용
    • 웹 브라우저와 통신하여 웹 페이지를 조작하는 역할
    • 웹페이지 자동 동작을 가능하게 해줌
    • beautifulsoup의 정적 한계를 해결
    • Chrome Driver : chrome browser를 제어하기 위한 driver
      • [크롬] - […]선택 - [도움말] - [크롬정보] 에서 버전 맞는 드라이버 설치
      • 사용자의 jupyter notebook 폴더 내부에 넣었는지 확인 필요
        (웹 드라이버를 사용하는 파이썬 파일과 동일한 폴더에 위치시키기!!)
      • 크롬드라이버 설치 : https://chromedriver.chromium.org/downloads

beautifulsoup과의 공통점과 차이점

공통점 : 모두 웹 스크래핑과 웹 데이터 추출에 사용되는 파이썬 라이브러리
차이점 :

BeautifulSoupSelenium
정적데이터만 수집 가능동적데이터 수집 가능
속도 빠름속도 느림
HTML 및 XML문서를 파싱웹 브라우저 자동화에 특화
부분 자동화 (Requests 이용)브라우저를 통한 연속적 접근 가능 (Chrome Driver 이용)
웹 페이지의 정적인 구조를 분석하여 데이터를 추출웹 브라우저를 자동으로 제어하여 동적인 작업을 수행

정리하자면,
BeautifulSoup은 정적인 웹 페이지의 HTML 코드를 파싱하여 데이터를 추출하는 데 사용되는 라이브러리
Selenium은 웹 브라우저를 제어하여 동적인 웹 페이지에서 데이터를 추출하거나 상호작용하는 데 사용되는 라이브러리


◉ selenium 준비 작업

selenium모듈 설치

! pip install selenium

필요한 Library Import

# 라이브러리 import
from selenium import webdriver # 컴퓨터용 브라우저 할당
from selenium.webdriver.common.keys import Keys # 컴퓨터용 키보드 할당 (Keys는 대문자'K')
    # 컴퓨터에게 물리적인 키보드가 없어서, 키 입력이 가능한 키보드를 선사
from selenium.webdriver.common.by import By # 구분자 역할
from selenium.webdriver.common.action_chains import ActionChains # 웹 애플리케이션에서 마우스 및 키보드 동작을 시뮬레이션하기 위해 사용

Chrome창 열기 + url 접속

driver = webdriver.Chrome() # 크롬창 열기 (= 웹드라이버 초기화)
driver.get(url) # url에 접속하기

◉ 웹 브라우저 기능

  • 요소 선택
    • driver.find_element(By.구분자, '구분자에 따른 선택경로') : 요소 1개 선택
    • driver.find_elements(By.구분자, '구분자에 따른 선택경로') : 요소 2개이상 선택 → 결과는 리스트형태
    • 구분자는 밑에서 설명 !
  • driver.back() : 이전 페이지로 이동 (뒤로 가기)
  • driver.foward() : 다음 페이지로 이동
  • driver.maximize_window() : 현재 창을 최대화
    • 웹페이지가 축소될 경우, html구조변경 일어날 수 있음
      → 최대한 최대창으로 진행하는 것을 권장!
  • driver.refresh() : 페이지 새로고침
  • driver.close() : 현재 열려있는 창 닫기
  • driver.quit() : 현재 열려있는 창을 닫고, 모든 webdriver 인스턴스와 관련된 모든 창, 탭, 프로세스, 메모리를 종료

◉ 요소 선택 관련 기능

구분자 종류, 경로

  • By.XPATH, 'XPath 경로'
  • By.TAG_NAME, '태그이름'
  • By.ID, 'id속성값'
  • By.CLASS_NAME, 'class속성값'
  • By.CSS_SELECTOR, 'CSS 선택자 경로'

선택한 요소에 작업 가능한 기능

  • 선택요소.text : 선택요소의 내용(contents)부분 출력
    • 태그 사이의 내용 부분을 모두 출력
    • 태그 안의 태그가 있으면, 선택한 요소(태그)의 안의 모든 태그의 내용을 출력
  • 선택요소.get_attribute(’속성’) : 선택요소의 시작태그 내의 해당속성의 값 출력
  • 선택요소.click() : 선택요소를 마우스로 클릭
  • 선택요소.send_keys('내용') : 선택요소에 내용 입력
  • 선택요소.send_keys(Keys.키보드키) : 선택요소에 키보드에 있는 키를 누름

Keys 클래스의 키

  • Keys.ENTER : Enter키
  • Keys.RETURN : Enter키
    • 텍스트 필드에서 엔터를 입력하거나 양식을 제출하는 동작을 자동화할 때 사용
  • Keys.TAB : Tab키
    • 주로 다음 입력 필드로 이동하거나 다음 포커스를 설정하는 동작을 자동화할 때 사용
  • Keys.ESCAPE : ESC키
    • 주로 모달 창을 닫거나 특정 동작을 취소하는 동작을 자동화할 때 사용
  • Keys.END : End키
    • 텍스트 입력 필드나 문서의 끝으로 커서를 이동할 때 사용
    • body 요소 선택 후 End키 누르면 스크롤이 끝까지 내려감

참고사항
send_keys를 이용하여 선택요소에 내용과 키를 같이 사용 가능하다
예를 들어,
선택요소.send_keys('hi') : hi를 선택요소에 입력
선택요소.send_kdys(Keys.ENTER) : Enter키 누름
선택요소.send_keys('hi' + Keys.ENTER) : 선택요소에 hi를 입력하고 Enter키를 누름


◉ Action Chain

: Selenium에서 제공하는 동작 체인을 구성하는 클래스
마우스 및 키보드 동작을 연속적으로 수행하거나 복잡한 상호작용을 자동화 가능

사용 순서
1. ActionChains 객체 생성
2. 원하는 기능들을 동작 체인 구성
3. 동작 체인 실행하여 기능들을 모두 실행

ActionChains 객체 생성

driver를 통해 액션을 만든다고 선언을 먼저 해줘야 한다.

  • action = ActionChains(driver) : ActionChains 객체 생성

동작 체인 구성

  • action.move_to_element(선택요소) : 마우스 커서를 선택요소 위로 이동
  • action.click(선택요소) : 마우스로 선택요소를 클릭
    • 선택요소 생략 시, 현재 마우스 위치에서 클릭
  • action.double_click(선택요소) : 마우스로 선택요소를 더블 클릭
  • action.context_click(선택요소) : 선택요소를 마우스 오른쪽 클릭
    • 선택요소 생략 시, 형재 마우스 위치에서 우클릭
  • action.drag_and_drop(선택요소1, 선택요소2) : 선택요소1를 선택요소2로 드래그 앤 드롭하는 동작을 수행

동작 체인 실행

  • action.perform() : 저장된 모든 작업 수행

◉ Selenium과 관련된 기타 기능들

tqdm 라이브러리

: 진행상황을 progress bar로 시각화해주는 라이브러리
  • 라이브러리 Import : from tqdm import tqdm
  • 사용방법 : for loop에서 for i in tqdm(리스트/튜플/문자열): 의 형식으로 사용

예외 처리 : try - except

try:
	실행할 코드
except:
	예외 발생 시 처리할 코드

예시 : 더보기 란이 있으면 클릭하고 없으면 클릭완료 출력

try:  # 아래 블럭의 코드를 실행해봐
while True :     #(이 조건이 참일때)(더보기 버튼이 있을 때)
	btn = driver.find_element(By.XPATH, '//*[@id="btn_more"]/span/a') # 더보기 버튼 선언
    btn.click() # 더보기 버튼 클릭
    time.sleep(2) # 지연시간 2초
    # 여기까지 더보기 버튼이 계속 있다면, 클릭을 해주면서 계속 반복함
    
except : # 예외의 경우 (더보기 버튼이 없는 경우)
	print('더보기 클릭 완료. 계속 진행합니다.') # '클릭 완료' '계속 진행합니다' 라는 문구를 출력

os 라이브러리

: 운영체제와 상호작용을 하게 해주는 라이브러리
import os
os.getcwd() # 현재 작업중인 경로
os.listdir() # 현재 경로에 있는 파일/디렉토리 목록
os.path.isdir('디렉토리 경로') # 경로에 디렉토리(폴더)가 있으면 True, 없으면 False
os.path.isfile('파일 경로.확장자') # 경로에 파일이 있으면 True, 없으면 False
os.mkdir('디렉토리 만들 경로/디렉토리명') # 경로에 지정한 이름의 디렉토리 생성

예시 : Pokemon이라는 폴더가 없으면 생성해라

if not os.path.isdir('/Users/스마트 인재개발원/5_WebCrawling/Pokemon'):
	os.mkdir('/Users/스마트 인재개발원/5_WebCrawling/Pokemon')
  • 파일과 폴더의 생성/삭제 등 파일 관리에 좀 더 중점

urlretrieve 라이브러리

: 인터넷에서 파일을 다운로드 하고, 로컬파일시스템에 저장해주는 라이브러리
from urllib.request import urlretrieve
urlretrieve('url', '경로/파일명.확장자') # url에서 다운받은 파일을 지정 경로의 파일명으로 저장
profile
개발, 분석 배운 내용 정리하기!

0개의 댓글