본문 바로가기
기술 이야기/기술 잡담

Python과 Selenium을 활용한 웹 크롤링 실습 - (1)

by 넌 꿈이 뭐야? 2023. 8. 28.

안녕하세요, 오늘은 Python과 Selenium을 활용한 웹 크롤링을 다뤄보도록 하겠습니다. 컴퓨터 비전을 주로 하는 제가 크롤링을 이토록 많이 하게 될 줄은 몰랐는데요... 많은 과제를 수행하다보니 크롤링 하는 방법 정도는 기본으로 알아야만 한다고 느낄 정도로 활용도가 높습니다. 대부분의 인터넷 페이지에서 내가 원하는 정보를 긁어올 수 있는 크롤링을 차근차근 설명 해보겠습니다.

 

참고로 이 글은 Python 환경설정은 하실 수 있다는 전제를 깔고 있습니다. 혹시 Python 설치부터 궁금하신 분은 wikiDocs를 참조하시면 쉽습니다 (크롤링은 Jupyter Notebook 환경이 압도적으로 편합니다).

그리고 이 포스팅의 환경은

  • Python 3.11
  • Selenium 4.11.2 (Selenium 4)
  • Windows 10 64-bit

입니다.

Selenium 설치

일단 Jupyter 환경으로 들어오셨다면 아래와 같이 Selenium과 우리에게 도움을 줄 패키지를 설치합니다.

# 느낌표(!)는 Jupyter에서 패키지를 설치할 때 필요한 커맨드입니다
!pip install selenium
# 우리는 Chrome을 사용할건데, 이 패키지를 설치하면 버전 관리를 손쉽게 할 수 있습니다
# https://github.com/SergeyPirogov/webdriver_manager
!pip install webdriver-manager

참 쉽죠? 이것으로 환경설정은 끝났습니다.

브라우저 시작

# 작업에 필요한 패키지를 불러옵니다
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

# Chrome 브라우저를 오픈합니다
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

이렇게 실행하면 크롬 브라우저가 실행됩니다.

웹사이트 탐험하는 방법

Chrome 기준으로 설명드리면,

  1. F12 또는 설정 --> More tools --> Developer tools (Ctrl + Shift + I)를 통해 개발자 도구를 조회
  2. (Ctrl + Shift + C)를 누르면 마우스 커서로 내가 원하는 영역의 정보를 조회할 수 있음

위에 빨간 버튼이 Ctrl + Shift + C의 역할. 저걸 누르고 브라우저 상에 내가 원하는 영역을 클릭하면 그림과 같이 내용을 확인할 수 있다

 

Selenium 기본 기능

이제 기본적인 몇가지 기능들을 소개하겠습니다.

사이트 하나를 잡고 설명을 드릴건데, 저는 로또를 좋아하니까 로또 사이트를 탐험하는 예제를 만들어 보겠습니다.

동행복권 메인 페이지에서 이번 회차 당첨번호 정보를 담은 부분. numView 아래로 당첨번호, 21, 26, ..., 31까지 모든 정보가 동일한 계층에 존재한다

# 동행복권 홈페이지 메인으로 접속 (get 함수)
driver.get('https://dhlottery.co.kr/common.do?method=main')

# 이번 회차 번호를 확인해보겠습니다
# find_element는 () 안의 조건에 맞는 요소 중 첫번째를 반환합니다
num_view = driver.find_element(By.ID, 'numView')

# numView 아래에 있는 모든 요소들을 리스트로 받습니다
# 그리고 find_elements는 조건에 맞는 모든 요소를 반환합니다
num_comp = num_view.find_elements(By.XPATH, "*")

# text는 해당 요소에 포함된 텍스트를 반환합니다
numbers = [c.text for c in num_comp[1:7]] 
bonus = num_comp[-1].text # 보너스 숫자도 빼먹으면 안됨
print(numbers, bonus) # [21, 26, 27, 32, 34, 42], 31

# 브라우저 뒤로가기
driver.back()

제 개인적으로는 가장 중요한 것이 find_element, find_elements 라고 생각합니다. 왜냐하면 특정 요소를 찾을 때 핵심적인 함수이기 때문입니다. 사용법은 아래와 같습니다 (공식 가이드)

find_element(By.ID, "id")
find_element(By.NAME, "name")
find_element(By.XPATH, "xpath")
find_element(By.LINK_TEXT, "link text")
find_element(By.PARTIAL_LINK_TEXT, "partial link text")
find_element(By.TAG_NAME, "tag name")
find_element(By.CLASS_NAME, "class name")
find_element(By.CSS_SELECTOR, "css selector")

동영상으로 설명하면 훨씬 편할텐데, 글로 설명하려니 굉장히 어렵습니다.

그래도 최대한 잘 작성해보겠습니다.

반응형

댓글