: 웹 애플리케이션을 자동화하기 위한 도구/라이브러리
공통점 : 모두 웹 스크래핑과 웹 데이터 추출에 사용되는 파이썬 라이브러리
차이점 :
BeautifulSoup | Selenium |
---|---|
정적데이터만 수집 가능 | 동적데이터 수집 가능 |
속도 빠름 | 속도 느림 |
HTML 및 XML문서를 파싱 | 웹 브라우저 자동화에 특화 |
부분 자동화 (Requests 이용) | 브라우저를 통한 연속적 접근 가능 (Chrome Driver 이용) |
웹 페이지의 정적인 구조를 분석하여 데이터를 추출 | 웹 브라우저를 자동으로 제어하여 동적인 작업을 수행 |
정리하자면,
BeautifulSoup은 정적인 웹 페이지의 HTML 코드를 파싱하여 데이터를 추출하는 데 사용되는 라이브러리
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()
: 현재 창을 최대화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.ENTER
: Enter키Keys.RETURN
: Enter키Keys.TAB
: Tab키Keys.ESCAPE
: ESC키Keys.END
: End키참고사항
send_keys를 이용하여 선택요소에 내용과 키를 같이 사용 가능하다
예를 들어,
선택요소.send_keys('hi')
: hi를 선택요소에 입력
선택요소.send_kdys(Keys.ENTER)
: Enter키 누름
선택요소.send_keys('hi' + Keys.ENTER)
: 선택요소에 hi를 입력하고 Enter키를 누름
: Selenium에서 제공하는 동작 체인을 구성하는 클래스
마우스 및 키보드 동작을 연속적으로 수행하거나 복잡한 상호작용을 자동화 가능
사용 순서
1. ActionChains 객체 생성
2. 원하는 기능들을 동작 체인 구성
3. 동작 체인 실행하여 기능들을 모두 실행
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()
: 저장된 모든 작업 수행: 진행상황을 progress bar로 시각화해주는 라이브러리
from tqdm import tqdm
for i in tqdm(리스트/튜플/문자열):
의 형식으로 사용try:
실행할 코드
except:
예외 발생 시 처리할 코드
예시 : 더보기 란이 있으면 클릭하고 없으면 클릭완료 출력
try: # 아래 블럭의 코드를 실행해봐
while True : #(이 조건이 참일때)(더보기 버튼이 있을 때)
btn = driver.find_element(By.XPATH, '//*[@id="btn_more"]/span/a') # 더보기 버튼 선언
btn.click() # 더보기 버튼 클릭
time.sleep(2) # 지연시간 2초
# 여기까지 더보기 버튼이 계속 있다면, 클릭을 해주면서 계속 반복함
except : # 예외의 경우 (더보기 버튼이 없는 경우)
print('더보기 클릭 완료. 계속 진행합니다.') # '클릭 완료' '계속 진행합니다' 라는 문구를 출력
: 운영체제와 상호작용을 하게 해주는 라이브러리
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')
: 인터넷에서 파일을 다운로드 하고, 로컬파일시스템에 저장해주는 라이브러리
from urllib.request import urlretrieve
urlretrieve('url', '경로/파일명.확장자') # url에서 다운받은 파일을 지정 경로의 파일명으로 저장