working_helen

[데이터 수집] selenium 웹데이터 크롤링 본문

TAVE/뿌스팅 project

[데이터 수집] selenium 웹데이터 크롤링

HaeWon_Seo 2023. 7. 4. 16:14

 데이터 수집 단계에서 학습한 내용 중 두번째로 selenium package를 활용한 웹데이터 크롤링에 대해 공부해본다.

 

1. Selenium이란?

2. Selenium 코드

1) 브라우저 페이지 열기
2) element 요소 찾기
3) 상호작용 및 데이터 추출
4) 키보드 입력
5) 브라우저 이동
6) 브라우저 응답 기다리기

 


1. Selenium이란?

  • requests 라이브러리로 웹 정보를 받고, BeautifulSoup로 정보 수집
  • Selenium 라이브러리로 브라우저를 열어 정보 수집

 파이썬에서 크롤링 작업은 크게 위 두가지로 나뉜다. Beautifulsoup의 경우 고정된 웹 페이지 내에서 정보 트리를 탐색하는 정적 크롤링 방식이다. 반면 Selenium의 경우 페이지의 이동이나 클릭(click)과 같은 동적 크롤링을 수행할 수 있다. 따라서 웹페이지를 이동하며 크롤링해야하는 경우, 혹은 버튼이나 조건 설정에 따라 같은 url 내에 여러 데이터가 숨겨져 있는 경우 Selenium을 이용해 크롤링하는 것이 유용하다.

 다만 request를 이용해 웹 정보를 들고오는 것이 Selenium으로 직접 브라우저를 여는 것보다 훨씬 빠르기 때문에 웹 페이지 조이 필요한 경우엔 Selenium을, 그렇지 않은 경우에는 requests와 BeautifulSoup을 사용하는 것이 일반적이다.

 

 

 

2. Selenium 코드

대표적인 Selenium 패키지 모듈들 (아래 외에도 여러가지가 있다.)

pip install selenium

from selenium import webdriver #webdriver로 브라우저를 연다.
from selenium.webdriver.common.by import By # html 요소를 탐색한다.
from selenium.webdriver.common.keys import Keys # 키보드 입력을 전달한다.
from selenium.webdriver import ActionChains #아이디 입력, 비밀번호 입력, 로그인 버튼 클릭 등 연속적인 동적 작업을 수행한다.
from selenium.webdriver.support.ui import WebDriverWait # 브라우저 응답을 기다린다.

 

1) 브라우저 페이지 열기

from selenium import webdriver

# 해당 url을 크롬 브라우저에 띄운다.
driver = webdriver.Chrome()
driver.get(url)

# 현재 url
print(driver.current_url)

 

2) element 요소 찾기

html의 요소 구분 속성(혹은 경로)으로 원하는 요소를 찾는다.

F12 키를 누르면 웹 html 화면 나옴 > 원하는 요소 클릭 > 'Copy'에서 속성에 따라 경로 복사

from selenium.webdriver.common.by import By

driver.find_element(By.경로 이름, '값')
html 경로 이름
ID : “id”
XPATH : “xpath”
LINK_TEXT : “link text”
PARTIAL_LINK_TEXT : “partial link text”
NAME : “name”
TAG_NAME : “tag name”
CLASS_NAME : “class name”
CSS_SELECTOR : “css selector”

- XPATH

: XML와 같은 마크업 언어에서 문장 속 요소나 속성에 접근하는 경로를 지정하는 언어로, 다시말해 XML 요소를 얻기 위한 접근 언어의 문법이다. 마크업 언어의 특성에 맞게 문서나 데이터의 경로 구조를 이용해 접근한다. 마크업 언어에 포함되는 HTML에도 적용되기 때문에 크롤링에서 요소를 찾는 과정에 유용하게 사용된다.

(위키백과) XPath(XML Path Language)는 W3C의 표준으로 확장 생성 언어 문서의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치하고 처리하는 방법을 기술하는 언어이다.

 

 

