안녕하세요, 오늘은 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 기준으로 설명드리면,
- F12 또는 설정 --> More tools --> Developer tools (Ctrl + Shift + I)를 통해 개발자 도구를 조회
- (Ctrl + Shift + C)를 누르면 마우스 커서로 내가 원하는 영역의 정보를 조회할 수 있음
Selenium 기본 기능
이제 기본적인 몇가지 기능들을 소개하겠습니다.
사이트 하나를 잡고 설명을 드릴건데, 저는 로또를 좋아하니까 로또 사이트를 탐험하는 예제를 만들어 보겠습니다.
# 동행복권 홈페이지 메인으로 접속 (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")
동영상으로 설명하면 훨씬 편할텐데, 글로 설명하려니 굉장히 어렵습니다.
그래도 최대한 잘 작성해보겠습니다.
반응형
'기술 이야기 > 기술 잡담' 카테고리의 다른 글
DPU(Data Processing Unit)이란? (0) | 2023.07.25 |
---|---|
[기술 잡담] 니어바이쉐어(Nearby Share) 사용법 - 핸드폰과 컴퓨터 파일 전송 방법 (0) | 2023.04.07 |
댓글