파이썬 웹자동화 (4) 셀레니움 웹 크롤링 (데이터 추출 및 정보 분석)

이번 포스팅에서는 파이썬 웹자동화에 대한 네번째 글로 셀레니움 웹 크롤링, 셀레니움을 활용하여 데이터를 추출하고 정보 분석하는 방법에 대해 정리해보려고 합니다.

참고로 파이썬 웹자동화 기초에 대해서 셀레니움4를 기반으로 아래와 같은 4가지 글로 구성하였습니다.

파이썬 웹자동화 (1) 셀레니움 설치 및 환경설정, 웹드라이버 자동설치
파이썬 웹자동화 (2) 웹 요소 선택 : 셀레니움 find_element 사용법
파이썬 웹자동화 (3) 셀레니움 화면조작 : 입력, 클릭 및 선택 방법
파이썬 웹자동화 (4) 셀레니움 웹 크롤링 (현재 포스팅)

웹 크롤링은 인터넷 상의 웹사이트에서 정보를 자동으로 수집하는 기술로, 웹 자동화 방법 중 하나 입니다. 웹 크롤링은 웹 사이트에서 데이터를 수집하고 분석하는 데 유용한 방법으로 사용되는데요, 대표적인 예시로는 검색 엔진이나 상품 가격 비교 사이트 또는 뉴스 기사 모음 등이 있습니다.

웹 크롤링을 수행하려면 크롤러나 스파이더 프로그램을 만들어야 하는데요, 크롤러나 스파이더 프로그램은 웹 페이지에서 필요한 데이터를 수집하기 위해 HTML 문서를 파싱하고, 웹 페이지에서 필요한 데이터를 추출하는 등의 작업을 수행합니다.

이를 위해 보통 BeautifulSoup이나 lxml 등의 파싱 라이브러리를 사용하는데요, 정적인 페이지가 아닌 동적의 페이지의 경우 속도는 느리더라도 웹 자동화가 가능한 셀레니움 웹 크롤링이 더 강점이 존재합니다.

이번 포스팅에서는 앞서 정리했던 셀레니움 사용방법을 활용하여 셀레니움 웹 크롤링 방법에 대해 정리하고 마무리하려고 합니다.

이를 위해 우선 셀레니움을 사용할 때 장점과 단점에 대해 알아보고, 셀레니움 웹 크롤링 방법에 대해 html 예시코드를 기반으로 데이터를 추출하는 방법에 대해 알아볼 예정입니다.


셀레니움 웹 크롤링 장점과 단점

BeautifulSoup이나 lxml 등의 파싱 라이브러리는 HTML 문서에서 데이터를 추출하는 데 사용되는 라이브러리로, 파이썬에서 많이 사용됩니다. 이들 라이브러리는 웹 페이지에서 데이터를 추출하기 위해 HTML 문서를 파싱하고, 웹 페이지에서 필요한 데이터를 추출합니다.

이러한 라이브러리는 일반적으로 정적인 웹 페이지에서 사용되며, 데이터 추출 속도가 빠르고 간단합니다. 그러나 JavaScript나 Ajax와 같은 동적 웹 페이지에서는 정상적으로 작동하지 않을 수 있습니다.

반면에, 셀레니움 웹 크롤링은 웹 페이지를 자동으로 조작하고, 웹 페이지에서 필요한 데이터를 추출하기 위해 사용되는 라이브러리입니다. 셀레니움 웹 크롤링은 브라우저를 자동화하므로, 정적인 페이지 뿐만 아니라 동적인 페이지에서도 작동하며, JavaScript나 Ajax와 같은 기술도 지원합니다. 또한, 셀레니움은 사용자 인터랙션을 통해 작동하기 때문에, 일부 사이트에서는 이를 감지할 수 있습니다.

