데이터 분석

[데이터 크롤링] Selenium에서 iframe 다루기: switch_to.frame()을 활용한 효율적인 접근 방법

temporubato108 2024. 10. 16. 13:45

Selenium에서 iframe 처리할 때, switch_to.frame()을 사용하는 이유

웹 페이지를 크롤링하거나 테스트 자동화를 할 때, Selenium은 매우 유용한 도구이다. 하지만 웹 페이지에 iframe이 포함된 경우, Selenium만으로는 해당 iframe 내부의 데이터를 바로 다룰 수 없다. 이럴 때 필요한 것이 바로 switch_to.frame()이다. 이번 글에서는 iframe이 무엇인지, 왜 switch_to.frame()을 사용하는지, 그리고 실제 사용 예시와 함께 그 필요성을 정리해보았다.

1. iframe이란?

iframe(인라인 프레임)은 한 웹 페이지 안에 다른 HTML 문서를 삽입하는 역할을 한다. 즉, 페이지 내에 독립적인 작은 브라우저 창이 있는 것과 같다. 이를 통해 다양한 콘텐츠를 삽입하거나 외부 서비스(예: 지도, 동영상, 광고 등)를 통합할 수 있다.

iframe은 주로 다음과 같은 이유로 사용된다:

  • UI 개선: 외부 콘텐츠를 쉽게 삽입해 복잡한 구조를 관리할 수 있다.
  • 기능성 향상: 외부 서비스나 도메인에서 제공하는 데이터를 독립적으로 처리할 수 있다.
  • 보안 강화: 결제 창이나 로그인 창처럼 중요한 기능을 격리하여 보안을 강화한다.

2. Selenium과 iframe 문제

일반적인 웹 페이지에서 Selenium은 페이지 로드 후 DOM(Document Object Model)을 통해 요소를 탐색하고 상호작용한다. 하지만 iframe이 포함된 페이지에서는 문제가 발생한다. iframe 내부는 별도의 DOM 구조를 가지고 있기 때문에, Selenium이 그 요소들에 접근할 수 없다.

이를 해결하기 위해서는 switch_to.frame()을 사용해 제어를 iframe으로 전환해야 한다. 이렇게 해야만 Selenium이 iframe 내부 요소를 찾을 수 있다.

3. switch_to.frame() 사용 방법

switch_to.frame()은 여러 방식으로 사용할 수 있다.

(1) ID 또는 Name 속성 사용

HTML의 iframe 태그에 idname 속성이 있다면, 이를 이용해 해당 iframe으로 전환할 수 있다.

# iframe의 id가 'searchIframe'인 경우
driver.switch_to.frame("searchIframe")
(2) 인덱스를 사용해 전환

페이지에 여러 iframe이 있을 경우, 순서대로 인덱스를 사용해 전환할 수 있다. 인덱스는 0부터 시작한다.

# 첫 번째 iframe으로 전환
driver.switch_to.frame(0)
(3) WebElement로 전환

미리 iframe 요소를 찾아 WebElement 객체로 전환할 수도 있다.

# iframe을 WebElement로 찾아서 전환
iframe_element = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe_element)

4. switch_to.frame()의 필요성

Selenium은 기본적으로 현재 페이지의 DOM에서만 작업할 수 있다. 하지만 iframe은 독립된 DOM을 가지고 있기 때문에, Selenium이 직접 접근하지 못한다. 이때 switch_to.frame()을 사용해 iframe으로 제어를 전환해야만 그 안의 요소에 접근할 수 있다. 전환하지 않으면 NoSuchElementException 같은 에러가 발생할 수 있다.

여러 개의 iframe이 있는 페이지에서는 특정 iframe을 지정해서 작업할 수 있어, 더욱 유연하게 데이터를 다룰 수 있다.

5. 실제 예시

예를 들어 네이버 지도처럼 외부 서비스가 iframe으로 삽입된 경우, Selenium으로 해당 지도 안의 요소에 접근하려면 먼저 iframe으로 전환해야 한다. 아래는 그 예시 코드이다.

from selenium import webdriver
from selenium.webdriver.common.by import By

# 브라우저 드라이버 실행
driver = webdriver.Chrome()

# 페이지 로드
driver.get("https://example.com")

# iframe으로 전환
driver.switch_to.frame("mapIframe")

# iframe 내부의 요소에 접근
search_box = driver.find_element(By.ID, "searchInput")
search_box.send_keys("카페")

# 다시 메인 페이지로 돌아가기
driver.switch_to.default_content()

이 예시에서, 페이지가 로드된 후 iframe으로 전환하고, searchInput이라는 검색창에 값을 입력했다. 작업이 끝나면 switch_to.default_content()를 사용해 다시 기본 DOM으로 돌아간다.

6. 주의 사항

  • iframe 접근 제한: 일부 보안이 강화된 웹 페이지는 iframe에 대한 직접 접근을 제한할 수 있다. 특히 서로 다른 도메인에서 제공되는 iframe은 크로스 도메인 보안 정책(CORS) 때문에 차단될 수 있다.
  • 크롤링 시 시간 조절: 여러 개의 iframe을 전환하거나 대량의 데이터를 크롤링할 때는 서버에 부하를 주지 않도록 sleep() 같은 방식으로 적절한 간격을 두는 것이 좋다.