programming/Python

selenium 라이브러리 frame 전환(switch_to 메소드)

Jofresh 2023. 4. 19. 01:05
728x90
반응형

안녕하세요. 조신선입니다.

오늘은 웹 크롤링을 할 때 필수적으로 알아야하는 셀레니엄 라이브러리에서 프레임을 전환하는 방법을 알아보겠습니다.

 

웹 크롤링 기초적인 부분은 아니고, 중급 정도되는 난이도이긴 한데 네이버맛집이나 동적 웹사이트를 크롤링하기 위해서는 필수로 알아야 하는 개념입니다.

 

우선 selenium 라이브러리의 switch_to 메소드는 현재 브라우저 세션에서 새 창, 프레임 또는 얼럿(dialog)으로 이동하는 데 사용됩니다. switch_to 메소드의 하위 개념들은 다음과 같습니다.



switch_to.window(handle_or_name) : 새 창으로 이동합니다. handle_or_name은 새 창의 윈도우 핸들(window handle) 또는 이름
입니다.


switch_to.frame(frame_reference) : 다른 프레임으로 이동합니다. frame_reference는 프레임 요소(element) 또는 프레임의 인덱스(index) 또는 프레임의 이름 또는 ID입니다.

switch_to.parent_frame() : 현재 프레임의 부모 프레임으로 이동합니다.

switch_to.default_content() : 최상위 프레임으로 이동합니다. 모든 프레임을 빠져나와 최상위 문서(document)로 이동합니다.

switch_to.alert() : 얼럿(dialog)으로 이동합니다. 이 메소드는 브라우저 세션에서 현재 활성화된 얼럿(dialog)에 대한 액세스 권한을 얻습니다.

switch_to.active_element() : 현재 활성화된 요소로 이동합니다. 이 메소드는 현재 브라우저 세션에서 포커스(focus)를 가지고 있는 요소를 반환합니다.


이러한 switch_to 메소드들은 브라우저에서 요소들 간의 이동을 쉽게 해주므로 Selenium을 사용하여 웹 애플리케이션을 자동화하는 데 필수적입니다.

 

이제 실전 예시입니다. 

 

우선 1번과 2번은 frame이 다릅니다.

element를 확인해보면 아래와 같습니다.

 

1번 화면 = Iframe

2번 화면 = Entryframe

 

프레임 이해를 돕기 위한 이미지

예를 들어 1번 화면 정보를 크롤링하기 위해서는 1번화면 프레임으로 접근해야 합니다.

예시: 

        frame = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "iframe#searchIframe")))
        driver.switch_to.frame(frame)

 

그리고 엄청 헤깔렸던 부분인데, 1번 화면에서 정보를 수집하고, 2번 화면에서 정보를 수집하기 위해서는 

바로 프레임을 스위치하면 오류가 발생합니다.

 

그래서 한 단계를 거쳐야 하는데, 방법은 바로 위에 적어뒀던 [switch_to.default_content()]를 이용하는 것 입니다.

예시:

                driver.switch_to.default_content()
                # 오래 헤맸던 부분!! switch_to.default_content()로 전환해야 frame_in iframe을 제대로 잡을 수 있다.
                frame_in = wait2.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#entryIframe")))
                driver.switch_to.frame(frame_in)

 

위와 같이 디폴트_콘텐트로 한번 갔다가 다시 원하는 프레임으로 이동을 해야지만 코드가 정상적으로 작동합니다.

 

이렇게 진행하면 1번화면에서 노출되는 가게명과, 1번 화면에서 노출되는 전화번호, 가게 상세정보를 한 번에 수집할 수 있습니다.

 

다음에는... 다이닝코드 같이 가게를 클릭하면 새창이 열리는 웹페이지를 크롤링하는 방법과 네이버지도 검색결과를 크롤링하는 상세 코드를 올려보도록 할께요!!

 

728x90
반응형