본문 바로가기

Programming/Python

파이썬을 이용해서 유튜브 플레이리스트 동영상을 받아보기 0 - PyTube 설치

들어가기 전에

YouTube에 공유되는 영상들은 모두 저작권을 가지고 있는 영상입니다. 이를 다운로드 받아 무단으로 배포하거나, 저작권자의 허락 없이 임의로 수정하여 사용할 경우 법적 책임을 물을 수 있습니다. 이 포스트에서 YouTube 영상을 다운로드 받는 방법을 설명하고는 있으나, 이에 대해 발생하는 문제에 대해서는 저는 책임지지 않습니다.

YouTube 영상을 다운로드 받는 방법들

가끔 YouTube 영상을 다운로드 받고 싶은 경우가 생깁니다. 저같은 경우는 플레이 스테이션 게임 영상을 방송으로 YouTube에 저장한 뒤에 별도의 다운로드를 써서 받는 방법을 쓰고 있는데요. 간단하게 영상 한 두개만 받는 정도라면 https://ssyoutube.com 을 사용하거나 검색으로 찾아볼 수 있는 Youtube Downloader 등을 이용하면 편합니다.

만일 플레이리스트 내부의 여러개의 영상을 받아야하는 경우는 어떨까요, 일일이 전부 주소를 복사했다가 순차적으로 다운로드 받는 방법도 있겠습니다만, 전 한번의 프로그램 실행으로 플레이리스트 전체를 받고 싶었습니다. 그래서 알아본 것이 PyTube입니다.

PyTube란

PyTube는 Python에서 Youtube 영상을 간단하게 다운로드 받을 수 있도록 만들어진 모듈입니다. PyPi로 쉽게 설치할 수 있습니다. 그러나 주의사항이 있습니다.

주의사항 1. Python 3.5.x 버전에서만 동작합니다. 그 이상의 버전은 불가능합니다.

정확하게 말하면, Python 3.6 3.7에서도 설치는 가능합니다. 그러나, 만일 이 버전에서 그냥 pytube를 실행했다간 다음의 에러 메시지를 보게 될 것입니다.

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1317, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1016, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 956, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1392, in connect
    server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 412, in wrap_socket
    session=session
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 850, in _create
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 1108, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)

Stack Overflow에 검색한 결과, 이 이슈는 Python 3.5.x 버전에서는 발생하지 않는다는 점을 알았고, 그래서 저는 python 3.5를 가상환경으로 따로 설치하여 실행했습니다.

주의사항 2. pip 버전에 따라 pytube 설치가 안 될 수도 있다.

pip가 버전에 따라 tls 호환이 안 되는 경우가 있다고 합니다. 너무 낮은 TLS 프로토콜을 사용하지 않으려는 정책이라고 하는데, pytube가 저장된 레포지터리의 TLS가 버전이 낮아 pip와 맞지 않아서 설치가 안되는 현상이 발생하는 듯 합니다. 이 경우 pip를 새롭게 업데이트를 해야합니다.

원래는 pip 자체적으로 업그레이드 하는 방법도 가능할 것 같지만, 이 글에서는 curl을 이용하여 pip를 업그레이드 할 것을 권장하고 있었습니다.

$ curl https://bootstrap.pypa.io/get-pip.py | python3

pip --upgrade pip를 사용할 경우 올바른 업데이트가 되지 않는다고 합니다.

Pytube 설치

설치는 pip를 이용하여 다음과 같이 해주시면 됩니다.

$ pip install pytube

환경에 따라 pip3를 하셔도 되고, 그냥 pip를 하셔도 됩니다. 제 가상환경에는 python3만 설치되어 있었으므로 pip를 입력해도 알아서 pip3로 설치가 되었습니다.

간단한 사용법

from pytube import YouTube

yt = YouTube('https://www.youtube.com/watch?v=846cjX0ZTrk') #다운로드 받고자 하는 url을 입력합니다.

print(yt.title)
yt.streams.first().download()

위 코드는 유튜브에서 영상 하나의 데이터를 가져와서 제목을 보여주고, 다운로드를 하는 코드입니다.

실행 결과는 다음과 같습니다.

[MV] 이달의 소녀 (LOONA) "Hi High"

Process finished with exit code 0

위에서 보시다시피 다운로드도 완료되어 있단 것을 알 수 있습니다.

상세한 사용법은 이곳을 참조하시면 되며, 다음 포스트에서도 간략하게 다룰 예정입니다.

  • 유익한 정보 고맙습니다.

  • 좋은 정보 감사합니다.
    파이썬 3.7에서 분명 pip3로 pytube를 인스톨했는데, 실제 코드를 실행시키니 위에서 언급하신 오류가 주르륵 나왔습니다.

    무엇이 문제인지 몰라서 한참 헤맸는데, 답이 여기 있었네요. ^^

    • 스택 트레이스 된 내용을 보면 파이썬 3.7에서 발생하는 문제도 결국 ssl에 관련된 문제 같은데, 아직도 pytube 쪽에선 고치지 않았나 보네요. 라이브러리는 항상 의존성 때문에 골치가 아프죠.. 좋은 개발 하셨으면 좋겠습니다 ^^

  • 마니 2019.10.01 17:47 댓글주소 수정/삭제 댓글쓰기

    url을 넣고 다운로드를 했는데 403 forbidden 에러가 뜨는데 어떻게 해결할 수 있을까요?