3) 상호작용 및 데이터 추출

get_attribute('속성 이름')을 이용해 요소 내부의 데이터를 수집할 수 있다. 특히 table 형태의 데이터의 경우, get_attribute('innerHTML')을 수행한 후 입력한 HTML을 pandas의 read_html 함수로 읽어주면 list의 0번째 index에서 Dataframe 형태의 table을 얻을 수 있다.

box = driver.find_element(BY.XPATH, 'xpath 경로 값')

# 요소 클릭
box.click()

# 텍스트 추출
box.title
box.text

# 링크 추출
box.get_attribute('href')

# table 추출
table_html = table.get_attribute('innerHTML')
df = pd.read_html(table_html)[0]

 

 

4) 키보드 입력

send_keys( ) 함수를 이용해 키보드 입력을 통한 작업을 수행할 수 있다.

※ send_keys( )가 받을 수 있는 KEY 목록 (https://greeksharifa.github.io/references/2020/10/30/python-selenium-usage/)

from selenium.webdriver.common.keys import Keys

# Enter 키 입력
box.send_keys(Keys.RETURN)
box.send_keys(Keys.ENTER)

 

5) 브라우저 이동

# 앞으로 가기 & 뒤로 가기
driver.forward() #앞
driver.back() #뒤

# 스크롤 이동 (document.body.scrollHeight이면 맨 마지막으로 이동)
driver.execute_script('window.scrollTo(0, 원하는 높이값);')

# 브라우저 닫기
driver.close() #현재 브라우저만 닫기
driver.quit() #모든 브라우저 닫기

 

6) 브라우저 응답 기다리기

동적 작업 중 브라우저 로딩이 아직 완료되지 않은 상태에서 다음 작업이 진행된 경우 'NoSuchElementException' 혹은 'ElementNotVisibleException'이 발생할 수 있다. 따라서 브라우저 페이지가 완전히 로딩될때까지 코드 진행을 기다려주는 과정이 필요하다.

- python 내 time 모듈 이용

import time
time.sleep(10) #10초 동안 코드 진행을 멈춘다.

- WebDriverWait, expected_conditions(EC) 모듈 이용 

  • Implicitly wait 암묵적 대기 : time모듈과 유사하게 정해진 시간만큼 대기하도록 설정한다. 한 webdriver에 영구적으로 작용한다.
  • Explicit Waits 명시적 대기 : 최대 기다림 시간을 설정하고, 그 시간 내에 주어진 조건이 만족되면 다음 작업을 수행한다. 시간 내 로딩이 되지 않으면 error를 발생시킨다.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 암묵적 대기
driver.implicitly_wait(time_to_wait=5)

# 명시적 대기
WebDriverWait(driver, 시간).until(EC method로 조건 설정)

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'abcd'))
        # 예시: class가 'abcd'인 요소를 찾으면 True, 아니면 Error
    )
finally:
    driver.quit()

 

 

 

Jupyter Notebook

이번 분석에서 사용한 selenium

- 크롬 브라우저로 '서울시 상권분석 서비스 지역별 현황' 웹페이지 열기

- 영역 버튼 click > 검색 버튼 click

- 원하는 행정구 버튼 직접 누른 후 해당 구 내 행정동들에 대한 데이터 table 크롤링

- 전체 dataframe에 각 구의 행정동 table을 concat

- 수집한 데이터

  • 소득/가구수, 신생기업 생존율, 인구수, 평균영업기간, 임대시세 5가지 항목
  • 2022년 기준 1~4분기 데이터 크롤링

 

 

 

 

Reference

https://greeksharifa.github.io/references/2020/10/30/python-selenium-usage/
https://velog.io/@agzg/WEBSelenium-%EC%82%AC%EC%9A%A9%EB%B2%95
https://deep-flame.tistory.com/27
https://m.blog.naver.com/chunsa0127/222048197119