Почему мой загрузчик видео с YouTube загружает только некоторые видео, а для других видео он показывает ошибку ключа, такую ​​как URL и шифр? - PullRequest
3 голосов
/ 30 мая 2020

Я пытаюсь создать загрузчик видео с YouTube, используя Python pytube3, но он не загружает все видео. Некоторые видео загружаются очень легко, но некоторые видео не загружаются, и вместо загрузки отображается ошибка:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\tarun\PycharmProjects\YTDownloader\venv\lib\site-packages\pytube\extract.py", line 297, in apply_descrambler
    for format_item in formats
  File "C:\Users\tarun\PycharmProjects\YTDownloader\venv\lib\site-packages\pytube\extract.py", line 297, in <listcomp>
    for format_item in formats
KeyError: 'url'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\tarun\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/tarun/PycharmProjects/YTDownloader/YTD.py", line 15, in video_download
    my_video = YouTube(input_user)
  File "C:\Users\tarun\PycharmProjects\YTDownloader\venv\lib\site-packages\pytube\__main__.py", line 92, in __init__
    self.descramble()
  File "C:\Users\tarun\PycharmProjects\YTDownloader\venv\lib\site-packages\pytube\__main__.py", line 132, in descramble
    apply_descrambler(self.player_config_args, fmt)
  File "C:\Users\tarun\PycharmProjects\YTDownloader\venv\lib\site-packages\pytube\extract.py", line 301, in apply_descrambler
    parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
  File "C:\Users\tarun\PycharmProjects\YTDownloader\venv\lib\site-packages\pytube\extract.py", line 301, in <listcomp>
    parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
KeyError: 'cipher'

Ответы [ 4 ]

8 голосов
/ 31 мая 2020

Это ошибка в файле extract.py из pytube .

  1. Go до места, где был установлен пакет. Если вы не знаете где, запустите команду

    pip show pytube3
    

    , и вы получите что-то вроде этого:

pip show package

We can see Location: c:\users\tiago\anaconda3\lib\site-packages.

  1. Go в это место, откройте папку pytube и файл extract.py

pythube location

  1. В файле номер строки. 306 или 301, вы найдете parse_qs(formats[i]["cipher"]). Если да, то измените "cipher" на "signatureCipher" (убедитесь, что 'C' - заглавная).

    Итак, изначально у вас будет

     cipher_url = [
                     parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
                 ]
    

    , но это должно быть

     cipher_url = [
                     parse_qs(formats[i]["signatureCipher"]) for i, data in enumerate(formats)
                 ]
    

pytube extract cypher error fixed

  1. Запустите следующий скрипт, чтобы убедиться, что он работает

     # -*- coding: utf-8 -*-
     """
     Created on Mon Jun 15 12:21:49 2020
    
     @author: tiago
     """
     from pytube import YouTube
    
     video_url = "https://youtu.be/gp5tziO5lXg" # YouTube video URL
     youtube = YouTube(video_url)
     video = youtube.streams.first()
     video.download("C:/Users/tiago/Desktop/videos/") # Path where to store the video
    

Затем вы увидите видео, загруженное в эту папку

Как скачать видео с ютуба в Python

0 голосов
/ 21 июля 2020
  1. Просто go в файл pytube\extract.pypytube библиотеке). Путь к файлу будет (в Windows): C:\ProgramData\Anaconda3\lib\site-packages\pytube\extract.py

  2. Откройте файл extract.py и найдите строку:

    parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)

  3. Теперь замените 'cipher' на 'signatureCipher'.

  4. Сохраните.

  5. Теперь снова запустите свой код

0 голосов
/ 17 июля 2020

Если вы получаете ошибку как Keyerror: "cipher", затем go в местоположение pytube open extract.py и в строке № 301 вы получите это

cipher_url = [
                parse_qs(formats[i]["Cipher"]) for i, data in enumerate(formats)
            ]

теперь отредактируйте это строчку к этой

cipher_url = [
                parse_qs(formats[i]["signatureCipher"]) for i, data in enumerate(formats)
            ]

сохраните изменения и .... Бум, вы сделали. теперь попробуйте загрузить видео, теперь вы не получите никаких ошибок.

0 голосов
/ 30 мая 2020

Это проблема с pytube3, я считаю, что на данный момент они еще не отправили исправление. Вот ссылка на проблему на github

...