Pytube only works periodically (KeyError: 'assets')
Pytube only works periodically (KeyError: 'assets')
尝试 运行 我的小测试脚本时,Pytube 十次中有五次会向我发送此错误。
脚本如下:
import pytube
import urllib.request
from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=3NCyD3XoJgM')
print('Youtube video title is: ' + yt.title + '! Downloading now!')
这是我得到的:
Traceback (most recent call last):
File "youtube.py", line 6, in <module>
yt = YouTube('https://www.youtube.com/watch?v=3NCyD3XoJgM')
File "C:\Users\test\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pytube\__main__.py", line 91, in __init__
self.prefetch()
File "C:\Users\test\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pytube\__main__.py", line 183, in prefetch
self.js_url = extract.js_url(self.watch_html)
File "C:\Users\test\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pytube\extract.py", line 143, in js_url
base_js = get_ytplayer_config(html)["assets"]["js"]
KeyError: 'assets'
我很困惑。我试图重新安装 Python 加 pytube 但我似乎无法解决这个问题。越来越令人困惑的是脚本有一半时间有效,而另一半时间无效。
尝试替换第143行
base_js = get_ytplayer_config(html)["assets"]["js"]
和
try:
base_js = get_ytplayer_config(html)["assets"]["js"]
except Exception:
pass
我也遇到了同样的麻烦,但我保证置顶的答案解决不了任何问题,只是隐藏问题,直到它再次弹出。
我调查了“extract.py”文件的这个范围,发现了一个错误。该范围在视频所在的Youtube页面的源代码中搜索“字符串”片段,通过字典搜索,例如:
#Example ---------------
Vars = {
'name':'luis'
'age':'27'
}
print(Vars['name'])
result: 'luis'
#Extract.py Code -------
def js_url(html: str) -> str:
"""Get the base JavaScript url.
Construct the base JavaScript url, which contains
the decipher
"transforms".
:param str html:
The html contents of the watch page.
"""
base_js = get_ytplayer_config(html)["assets"]["js"]
return "https://youtube.com" + base_js
错误:
base_js = get_ytplayer_config(html)["assets"]["js"]
KeyError: 'assets'
给出是因为此段源代码不支持字典搜索,所以'KeyError'键错误,因为'assets'不是有效键,源代码不是一本字典。
所以我做了这个脚本,我相信它取代了原来的,但在我的,特别是,出现了其他错误。
def js_url(html: str) -> str:
"""Get the base JavaScript url.
Construct the base JavaScript url, which contains
the decipher
"transforms".
:param str html:
The html contents of the watch page.
"""
base_js = html[html.find('js') + 4:html.find('.js')
+ 4]
return "https://youtube.com" + base_js
上面的脚本搜索函数想要的字符串形式,而不是字典形式。
我希望我为更完整的未来解决方案做出了贡献:)
如果您正在使用 pytube
或 pytube3
软件包,我建议您将其卸载并安装 pytubeX
。无需更改导入。我发现它的工作更加可靠。
编辑:根据评论,如果 none 这些工作,请尝试 pytube4
编辑:pytube
再次维护中!
这是 pytube 库文件的问题。
您可以通过手动修改 pytube 文件夹内的“extract.py”文件来解决此问题。
将其复制并粘贴到文件中:https://github.com/nficano/pytube/blob/master/pytube/extract.py
现在 100% 修复为:
https://github.com/nficano/pytube/pull/767#issuecomment-716184994
如果其他人遇到此错误或问题,运行 在终端或 cmd 中执行此命令:
python -m pip install git+https://github.com/nficano/pytube
尚未随 pip 安装发布的 pytubeX 更新。 GitHub link 是当前开发者解释情况。
固定
extract.py codebase 如果您在终端或 cmd 中执行 运行 此命令后仍然收到错误,现在更新了 extract.py codebase:python -m pip install git+https://github.com/nficano/pytube 是因为它没有更新你的 pytube/extract.py 文件。
修正是
复制 codebase 中的所有代码并替换到您的 extract.py 文件中。我希望这会奏效。
将此功能添加到 extract.py
def get_ytplayer_js(html: str) -> Any:
"""Get the YouTube player base JavaScript path.
:param str html
The html contents of the watch page.
:rtype: str
:returns:
Path to YouTube's base.js file.
"""
js_url_patterns = [
r"\"jsUrl\":\"([^\"]*)\"",
]
for pattern in js_url_patterns:
regex = re.compile(pattern)
function_match = regex.search(html)
if function_match:
logger.debug("finished regex search, matched: %s", pattern)
yt_player_js = function_match.group(1)
return yt_player_js
raise RegexMatchError(
caller="get_ytplayer_js", pattern="js_url_patterns"
)
并将 extract.py 中的函数“js_url”更改为:
def js_url(html: str) -> str:
"""Get the base JavaScript url.
Construct the base JavaScript url, which contains the decipher
"transforms".
:param str html:
The html contents of the watch page.
"""
base_js = get_ytplayer_config(html)["assets"]["js"]
return "https://youtube.com" + base_js
至:
def js_url(html: str) -> str:
"""Get the base JavaScript url.
Construct the base JavaScript url, which contains the decipher
"transforms".
:param str html:
The html contents of the watch page.
"""
base_js = get_ytplayer_js(html)
return "https://youtube.com" + base_js
为了避免这个pytube问题,可以使用youtube_dl代替。这是在 Windows 和 Android 平板电脑(使用 Pydroid3 应用程序)上测试的代码。目的是下载 public 播放列表中提到的视频的音轨。
import os, re
import youtube_dl
from pytube import Playlist
YOUTUBE_STREAM_AUDIO = '140'
if os.name == 'posix':
targetAudioDir = '/storage/emulated/0/Download/Audiobooks/test_youtube_dl'
ydl_opts = {
'outtmpl': targetAudioDir + '/%(title)s.mp3',
'format': 'bestaudio/best',
'quiet': False
}
else:
targetAudioDir = 'D:\Users\Jean-Pierre\Downloads\Audiobooks\test_youtube_dl'
ydl_opts = {
'outtmpl': targetAudioDir + '\%(title)s.%(ext)s',
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '128',
}],
'quiet': False
}
playlistUrl = 'https://www.youtube.com/playlist?list=PLzwWSJNcZTMSFWGrRGKOypqN29MlyuQvn'
playlistObject = Playlist(playlistUrl)
playlistObject._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*)")
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
for videoUrl in playlistObject.video_urls:
meta = ydl.extract_info(videoUrl, download=False)
videoTitle = meta['title']
print('Video title: ' + videoTitle)
ydl.download([videoUrl])
看来 Pytube 模块已更新。
它适用于 pytube 包
即尝试pip install pytube
卸载 pytube 变体
我遇到了同样的问题,更新 pytube
到当前可用的最新版本后问题消失了。
pip install pytube==10.0.0
或
pip install --upgrade pytube
这是一个永久性的解决方法!
你可以试试tube_dl.
pip install tube_dl
from tube_dl import Youtube
yt = Youtube('url')
yt.Formats()[0].download()
它使用模块化方法并且是最新的
有关此内容的更多信息,请访问:https://github.com/shekharchander/tube_dl/
尝试 运行 我的小测试脚本时,Pytube 十次中有五次会向我发送此错误。
脚本如下:
import pytube
import urllib.request
from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=3NCyD3XoJgM')
print('Youtube video title is: ' + yt.title + '! Downloading now!')
这是我得到的:
Traceback (most recent call last):
File "youtube.py", line 6, in <module>
yt = YouTube('https://www.youtube.com/watch?v=3NCyD3XoJgM')
File "C:\Users\test\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pytube\__main__.py", line 91, in __init__
self.prefetch()
File "C:\Users\test\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pytube\__main__.py", line 183, in prefetch
self.js_url = extract.js_url(self.watch_html)
File "C:\Users\test\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pytube\extract.py", line 143, in js_url
base_js = get_ytplayer_config(html)["assets"]["js"]
KeyError: 'assets'
我很困惑。我试图重新安装 Python 加 pytube 但我似乎无法解决这个问题。越来越令人困惑的是脚本有一半时间有效,而另一半时间无效。
尝试替换第143行
base_js = get_ytplayer_config(html)["assets"]["js"]
和
try:
base_js = get_ytplayer_config(html)["assets"]["js"]
except Exception:
pass
我也遇到了同样的麻烦,但我保证置顶的答案解决不了任何问题,只是隐藏问题,直到它再次弹出。 我调查了“extract.py”文件的这个范围,发现了一个错误。该范围在视频所在的Youtube页面的源代码中搜索“字符串”片段,通过字典搜索,例如:
#Example ---------------
Vars = {
'name':'luis'
'age':'27'
}
print(Vars['name'])
result: 'luis'
#Extract.py Code -------
def js_url(html: str) -> str:
"""Get the base JavaScript url.
Construct the base JavaScript url, which contains
the decipher
"transforms".
:param str html:
The html contents of the watch page.
"""
base_js = get_ytplayer_config(html)["assets"]["js"]
return "https://youtube.com" + base_js
错误:
base_js = get_ytplayer_config(html)["assets"]["js"]
KeyError: 'assets'
给出是因为此段源代码不支持字典搜索,所以'KeyError'键错误,因为'assets'不是有效键,源代码不是一本字典。 所以我做了这个脚本,我相信它取代了原来的,但在我的,特别是,出现了其他错误。
def js_url(html: str) -> str:
"""Get the base JavaScript url.
Construct the base JavaScript url, which contains
the decipher
"transforms".
:param str html:
The html contents of the watch page.
"""
base_js = html[html.find('js') + 4:html.find('.js')
+ 4]
return "https://youtube.com" + base_js
上面的脚本搜索函数想要的字符串形式,而不是字典形式。
我希望我为更完整的未来解决方案做出了贡献:)
如果您正在使用 pytube
或 pytube3
软件包,我建议您将其卸载并安装 pytubeX
。无需更改导入。我发现它的工作更加可靠。
编辑:根据评论,如果 none 这些工作,请尝试 pytube4
编辑:pytube
再次维护中!
这是 pytube 库文件的问题。 您可以通过手动修改 pytube 文件夹内的“extract.py”文件来解决此问题。 将其复制并粘贴到文件中:https://github.com/nficano/pytube/blob/master/pytube/extract.py
现在 100% 修复为:
https://github.com/nficano/pytube/pull/767#issuecomment-716184994
如果其他人遇到此错误或问题,运行 在终端或 cmd 中执行此命令:
python -m pip install git+https://github.com/nficano/pytube
尚未随 pip 安装发布的 pytubeX 更新。 GitHub link 是当前开发者解释情况。
固定
extract.py codebase 如果您在终端或 cmd 中执行 运行 此命令后仍然收到错误,现在更新了 extract.py codebase:python -m pip install git+https://github.com/nficano/pytube 是因为它没有更新你的 pytube/extract.py 文件。
修正是 复制 codebase 中的所有代码并替换到您的 extract.py 文件中。我希望这会奏效。
将此功能添加到 extract.py
def get_ytplayer_js(html: str) -> Any:
"""Get the YouTube player base JavaScript path.
:param str html
The html contents of the watch page.
:rtype: str
:returns:
Path to YouTube's base.js file.
"""
js_url_patterns = [
r"\"jsUrl\":\"([^\"]*)\"",
]
for pattern in js_url_patterns:
regex = re.compile(pattern)
function_match = regex.search(html)
if function_match:
logger.debug("finished regex search, matched: %s", pattern)
yt_player_js = function_match.group(1)
return yt_player_js
raise RegexMatchError(
caller="get_ytplayer_js", pattern="js_url_patterns"
)
并将 extract.py 中的函数“js_url”更改为:
def js_url(html: str) -> str:
"""Get the base JavaScript url.
Construct the base JavaScript url, which contains the decipher
"transforms".
:param str html:
The html contents of the watch page.
"""
base_js = get_ytplayer_config(html)["assets"]["js"]
return "https://youtube.com" + base_js
至:
def js_url(html: str) -> str:
"""Get the base JavaScript url.
Construct the base JavaScript url, which contains the decipher
"transforms".
:param str html:
The html contents of the watch page.
"""
base_js = get_ytplayer_js(html)
return "https://youtube.com" + base_js
为了避免这个pytube问题,可以使用youtube_dl代替。这是在 Windows 和 Android 平板电脑(使用 Pydroid3 应用程序)上测试的代码。目的是下载 public 播放列表中提到的视频的音轨。
import os, re
import youtube_dl
from pytube import Playlist
YOUTUBE_STREAM_AUDIO = '140'
if os.name == 'posix':
targetAudioDir = '/storage/emulated/0/Download/Audiobooks/test_youtube_dl'
ydl_opts = {
'outtmpl': targetAudioDir + '/%(title)s.mp3',
'format': 'bestaudio/best',
'quiet': False
}
else:
targetAudioDir = 'D:\Users\Jean-Pierre\Downloads\Audiobooks\test_youtube_dl'
ydl_opts = {
'outtmpl': targetAudioDir + '\%(title)s.%(ext)s',
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '128',
}],
'quiet': False
}
playlistUrl = 'https://www.youtube.com/playlist?list=PLzwWSJNcZTMSFWGrRGKOypqN29MlyuQvn'
playlistObject = Playlist(playlistUrl)
playlistObject._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*)")
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
for videoUrl in playlistObject.video_urls:
meta = ydl.extract_info(videoUrl, download=False)
videoTitle = meta['title']
print('Video title: ' + videoTitle)
ydl.download([videoUrl])
看来 Pytube 模块已更新。
它适用于 pytube 包
即尝试pip install pytube
卸载 pytube 变体
我遇到了同样的问题,更新 pytube
到当前可用的最新版本后问题消失了。
pip install pytube==10.0.0
或
pip install --upgrade pytube
这是一个永久性的解决方法! 你可以试试tube_dl.
pip install tube_dl
from tube_dl import Youtube
yt = Youtube('url')
yt.Formats()[0].download()
它使用模块化方法并且是最新的
有关此内容的更多信息,请访问:https://github.com/shekharchander/tube_dl/