DL/NLP

[NLP] Selenium으로 데이터 수집

moonzoo 2024. 3. 6. 15:49

1. 개요

머신러닝, 딥러닝 모델 학습을 위해 데이터를 직접 수집하여 정제하는 작업은 ML Framework에서 필수적입니다.

 

그러나, 모든 데이터를 하나씩 수집하고 라벨링을 진행하는 것은 많은 비용이 소모됩니다.

 

그렇기 때문에 뉴스 기사, 상품 정보 등 웹페이지의 데이터를 수집할 때, 사용자가 수동으로 수행할 수 있는 모든 작업을 프로그래밍 방식으로 수행하여 비용을 최소화하는 것이 필요합니다.

 

대표적으로 웹페이지의 데이터를 수집하는 방법은 Beautifulsoup와 Selenium이 있습니다. 이 글에서는 Selenium에 대해 다뤄보도록 하겠습니다.


2. Selenium?

 

 

request와 Beautifulsoup를 사용해 데이터를 수집하는 방법은 셀레늄에 비해 실행 속도가 굉장히 빠르다는 장점이 있습니다. 그러나, 동적으로 데이터가 로드되거나, 사용자 인증이 필요하거나, 다양한 브라우저 환경을 지원해야 하는 복잡한 웹사이트의 데이터 수집 작업에 있어서는 Selenium을 사용하는 것이 좋습니다.

 

셀레늄(Selenium)을 데이터 수집에 사용하는 주요 이유는 다음과 같습니다:

  1. 웹 자동화 및 상호작용 기능: 셀레늄은 웹 브라우저를 자동화하여 사용자가 수동으로 수행할 수 있는 모든 작업을 프로그래밍 방식으로 실행할 수 있게 해줍니다. 이는 로그인, 폼 작성, 클릭, 스크롤 등의 동작을 포함합니다. 데이터 수집에 있어서 이러한 상호작용은 동적 웹페이지에서 데이터를 추출하는 데 특히 유용합니다.
  2. 다양한 웹 브라우저 지원: 셀레늄은 크롬(Chrome), 파이어폭스(Firefox), 사파리(Safari), 인터넷 익스플로러(Internet Explorer) 등 다양한 웹 브라우저와 호환됩니다. 이는 거의 모든 유형의 웹사이트에서 데이터를 수집할 수 있음을 의미합니다.
  3. 동적 컨텐츠 처리 능력: 많은 현대 웹사이트들은 자바스크립트(Javascript)를 사용하여 비동기적으로 콘텐츠를 로드합니다. 셀레늄을 사용하면 이러한 동적 웹사이트에서도 데이터를 수집할 수 있습니다. 셀레늄은 실제 브라우저에서 페이지를 렌더링하므로, 자바스크립트로 동적으로 생성되는 데이터도 포착할 수 있습니다.
  4. 개발자 친화적: 셀레늄은 Python, Java, C#, Ruby 등 다양한 프로그래밍 언어를 지원합니다. 이로 인해 개발자는 자신이 선호하는 언어를 사용하여 웹 스크래핑 도구를 만들 수 있습니다. 또한, 셀레늄은 사용하기 쉬운 API를 제공하며, 방대한 커뮤니티와 문서 덕분에 학습과 문제 해결이 용이합니다.
  5. 테스트 및 디버깅 용이성: 셀레늄은 원래 웹 애플리케이션의 테스트를 위해 개발되었습니다. 따라서, 스크립트를 단계별로 실행하고 웹페이지의 다양한 요소와 상호작용하면서 문제를 쉽게 식별하고 디버깅할 수 있는 기능을 제공합니다.

이러한 이유로 저는 복잡한 사이트에서 데이터 수집 작업을 할 때 Selenium을 주로 사용합니다.


3. 셀레늄 환경 설정

1. 셀레늄 설치

먼저, Python 환경에 셀레늄 패키지를 설치해야 합니다. 이는 pip를 사용하여 쉽게 설치할 수 있습니다.

pip install selenium

 

2. 크롬 드라이브 설치

크롬 화면을 열고 우측 상단의 점세개 -> 도움말 -> chrome 정보를 클릭하여 나의 크롬 버전을 확인합니다.

 

이 후, Chrome 브라우저의 버전과 일치하는 Chrome 웹 드라이버를 다운로드합니다.

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 114, please download ChromeDriver 114.0.5735.90 If you are using Chrome version 113, please download ChromeDriver 113.0.5672.63 If you are using Chrome version 112, please download ChromeDriver 112.0.5615.49

chromedriver.chromium.org

 

자신의 환경(Window, Linux, mac)에 맞는 zip을 다운로드하고, zip 파일의 압축을 풀어준 뒤 특정 경로에 지정해 둡니다.

