웹 스크래핑(크롤링)과 웹 자동화는 오늘날 많은 데이터 분석 및 웹 개발 작업에서 중요한 역할을 하고 있습니다. 이러한 작업을 위한 도구 중에서 가장 널리 사용되는 것이 Selenium과 Chromedriver입니다.
Selenium은 원래 웹 애플리케이션의 테스트를 자동화하기 위해 만들어진 도구지만, 그 기능성과 범용성 때문에 데이터 분석가와 웹 개발자들 사이에서 웹 스크레이핑 도구로 널리 사용되고 있습니다.
Chromedriver는 Selenium 프레임워크에서 Google Chrome 브라우저를 제어하기 위한 WebDriver입니다. 이를 통해 개발자들은 자동화된 테스트 스크립트를 실행하여 웹사이트를 탐색하거나, 사용자와 같은 행동(클릭, 스크롤 등)을 자동으로 수행할 수 있습니다.
그러나 이러한 기본 도구를 사용하여 웹 사이트를 크롤링하면, 대부분의 현대 웹사이트들은 이러한 자동화된 액세스를 감지하고 차단하는 보안 메커니즘을 가지고 있습니다.예를 들어, 보안이 상당한 사이트를 크롤링하려고 할 때, Selenium과 chrome driver를 통해서 크롤링하려고 할때, 사이트에서는 자신들의 데이터를 보호하기위해서 이러한 작업들을 봇이라고 생각하여 감지하며, 차단을 합니다. 이런 상황에서 undetected_chromedriver의 필요성이 대두됩니다.
undetected_chromedriver는 일반적인 Chromedriver와는 다르게, 웹 사이트의 자동화를 감지하여 차단하는 방법을 피할 수 있게 해주는 Python 라이브러리입니다. 즉, 크롤링 스크립트를 실행하는 것이 자동화된 봇이 아닌 실제 사람처럼 보이게 만들어 주는 역할을 합니다.
이를 통해, 웹 사이트가 제공하는 데이터를 보다 안정적이고 효율적으로 수집할 수 있습니다. undetected_chromedriver는 Selenium과 Chromedriver에 익숙한 개발자들이 웹 크롤링 보안에 관한 추가적인 지식 없이도 이러한 감지 메커니즘을 우회할 수 있게 해줍니다.
이처럼 undetected_chromedriver는 웹 크롤링 작업을 보다 쉽고 효율적으로 수행할 수 있게 도와주는 툴입니다
1. 설치 및 사용법
pip install undetected-chromedriver
이렇게 설치를 합니다.
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from fake_useragent import UserAgent
from selenium_stealth import stealth
from selenium.webdriver.chrome.service import Service
options = uc.ChromeOptions()
다양한 옵션들
options = uc.ChromeOptions는 옵션을 넣을 수 있게 생성해줍니다.
# 팝업 차단을 활성화합니다.
options.add_argument('--disable-popup-blocking')
# WebDriver 객체 생성
driver = uc.Chrome( options = options,enable_cdp_events=True,incognito=True)
# selenium_stealth 설정
stealth(driver,
vendor="Google Inc. ",
platform="Win32",
webgl_vendor="intel Inc. ",
renderer= "Intel Iris OpenGL Engine",
fix_hairline=True,
)
options.add_argument('--remote-debugging-port=9222')
# 웹사이트 방문
# driver.get('[원하는 웹사이트 방문]')
# 대기 시간 설정 => 대기 시간을 설정하여, html이 렌더링 되는 시간을 벌어줍니다.
driver.implicitly_wait(2)
# 자바스크립트 코드 실행
driver.execute_script("Object.defineProperty(navigator, 'plugins', {get: function() {return[1, 2, 3, 4, 5];},});")
fake_useragent를 사용하여 매 실행마다 다른 사용자 에이전트 문자열을 사용하는 것은 좋은 방법입니다. 이를 통해 브라우저를 식별하는 데 일반적으로 사용되는 정보를 변경할 수 있습니다.
selenium_stealth를 사용하여 일부 사이트가 웹 스크래퍼를 감지하는데 사용하는 몇 가지 특성을 마스킹할 수 있습니다.
driver.execute_script()를 사용하여 자바스크립트 코드를 실행하여 navigator.plugins 속성을 재정의하는 방법입니다. 이를 통해 웹사이트가 스크래퍼를 감지하는 또 다른 방법을 차단할 수 있습니다.
driver.delete_all_cookies()를 사용하여 모든 쿠키를 삭제하는 것은 웹사이트가 이전 방문을 추적하는 것을 막는 데 도움이 될 수 있습니다.
이렇게 다양한 옵션들을 사용하여 undetected chromedriver를 작동시킬 수 있습니다.
이러한 식으로 기존에 chromedriver와 selenium을 사용했던 방식으로 코드를 넣어줍니다.
2.기존 ChromeDriver와 undetected_chromedriver의 주요 차이점
1) 강화된 특징: undetected_chromedriver는 일반적인 ChromeDriver에 비해 더 강화된 anti-bot 검사를 우회하는 기능을 가지고 있습니다. 이는 일부 웹사이트들이 자동화된 행동, 예를 들면 웹 스크래핑을 막기 위해 사용하는 방어 메커니즘을 피하기 위해 설계되었습니다.
2) Stealth 모드: undetected_chromedriver는 Selenium을 사용한 자동화 행동을 더 잘 숨기기 위한 몇 가지 추가적인 기술을 도입하였습니다. 이에는 navigator.webdriver 플래그 제거, WebGL 밴더 설정, 언어 플러그인 순서 설정, 해상도 설정 등이 포함됩니다. 한마디로 chromedriver의 풀옵션을 달았다고 생각하면 쉽습니다.
3) 반응성: 일부 사용자들은 undetected_chromedriver가 기존 ChromeDriver에 비해 더 빠르고 반응성이 좋습니다. 이는 일부 웹사이트에 따라 다르며, 모든 웹사이트가 모두 동작을 하는 것은 아닙니다.
3. 결론
웹사이트들은 계속해서 새로운 방어 메커니즘을 개발하고 적용하기 때문에, 최신의 방어 기술을 피하는 데에는 추가적인 접근 방법에 대한 지속적인 연구와 방법이 필요합니다.