이번 포스팅에서는 파이썬 웹자동화에 대한 네번째 글로 셀레니움 웹 크롤링, 셀레니움을 활용하여 데이터를 추출하고 정보 분석하는 방법에 대해 정리해보려고 합니다.
참고로 파이썬 웹자동화 기초에 대해서 셀레니움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>© 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 예시코드를 기반으로 데이터를 추출하는 방법에 대해 알아보았습니다.
앞선 포스팅에서 다룬 파이썬 코딩 및 프로그래밍 관련 글은 아래와 같습니다.