따라서, 웹 페이지가 정적이고 간단하다면 BeautifulSoup이나 lxml과 같은 라이브러리를 사용하여 데이터를 추출하는 것이 간편하고 빠릅니다. 하지만, 동적이고 복잡한 웹 페이지에서는 셀레니움과 같은 웹 자동화 라이브러리를 사용하는 것이 더욱 효과적입니다. 또한, 셀레니움을 사용하면 브라우저를 자동화하므로, 사용자 인터랙션을 처리할 수 있고, 다양한 브라우저에서 작동할 수 있습니다. 그러나, 셀레니움을 사용하는 것은 BeautifulSoup이나 lxml과 같은 파싱 라이브러리를 사용하는 것보다 더욱 복잡하고 느릴 수 있습니다.


위의 내용을 정리하여 셀레니움 웹 크롤링 장단점을 정리하면 아래와 같습니다.

(장점) 다양한 데이터 수집: 셀레니움 웹 크롤링을 사용하면 HTML, JSON, XML 등 다양한 데이터 형식을 수집할 수 있습니다. 이는 웹 페이지에 나타나는 텍스트, 이미지, 동영상 등 다양한 자료를 수집할 수 있다는 것을 의미합니다.

(장점) 인터랙션 가능: 셀레니움을 사용하면 사용자가 웹 페이지를 조작하는 것처럼 마우스 클릭, 키보드 입력 등을 사용하여 인터랙션 작업을 수행할 수 있습니다.

(장점) 다양한 브라우저 지원: 셀레니움은 Chrome, Firefox, Safari, Opera 등 다양한 브라우저를 지원하므로, 다양한 플랫폼에서 크롤링 작업을 수행할 수 있습니다.

(단점) 웹 페이지의 로드 시간에 따른 대기 시간: 셀레니움 웹 크롤링은 웹 페이지의 로드 시간에 따라 대기 시간을 필요로 하기 때문에, 크롤링 작업이 느리게 진행될 수 있습니다.


셀레니움 웹 크롤링 방법

이번 세션에서는 셀레니움 웹 크롤링에 사용할 html 예시를 만들어보고 해당 html에서 셀레니움 웹 크롤링을 통해 정보를 추출하는 방법을 정리해보겠습니다.


예시 HTML 코드

예시로 사용할 HTML을 아래와 같이 구성하고 각 태그에 있는 데이터를 추출하는 셀레니움 웹 크롤링 코드를 만들어보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html>
<head>
    <title>IT매뉴얼 파이썬 셀레니움 활용 웹크롤링 예제</title>
</head>
<body>
    <div class=“header”>
        <h1>IT매뉴얼 파이썬 셀레니움 활용 웹크롤링 예제</h1>
        <ul>
            <li><a href=“#메뉴1”>메뉴1</a></li>
            <li><a href=“#메뉴2”>메뉴2</a></li>
            <li><a href=“#메뉴3”>메뉴3</a></li>
        </ul>
    </div>
    <div class=“main”>
        <h2>이 페이지는</h2>
        <p>IT매뉴얼 파이썬 셀레니움 활용 웹크롤링 예제 페이지 입니다.</p>
        <h2>IT매뉴얼</h2>
        <ul>
            <li>ITmanual.net은 스마트폰과 모바일앱, IT기기 관련 사용법과 노하우에 대한 내용을 문서화 해서 이해하기 쉽게 전달하려는 목적으로 운영하고 있으며 첫 사용자도 알기 쉽도록 정리해서 포스팅하고 있습니다.</li>
            <li>파이썬은 배우기 쉬운 문법 구조와 간결한 코드로 인해, 프로그래밍 입문자들이 쉽게 접근할 수 있는 언어입니다.</li>
            <li>셀레니움(Selenium)은 웹 브라우저 자동화 도구로, 웹 애플리케이션을 테스트하거나 스크래핑 등의 자동화 작업을 수행할 수 있습니다.</li>
        </ul>
    </div>
    <div class=“footer”>
        <p>&copy; 2023 IT매뉴얼</p>
    </div>
</body>
</html>

이 HTML에서는 헤더, 메인, 푸터 영역이 각각 ‘header’, ‘main’, ‘footer’ 클래스로 구분됩니다. header에는 li 태그로, main에는 li 태그로 마지막으로 footer에는 p 태그로 정보를 입력해두었습니다.

해당 HTML 코드를 웹 브라우저에서 실행하면 아래와 같이 나타납니다.

