python - 为什么我的 YouTube 视频下载器只下载一些视频,而对于其他视频,它会显示 URL 和密码等密钥错误?
问题描述
我正在尝试使用 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'
解决方案
这是pytube文件 extract.py 中的错误。
转到安装包的位置。如果你不知道在哪里,运行命令
pip show pytube3
它会给你这样的东西:
我们可以看到Location: c:\users\tiago\anaconda3\lib\site-packages
。
- 转到该位置,打开文件夹 pytube 和文件 extract.py
在文件中,行号。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
然后,您将在该文件夹中看到下载的视频
推荐阅读
- vuejs2 - Nativescript Vue:访问类函数
- python - 如何使 tkinter 按钮运行另一个 python 文件
- php - 使用 PHP 替换 WordPress 插件图标
- android - 使用单一活动应用程序的 AccountAuthentication
- html - 下载图像时显示加载背景颜色响应
- docker - 构建平台即服务
- go - 我不确定为什么会出现索引超出范围错误
- ios - iOS 13 - Cordova azure 通知中心插件未注册设备
- javascript - 直接调用函数draw时得到不同的输出?反应俄罗斯方块
- python-3.x - 从 Python 中的列表元素中删除特定标点符号