DL/NLP

[NLP] Selenium에서 Javascript 명령어 사용하기

moonzoo 2024. 3. 6. 16:13

1. 개요

파이썬 환경에서 셀레늄을 사용하여 데이터를 수집한 뒤, 전처리를 진행하는 것이 필수적입니다. 

 

그러나, 셀레늄에 요청을 하는 것은 많은 리소스를 소모하여 시간이 오래 걸립니다.

 

그래서 셀레늄(Selenium)에서 execute_script 메서드를 사용하여 자바스크립트(Javascript) 코드를 실행하여 데이터 수집 전에 전처리를 진행해 비용을 감소시킵니다.

 

이 방법은 셀레늄의 기본 API만으로는 해결하기 어려운 특정 작업들을 수행할 수 있게 해주고 리소스를 줄여줍니다.

 

셀레늄에서 페이지 내의 모든 html의 내부 요소의 텍스트 길이를 파악하고 데이터를 수집하려면, for 문으로 매번 셀레늄으로 요청을 해야합니다. 이 때, 1분 정도의 시간이 소요됩니다.

script = """
	var texts = [];
	var elements = document.querySelectorAll('body *:not(button)');
	elements.forEach(function(element) {
		if (element.offsetWidth > 0 && element.offsetHeight > 0) {
			var text = element.innerText.trim();
			if (text) {
				texts.push(text);
			}
		}
	});
	return texts;
"""

texts = driver.execute_script(script)

 

그러나, 위의 코드처럼 JavaScript를 사용하면 작업 시간을 1초이내로 줄일 수 있습니다.

 

 

아래는 execute_script를 사용하는 것의 주요 이점들입니다:

 

1. 페이지 내에서 동적인 요소 조작

  • 자바스크립트를 사용하면 웹 페이지 내에서 동적으로 콘텐츠를 변경하거나, 사용자의 상호작용을 모방할 수 있습니다. 예를 들어, 드롭다운 메뉴를 확장하거나, 숨겨진 요소를 표시하는 등의 작업을 자바스크립트 코드로 쉽게 수행할 수 있습니다.

2. 페이지 스크롤

  • 많은 웹사이트에서 데이터는 사용자가 스크롤을 할 때 동적으로 로드됩니다(무한 스크롤). execute_script를 사용하여 자바스크립트의 window.scrollTo 함수를 호출함으로써, 페이지의 끝까지 스크롤하고 추가 콘텐츠를 로드할 수 있습니다.

3. 페이지 또는 요소의 상태 확인

  • 웹 페이지의 특정 요소가 로딩되었거나, 어떤 조건이 만족되었는지를 확인하기 위해 자바스크립트 코드를 실행할 수 있습니다. 이는 데이터 크롤링을 시작하기 전에 필요한 모든 요소가 준비되었는지 확인하는 데 유용합니다.

4. 복잡한 계산 또는 조작 실행

  • 페이지에 내장된 자바스크립트 함수를 호출하거나, 복잡한 계산을 수행해야 하는 경우, execute_script 메서드를 사용하여 이를 쉽게 처리할 수 있습니다. 예를 들어, 페이지에 표시된 데이터를 기반으로 추가적인 계산을 수행하는 사용자 정의 스크립트를 실행할 수 있습니다.

5. DOM에 직접 접근

  • execute_script를 사용하면 Document Object Model(DOM)에 직접 접근하여 웹 페이지의 구조, 스타일 또는 콘텐츠를 조작할 수 있습니다. 이는 셀레늄 API로는 접근하기 어려운 깊이 있는 요소를 조작하거나, 특정 스크립트를 페이지에 삽입하는 경우에 유용합니다.

6. 성능 최적화

  • 특정 자바스크립트 함수를 직접 호출하는 것이 셀레늄을 통해 동일한 작업을 수행하는 것보다 성능 측면에서 효율적일 수 있습니다. 특히 대량의 데이터를 처리하거나, 복잡한 페이지 상호작용에 유용합니다.

 

2. 마치며

복잡한 구조의 데이터를 수집하기 위해 반자동화 툴을 사용하면서 효율적인 방법을 찾아가면서 개발과 보수를 진행하고 있습니다. 개발이 완료되면 Selenium 관련 업로드는 하지 않지만... 있다면 올려서 정보를 공유하도록 하겠습니다.