셀레니움 웹 크롤링

위와 같은 웹페이지를 셀레니움 웹 크롤링을 통해 데이터를 추출하는 코드를 만들어보겠습니다.


셀레니움 데이터 추출 방법

우선 셀레니움 라이브러리와 웹 드라이버를 로드합니다. 셀레니움 웹드라이버 자동 설치 방법 등은 앞선 포스팅을 참고할 수 있습니다.

from selenium import webdriver

driver = webdriver.Chrome('웹 드라이버 경로')

그 다음 아래와 같이 크롤링할 웹 페이지의 주소를 입력하고 접속합니다. (예 : driver.get(r’C:\IT매뉴얼\ITmanual_net_test.html’)

driver.get('웹페이지 주소')

앞서 정리한 HTML의 클래스와 태그 정보를 활용하여 셀레니움을 통해 각각의 항목을 가져오는 코드를 작성하면 아래와 같습니다.

참고로 find_element 문법 사용법에 대해서는 앞선 포스팅에 정리해두었습니다.

from selenium.webdriver.common.by import By

header = driver.find_element(By.CLASS_NAME, 'header')
menu = header.find_elements(By.TAG_NAME, 'a')

for item in menu:
    print(item.text)
    
main = driver.find_element(By.CLASS_NAME, 'main')
services = main.find_elements(By.TAG_NAME, 'li')

for item in services:
    print(item.text)

footer = driver.find_element(By.CLASS_NAME, 'footer')
print(footer.text)

위 코드에서 find_element(By.CLASS_NAME, ‘header’)는 ‘header’ 클래스를 가진 요소를 찾아서 header 변수에 저장합니다. header.find_elements(By.TAG_NAME, ‘a’)는 header 요소 내에서 ‘a’ 태그를 가진 모든 요소를 찾아서 menu 변수에 리스트 형태로 저장합니다. (참고로 22년 말 셀레니움4 로 업데이트 되면서 문법이 변경 되었습니다.)

그 다음, for문을 이용해 menu 리스트의 각 항목을 출력합니다.

마찬가지로 main 요소 내에서 ‘li’ 태그를 가진 모든 요소를 찾아서 services 변수에 리스트 형태로 저장합니다. for문을 이용해 services 리스트의 각 항목을 출력합니다.

마지막으로 footer 요소 내용을 출력합니다.

전체 코드를 정리하면 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from selenium import webdriver
from selenium.webdriver.common.by import By
 
# 웹 드라이버 로드
driver = webdriver.Chrome()
 
# 크롤링할 웹 페이지 접속
driver.get(r‘C:\IT매뉴얼\ITmanual_net_test.html’)
 
# 헤더 영역
header = driver.find_element(By.CLASS_NAME, ‘header’)
menu = header.find_elements(By.TAG_NAME, ‘a’)
 
for item in menu:
    print(item.text)
    
# 메인 영역
main = driver.find_element(By.CLASS_NAME, ‘main’)
services = main.find_elements(By.TAG_NAME, ‘li’)
 
for item in services:
    print(item.text)
 
# 푸터 영역
footer = driver.find_element(By.CLASS_NAME, ‘footer’)
print(footer.text)
 
# 웹 드라이버 종료
driver.quit()

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

셀레니움 웹 크롤링

이번 포스팅에서는 앞서 정리했던 셀레니움 사용방법을 활용하여 셀레니움 웹 크롤링 방법에 대해 정리하였습니다. 이를 위해 우선 셀레니움을 사용할 때 장점과 단점에 대해 알아보고, 셀레니움 웹 크롤링 방법에 대해 html 예시코드를 기반으로 데이터를 추출하는 방법에 대해 알아보았습니다.


앞선 포스팅에서 다룬 파이썬 코딩 및 프로그래밍 관련 글은 아래와 같습니다.

셀레늄, 셀레니움 문법 변경 및 에러 해결 3초 끝내기 (AttributeError 에러 해결)

[파이썬 x VSCODE 기초] ① 아나콘다 설치 및 가상환경 설정 3분 끝내기

Leave a Comment