프로젝트 폴더 와 비슷한 경로에 저장해 두면 좋습니다. 

 

그러나, 셀레늄 최신 버전에서는 굳이 구글 드라이브를 다운로드 받으실 필요가 없습니다. 

 

webdriver-manager라는 패키지를 통해 필요한 웹 드라이버를 자동으로 다운로드하고 관리해줄 수 있습니다.

즉, 크롬 드라이버를 수동으로 다운로드하고 경로를 설정하는 번거로움 없이 셀레늄을 사용할 수 있게 해줍니다.

pip install webdriver-manager
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

# ChromeDriverManager를 사용하여 크롬 드라이버 자동 관리
driver = webdriver.Chrome(ChromeDriverManager().install())

driver.get("http://www.example.com")

 

4. 데이터 수집 방법

여기까지 크롬 드라이버를 사용해 셀레늄을 실행하는 과정을 보여드렸습니다.

 

이제 셀레늄을 사용해 웹페이지의 정보를 크롤링을 진행해보겠습니다.

 

셀레늄(Selenium)을 사용하여 크롤링하는 과정에서는 웹 브라우저의 개발자 도구(Developer Tools)를 활용하는 것이 매우 중요합니다. 개발자 도구는 웹 페이지의 HTML 구조를 파악하고, 특정 웹 요소를 식별하는 데 도움을 줍니다. 이 과정은 셀레늄을 이용한 자동화된 크롤링이나 데이터 추출 작업의 기본이 됩니다. 아래는 개발자 도구를 사용해 셀레늄에서 크롤링하는 방법을 자세히 설명합니다.

 

1. 개발자 도구 열기

  • 대부분의 웹 브라우저에서는 웹 페이지에서 오른쪽 클릭을 한 후 "검사" 옵션을 선택하거나, 키보드 단축키 F12를 눌러 개발자 도구를 열 수 있습니다. (Ctrl + shift + i도 가능합니다.)

2. 웹 요소 식별하기

  • 개발자 도구 내에서 "Elements" 탭을 열어 웹 페이지의 HTML 구조를 볼 수 있습니다. 원하는 데이터가 위치한 웹 요소(예: 텍스트, 링크, 이미지 등)를 찾습니다.
  • 웹 요소 위에서 마우스 오른쪽 버튼을 클릭하고 "Copy" > "Copy selector" 또는 "Copy" > "Copy XPath"를 선택하여 해당 요소의 CSS 선택자 또는 XPath를 복사합니다. 이를 통해 셀레늄 스크립트에서 해당 요소를 정확하게 타겟할 수 있습니다.

3. 셀레늄 스크립트 작성

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

# ChromeDriverManager를 사용하여 크롬 드라이버 자동 관리
driver = webdriver.Chrome(ChromeDriverManager().install())

driver.get("http://www.example.com")
  • 셀레늄 스크립트에서 webdriver를 사용하여 웹 드라이버를 초기화하고, 웹 페이지를 엽니다.
element = driver.find_element(By.CSS_SELECTOR, "css_selector_here")
print(element.text)

element = driver.find_element(By.XPATH, "xpath_here")
print(element.text)

 

 

  • 셀레늄(Selenium) 4 버전부터는 find_element_by_* 메서드 대신 find_element 메서드와 By 클래스를 사용하는 방식을 권장합니다. 이 방식은 코드의 가독성을 높이고, 다양한 요소 선택자를 통일된 형식으로 사용할 수 있게 해줍니다.
By.ID 태그의 id값으로 추출
By.NAME 태그의 name값으로 추출
By.XPATH 태그의 경로로 추출
By.LINK_TEXT 링크 텍스트값으로 추출
By.PARTIAL_LINK_TEXT 링크 텍스트의 자식 텍스트 값을 추출
By.TAG_NAME 태그 이름으로 추출
By.CLASS_NAME 태그의 클래스명으로 추출
By.CSS_SELECTOR css선택자로 추출

 

이러한 방법을 통해 text나 image, pdf 파일까지도 저장할 수 있습니다.

 

이를 응용하면 for 구문과 자동화를 통해 페이지를 넘기거나 스크롤을 내리면서 데이터를 수집할 수 있습니다.

 

5. 마치며

저는 셀레늄을 사용하여 웹 페이지에서 반자동으로 크롤링하는 툴을 만들어 사용하고 있습니다. 

 

자동화된 툴을 만드는 것은 가능하나, 노이즈가 되는 데이터도 함께 크롤링하기 때문에 눈으로 거르고 수집을 진행하기 위함입니다. 사용 용도에 따라 커스터마이징하여 사용하시면 유용하실 것 같습니다.