베지밀

[파이썬/Selenium] 크롤링해서 동영상 자동으로 다운로드하기 본문

개인 공부

[파이썬/Selenium] 크롤링해서 동영상 자동으로 다운로드하기

vegimil 2024. 3. 18. 19:50

※ 저작권에 위배되지 않도록 개인적인 학습에만 사용해주세요!!

웹 사이트에 올라간 동영상들을 반복적으로 클릭>저장하다가 문득 생각이 들었다.

일일이 클릭하며 저장하는 대신, 동영상 혹은 파일을 자동으로 다운받게 할 수는 없을까?

 

퍼저를 제작하면서 배웠던 Selenium을 이용해서 웹 링크를 크롤링해서 자동으로 소스를 다운받는 파이썬 코드를 작성해보자.

 

(예시를 위해 학교 LMS 페이지를 가져온거라 실제 크롤링한 사이트/코드와 살짝 차이가 있습니다!)

 

기본 작업 1. pip selenium과 requests를 다운받는다.

pip install selenium requests

cmd 혹은 VSCode의 터미널 창에서 필요한 라이브러리를 다운받아준다.

기존에는 웹 드라이버를 따로 설치해줘야 했지만, selenium4로 업데이트 되면서 별도로 설치할 필요가 없어졌다. (저는 크롬 사용했습니다 파이어폭스 환경은 다를 수 있음)

 

기본 작업 2. 사이트 구조 파악

이건 개인적으로 수행해야 하는 거라 나의 경우에 한해서 설명하겠다.

F12 개발자 도구의 Elements를 사용해 사이트의 구조를 파악할 수 있다.

1. 로그인하기

1-1) 로그인 페이지에서 id, pw를 입력하는 창의 속성을 파악한다.

html 소스에서 마우스오버 했을 때 위 사진처럼 해당 블록이 표시된다.

id 블록의 경우 placeholder 속성의 "사용자 아이디"이고, pw 블록의 경우 placeholder 속성의 값이 "비밀번호"이다.

 

1-2) 입력한 id, pw를 제출하는 버튼의 속성을 파악한다.

보통 submit 타입의 button 태그를 사용한다. 

 

2. 동영상 url의 형태

나의 경우, 동영상 링크에 접속해보면 ?id=1 이런 식으로 id 파라미터에 숫자 값이 들어가 있다.

id 파라미터의 숫자값에 따라 동영상이 재생된다는 의미이다.

 

 

코드 작성

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
import requests
import os

# 초기 설정
start_id = 11  # 시작 ID
end_id = 16  # 종료 ID (예시로 35까지 설정)
save_directory = 'D:\~~~'  # 동영상을 저장할 경로

# 웹드라이버 설정
browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

필요한 라이브러리들을 불러오고, 초기 설정으로 id값의 숫자 및 동영상 저장 경로를 입력해준다.

웹 드라이버의 경우 나는 Chrome을 사용했지만 본인이 사용하는 브라우저에 따라 설정하면 된다.

 

# 로그인 페이지로 이동
browser.get('https://~~~~/users/login')

# 로그인
username_input = browser.find_element(By.CSS_SELECTOR, "input[placeholder='사용자 아이디']")
password_input = browser.find_element(By.CSS_SELECTOR, "input[placeholder='비밀번호']")

username_input.send_keys('ididid') # 본인 로그인 id, pw값 입력해주기
password_input.send_keys('qwer1234')

# 로그인 버튼 클릭
login_button = browser.find_element(By.XPATH, '//button[@type="submit"]')
login_button.click()

# 필요시 페이지가 완전히 로드될 때까지 대기
time.sleep(5)

로그인 페이지의 url로 이동한 후, id/pw 요소를 선택하여 로그인할 id와 pw값을 보낸다.

submit 버튼을 통해 로그인 버튼을 누르고 페이지 로딩을 기다려준다. (환경에 따라 대기 시간을 더 길게 할 수도 있음)

 

# ID 범위에 대해 반복
for video_id in range(start_id, end_id + 1):
    url = f'https://~~~~/vod/popup/video?id={video_id}'
    browser.get(url)

    # 페이지 로딩 대기
    browser.implicitly_wait(10)  # 필요에 따라 대기 시간 조정

    # 동영상 소스 URL 찾기
    video_src = browser.find_element(By.TAG_NAME, 'video').get_attribute('src')

    if video_src:
        # 동영상 다운로드
        response = requests.get(video_src)
        if response.status_code == 200:
            video_path = os.path.join(save_directory, f'video_{video_id}.mp4')
            with open(video_path, 'wb') as file:
                file.write(response.content)
            print(f'Downloaded video {video_id} to {video_path}')
        else:
            print(f'Failed to download video {video_id}: HTTP Status {response.status_code}')
    else:
        print(f'No video source found for id {video_id}')

동영상 소스 url의 경우 video 태그의 src 속성으로 가져올 수 있다.

Selenium4에서는 태그를 찾을 때, find_element(By.TAG_NAME, '태그 이름')으로 찾는다.

find_element_by_tag_name 이제 아님 ..

 

 

 

코드를 실행시키면 selenium에 의해 자동화된 창이 뜨고, 알아서 로그인하고 다운받고 해줄 것이다

5분도 안되어서 동영상 8개 다운 끝!

왠지 직접 클릭해서 저장하는 것보다 다운로드 속도 자체도 엄청 빨라진 기분이다.

 

다음엔 id 파라미터 말고 직접 클릭>접근하며 크롤링하는 방법도 찾아봐야겠다.