Post

셀레니움 네트워크 로그로 동영상 스트림을 잡아 받아보자

Chrome 퍼포먼스 로그로 브라우저가 실제 요청한 video URL을 캡처해 HLS 스트림까지 받아보자

셀레니움 네트워크 로그로 동영상 스트림을 잡아 받아보자

셀레니움 네트워크 로그로 동영상 스트림을 잡아 받아보자

앞 글에서 DOM의 <video> 태그로 URL을 뽑았다. 그런데 HLS·DASH 스트림은 src가 DOM에 없다. 브라우저가 실제로 요청한 URL을 네트워크 로그에서 잡아보자.

1. 서론 (Introduction)

  • 문제/상황 (Problem):
    • HLS(.m3u8) 스트리밍은 <video src> 대신 JS가 플레이어를 초기화하며 세그먼트를 요청한다. DOM을 아무리 뒤져도 재생 URL이 보이지 않는다.
    • 앞 글의 DOM 추출 방식은 src가 태그에 노출된 단순 mp4에만 통한다.
  • 목적 (Purpose):
    • Chrome 퍼포먼스 로그를 켜서 브라우저가 실제로 요청한 모든 URL을 기록하고, 그 중 video MIME 타입이나 스트림 확장자를 가진 것만 걸러낸다.
  • 대상 (Target Audience):
    • HLS·DASH 스트림처럼 src가 DOM에 노출되지 않는 영상을 코드로 받아야 하는 개발자

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

  • 배경 조사 및 데이터 (Data Collection):
    • Chrome은 goog:loggingPrefs: {performance: ALL} 옵션으로 DevTools Network 패널과 동등한 수준의 요청 기록을 남긴다. driver.get_log("performance")로 꺼낼 수 있다.
이벤트의미
Network.responseReceived서버 응답 수신 — URL·MIME·크기 포함
Network.requestWillBeSent요청 발송 직전 — 리다이렉트 추적에 유용
1
video 관련 필터 기준: MIME에 `video` 또는 `mpegurl` 포함, 또는 확장자가 `.mp4 .webm .m3u8 .mpd .ts`인 URL.
  • 접근 방법 (Approach Methods):
    • [방법 1]: 퍼포먼스 로그 캡처 — 드라이버 생성 시 goog:loggingPrefs를 켜고 get_log("performance")에서 Network.responseReceived 이벤트를 파싱해 video MIME·확장자를 가진 URL을 모은다.
    • [방법 2]: 확장자별 다운로드 분기 — mp4/webm은 requests 청크 스트림, m3u8(HLS)은 ffmpeg으로 세그먼트를 합쳐 하나의 mp4로 저장한다.
  • 분석 및 해결 프로세스 (Analysis Flow):
    • 도구/기술: Python, selenium, requests, ffmpeg(HLS 전용)
    • 주요 단계: 퍼포먼스 로그 활성화 드라이버 생성 $\rightarrow$ 페이지 열기 $\rightarrow$ 3초 대기(스트림 세그먼트 요청 발생) $\rightarrow$ get_log("performance") 파싱 $\rightarrow$ video URL 필터 $\rightarrow$ 확장자에 따라 분기(mp4: requests / m3u8: ffmpeg)
    • 결과 도출 및 검증: 공개 샘플 페이지 실행 → 퍼포먼스 로그에서 video/mp4 URL 캡처 → stream.mp4 0.8 MB 저장 완료.

3. 결과 (Results)

  • 분석 결과 요약:
    • DOM에 src가 없어도 브라우저가 한 번이라도 요청한 URL은 퍼포먼스 로그에 남는다. HLS 플레이어가 JS로 초기화되더라도 .m3u8 요청은 로그에 찍힌다.
    • mp4는 단순 청크 다운로드, m3u8은 ffmpeg이 플레이리스트를 파싱해 전체 세그먼트를 합쳐 하나의 mp4로 만든다.
    • wait(3초)은 JS 플레이어가 초기화되어 첫 세그먼트를 요청하기까지의 안전 대기다. 플레이어가 느리면 늘려야 한다.

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

  • 인사이트 (Insight):
    • 퍼포먼스 로그는 DOM에 없는 URL을 잡는 유일한 셀레니움 기본 수단이다. Network 탭을 사람이 보는 것과 같은 정보를 코드로 얻을 수 있다.
    • goog:loggingPrefs는 드라이버 생성 시에만 설정할 수 있다. 이미 띄운 드라이버에 추가할 수 없으므로 처음부터 켜놓아야 한다.
    • Widevine DRM 스트림은 URL을 잡아도 복호화 키가 없어 내려받을 수 없다. 이 방법은 DRM 없는 스트림에만 통한다.
  • 실행 방안 (Action Plan):
    • 먼저 앞 글의 DOM 방식을 시도하고, URL을 못 찾으면 이 방법으로 올라온다. 둘 다 실패하면 DRM 보호 스트림이므로 다른 접근이 필요하다.
  • 한 줄 결론 (Key Takeaway):
    • goog:loggingPrefs로 퍼포먼스 로그를 켜면 DOM에 숨겨진 HLS 스트림 URL도 코드로 잡을 수 있다. 샘플 코드
  • 다음 스텝 (Next Step):
    • URL은 잡았지만 Authorization 헤더나 쿠키가 필요한 스트림은 이 방식만으로 내려받을 수 없다. Network.requestWillBeSent 이벤트에서 요청 헤더까지 함께 캡처해야 인증이 걸린 스트림도 다운로드할 수 있다.
This post is licensed under CC BY 4.0 by the author.