在 PyCharm 上使用 pytube

Using pytube on PyCharm

我有一个脚本,我在 2021 年 4 月创建它时运行良好,但现在它给了我以下错误。我在编码方面不是很有经验,所以如果有人能帮助我,那就太好了。

我想做的只是从 youtube 下载一首歌曲作为 mp4。我可以看到错误说导入的pytube模块有问题,但我不够熟练,看不出是什么。

我使用的是 MacOS 12.1、Pycharm 2020.3 和 Python 3.9。

脚本:

import pytube

url = str('https://www.youtube.com/watch?v=gJLIiF15wjQ')
youtube = pytube.YouTube(url)
video = youtube.streams.get_by_itag(140)
video.download(output_path='/Users/clarajacobsen/Documents/TrueFIR/Klub100/Songs/', filename='test')

错误:

Traceback (most recent call last):
  File "/Users/user/Documents/Folder1/venv/test.py", line 8, in <module>
    video = youtube.streams.get_by_itag(140)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 292, in streams
    return StreamQuery(self.fmt_streams)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 177, in fmt_streams
    extract.apply_signature(stream_manifest, self.vid_info, self.js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/extract.py", line 409, in apply_signature
    cipher = Cipher(js=js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 43, in __init__
    self.throttling_plan = get_throttling_plan(js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 387, in get_throttling_plan
    raw_code = get_throttling_function_code(js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 301, in get_throttling_function_code
    code_lines_list = find_object_from_startpoint(js, match.span()[1]).split('\n')
AttributeError: 'NoneType' object has no attribute 'span'

尝试 Sarim 建议的解决方案 1 后,PyCharm 中出现错误:

Traceback (most recent call last):
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 177, in fmt_streams
    extract.apply_signature(stream_manifest, self.vid_info, self.js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/extract.py", line 409, in apply_signature
    cipher = Cipher(js=js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 29, in __init__
    self.transform_plan: List[str] = get_transform_plan(js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 197, in get_transform_plan
    return regex_search(pattern, js, group=1).split(";")
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/helpers.py", line 129, in regex_search
    raise RegexMatchError(caller="regex_search", pattern=pattern)
pytube.exceptions.RegexMatchError: regex_search: could not find match for iha=function\(\w\){[a-z=\.\(\"\)]*;(.*);(?:.+)}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/user/Documents/Folder1/venv/test.py", line 5, in <module>
    video = youtube.streams.get_by_itag(140)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 292, in streams
    return StreamQuery(self.fmt_streams)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/__main__.py", line 184, in fmt_streams
    extract.apply_signature(stream_manifest, self.vid_info, self.js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/extract.py", line 409, in apply_signature
    cipher = Cipher(js=js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 29, in __init__
    self.transform_plan: List[str] = get_transform_plan(js)
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/cipher.py", line 197, in get_transform_plan
    return regex_search(pattern, js, group=1).split(";")
  File "/Users/user/Documents/Folder1/venv/lib/python3.9/site-packages/pytube/helpers.py", line 129, in regex_search
    raise RegexMatchError(caller="regex_search", pattern=pattern)
pytube.exceptions.RegexMatchError: regex_search: could not find match for iha=function\(\w\){[a-z=\.\(\"\)]*;(.*);(?:.+)}

在 Google Colab 中尝试 运行 之后:

/usr/local/lib/python3.7/dist-packages/pytube/cipher.py in get_throttling_function_code(js)
    299 
    300     # Extract the code within curly braces for the function itself, and merge any split lines
--> 301     code_lines_list = find_object_from_startpoint(js, match.span()[1]).split('\n')
    302     joined_lines = "".join(code_lines_list)
    303 

AttributeError: 'NoneType' object has no attribute 'span'

正如错误告诉我们的那样,您在第 8 行中有一个名为 youtube 的 NoneType 对象,它是在第 7 行之前创建的。您是否检查过 YouTube link 或该视频页面上与您相关的任何内容是否有改变了吗?

要解决此问题,这与您使用的操作系统或使用的 python 无关。 按照以下步骤操作:

  1. 我为此使用了 Colab,如果您使用的是 Google colab,请使用它并进行测试。
  2. 使用 !pip install pytube
  3. 安装 Pytube
  4. 安装 pytube 后,只需关闭内核和您正在使用的应用程序。 VSCode、Jupyter notebook 或 Colab。关闭它的内核。
  5. 然后再次 运行 环境并尝试导入和 运行ning 您的代码。
  6. 现在应该运行。

或者如果它给你和以前一样的错误:

  1. 转到安装 pytube 的文件,然后转到 pytube 中名为“pytube”的文件夹,然后进入“cipher.py”并打开它。
  2. 搜索行:293。其中 name = re.escape(get_throttling_function_name(js))
  3. 替换name = "iha"
  4. 然后关闭您正在 运行 编译代码的所有内核和文件。关机后完全重启。

这两个解决方案应该 100% 有效。对我有用的解决方案是第一个。