我正在尝试使用Python pytube3创建YouTube视频下载器,但它不会下载所有视频。某些视频下载非常容易,但是某些视频无法下载,而未下载却显示错误:
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'
答案 0 :(得分:11)
这是pytube中的extract.py文件中的错误。
转到该软件包的安装位置。如果您不知道在哪里,请运行命令
pip show pytube3
它会给你这样的东西:
我们可以看到Location: c:\users\tiago\anaconda3\lib\site-packages
。
在文件中,行号。 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)
]
运行以下脚本以查看其工作情况
# -*- 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
然后您将看到该文件夹中下载的视频
答案 1 :(得分:1)
只需转到pytube\extract.py
(在 pytube 库中)文件。
文件的路径将是(在 Windows 中):C:\ProgramData\Anaconda3\lib\site-packages\pytube\extract.py
打开extract.py
文件并搜索行:
parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
现在将“ cipher
”替换为“ signatureCipher
”。
保存。
现在再次运行代码
答案 2 :(得分:0)
这是pytube3的问题,我相信到目前为止他们还没有提交修复程序。 Here is the link to the issue on github
答案 3 :(得分:0)
如果您收到Keyerror:“ cipher”的错误消息,然后转到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)
]
保存更改,然后...。 现在尝试下载视频,您现在不会出现任何错误。
答案 4 :(得分:-1)
在pytube库中,有一个extract.py文件 在此文件中将密码更改为签名密码