Post

셀레니움 드라이버 클래스로 동영상 사이트에서 영상을 받아보자

Driver 클래스로 페이지를 열고 video 태그에서 URL을 뽑아 청크 다운로드까지 해보자

셀레니움 드라이버 클래스로 동영상 사이트에서 영상을 받아보자

셀레니움 드라이버 클래스로 동영상 사이트에서 영상을 받아보자

앞 글에서 만든 Driver 클래스로 동영상 페이지를 열고, <video> 태그에서 URL을 추출해 파일로 받아보자.

1. 서론 (Introduction)

  • 문제/상황 (Problem):
    • 브라우저로 재생되는 영상을 코드로 받으려면 두 단계가 필요하다. 먼저 페이지를 렌더링해 video URL을 찾고, 그 다음 URL을 직접 내려받는다.
    • JS가 src를 동적으로 주입하는 사이트는 HTML 소스만 봐서는 URL을 알 수 없다. 브라우저가 실행된 뒤의 DOM을 봐야 한다.
  • 목적 (Purpose):
    • Driver 클래스로 페이지를 열어 <video> 태그에서 재생 가능한 URL을 뽑고, requests로 청크 단위로 내려받는다.
  • 대상 (Target Audience):
    • 브라우저에서 재생되는 영상을 자동으로 수집해야 하는 개발자

2. 방법 및 과정 (Methods & Process)

  • 배경 조사 및 데이터 (Data Collection):
    • video URL이 DOM에 존재하는 방식은 크게 세 가지다.
방식HTML 패턴비고
직접 src<video src="...">가장 단순
source 태그<video><source src="..."></video>포맷별 복수 소스
JS 주입window.__videoUrl = "..."동적 렌더링 사이트
1
Selenium `get_attribute("src")`는 상대 URL도 절대 URL로 반환하므로 따로 `urljoin`이 필요 없다.
  • 접근 방법 (Approach Methods):
    • [방법 1]: DOM 태그 속성 직접 읽기 — video[src]video source[src]를 CSS 셀렉터로 찾아 get_attribute("src")로 절대 URL을 얻는다.
    • [방법 2]: JS 전역 변수 조회 — 태그에 src가 없으면 execute_scriptwindow.__videoUrl 같은 후보 키를 실행해 값을 확인한다. 두 경로로 모은 URL 중 첫 번째를 requests 청크 스트림으로 내려받는다.
  • 분석 및 해결 프로세스 (Analysis Flow):
    • 도구/기술: Python, selenium, requests, webdriver-manager
    • 주요 단계: Driver 열기 → 페이지 로드 대기 → JS 렌더링 대기(2초) → DOM에서 video URL 수집 → requests 청크 다운로드
    • 결과 도출 및 검증: 공개 샘플 페이지 실행 → video URL 2개 발견 → video.mp4 0.8 MB 저장 완료.

3. 결과 (Results)

  • 분석 결과 요약:
    • <source> 태그가 여러 개여도 중복 없이 URL 목록을 만들어 첫 번째를 내려받는다.
    • JS 렌더링 후 DOM을 읽으므로 정적 HTML 파싱으로는 잡히지 않는 src도 추출할 수 있다.
    • 청크 스트림(iter_content)으로 내려받아 메모리 부담 없이 큰 파일도 처리한다.

4. 인사이트 및 액션 (Insights & Action)

  • 인사이트 (Insight):
    • Selenium get_attribute("src")는 브라우저가 해석한 절대 URL을 반환한다. 상대 경로 처리를 따로 작성할 필요가 없다.
    • time.sleep(2)는 JS가 src를 주입하기를 기다리는 안전망이다. 대신 wait_el("video[src]")로 조건 대기하면 더 빠르다.
    • 이 방법은 src가 DOM에 노출된 단순 mp4/webm에만 통한다. HLS·DASH 스트림은 .m3u8 플레이리스트를 다르게 처리해야 한다.
  • 실행 방안 (Action Plan):
    • 대상 사이트의 <video> 태그 구조를 개발자 도구로 먼저 확인한다. src가 없으면 다음 글의 네트워크 로그 방법을 써야 한다.
  • 한 줄 결론 (Key Takeaway):
    • Driver로 렌더링하고 get_attribute("src")로 URL을 뽑으면 JS 주입 영상도 코드로 받을 수 있다. 샘플 코드
  • 다음 스텝 (Next Step):
    • JS가 src를 동적으로 주입하는 사이트는 DOM 로드 직후엔 URL이 없다. 대기 조건을 wait_el("video[src]")로 바꾸면 sleep 없이 정확한 시점에 잡을 수 있다.
This post is licensed under CC BY 4.0 by the author.