ETH官方钱包

前往
大廳
主題

【python】 使用 pytube 會(huì)遇到的一些問(wèn)題

d86123 | 2022-01-18 16:17:26 | 巴幣 2 | 人氣 2070

如果貼上全部的程式碼一個(gè)一個(gè)講,閱讀性太差了
這是我找別人資料參考時(shí)的想法
三百多行的程式,自己寫的就還好,看別人的真的催眠,一眼就想睡
不過(guò)有可能有人想看,整個(gè)程式碼可能會(huì)再發(fā)一篇就是了

所以我把我遇到的問(wèn)題貼一些上來(lái)
希望可以幫助後面也想用pytube這個(gè)模組的同好解決一些找不到的問(wèn)題
不過(guò)我已經(jīng)完成了程式,無(wú)法(懶得)再現(xiàn)問(wèn)題點(diǎn),可能還是會(huì)有些遺漏

2022/02/07
錯(cuò)誤訊息
NoneType' object has no attribute 'span'
沒(méi)意外又是YouTube改版
解決辦法




YouTube 2022/01/20 改版,pytube 抓不到影音資料
錯(cuò)誤訊息如下
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "d:\ytdownload\test.py", line 12, in <module>
    yt.streams.all()
  File "C:\Users\teacher\AppData\Local\Programs\Python\Python310\lib\site-packages\pytube\__main__.py", line 292, in streams
    return StreamQuery(self.fmt_streams)
  File "C:\Users\teacher\AppData\Local\Programs\Python\Python310\lib\site-packages\pytube\__main__.py", line 184, in fmt_streams
    extract.apply_signature(stream_manifest, self.vid_info, self.js)
  File "C:\Users\teacher\AppData\Local\Programs\Python\Python310\lib\site-packages\pytube\extract.py", line 409, in apply_signature
    cipher = Cipher(js=js)
  File "C:\Users\teacher\AppData\Local\Programs\Python\Python310\lib\site-packages\pytube\cipher.py", line 33, in __init__
    raise RegexMatchError(
pytube.exceptions.RegexMatchError: __init__: could not find match for ^\w+\W

cipher.py 中的 ^\w+\W 有問(wèn)題
有人已經(jīng)提出問(wèn)題,並且有人解決
找到 cipher.py 將原本的 ^\w+\W
改成 ^\$*\w+\W 存檔解決


caption 抓字幕問(wèn)題
使用模組時(shí)還是要確認(rèn)型態(tài),不然蝦測(cè)會(huì)浪費(fèi)很多時(shí)間
下圖例子 caption 出來(lái)的型態(tài)是<class 'pytube.query.CaptionQuery'>
到pytube.io 看他原始碼
往上看他的caption.py
有name跟code可以用,name 是字幕語(yǔ)言,code 是語(yǔ)系代碼
人看的是 name,程式看的是 code,怎麼利用看個(gè)人



caption download出錯(cuò)
比如程式碼如下
yt = pytube.YouTube("網(wǎng)址")
yt.captions["zh"].download()
會(huì)出現(xiàn)錯(cuò)誤KeyError: 'start',具體錯(cuò)誤我懶得還原了,好像是他模組內(nèi) xml轉(zhuǎn) srt的方法有錯(cuò)(或是YOUTUBE有更新)
解決方法我直接抄網(wǎng)路答案拉
找到 caption.py覆蓋過(guò)去搞定


分辨下載影片有沒(méi)有聲音
網(wǎng)路上教學(xué)都是使用subprocess,Popen控制臺(tái)檢查影片有沒(méi)有聲音
不過(guò) pytube中已經(jīng)有檢查下載的影片有沒(méi)有聲音的方法
或是檢查是不是漸進(jìn)式下載也可以


下載影片時(shí)整個(gè)程式無(wú)回應(yīng)的問(wèn)題
按下載按鈕時(shí),整個(gè)程式會(huì)卡住,直到下載完成時(shí)才會(huì)釋放資源
這樣不好,因?yàn)槲疫€有 text的 box要顯示下載進(jìn)度,如果下載時(shí)就卡在那
那使用體驗(yàn)很差,這時(shí)候就要使用多執(zhí)行緒
使用 threading模組
原理每一行 threading.Thread(target = 啟動(dòng)函數(shù), args = (啟動(dòng)函式的輸入變數(shù))) 使用一個(gè)執(zhí)行緒
但是在下載按鈕 command的地方不能直接接執(zhí)行緒啟動(dòng)
所以要再寫一個(gè)函式,從函式中啟動(dòng),如果發(fā)現(xiàn)還是無(wú)法改善
嘗試把 tkinter設(shè)定的 StringVar變數(shù)都再丟進(jìn)全域變數(shù)中
讓下載的函式都調(diào)用全域變數(shù)就好
拿我的程式來(lái)說(shuō)

downloadbutton = Button(window, text = "下載影片", width = 15, command = threadstart)


def subthreadstart():
    global caption, captionbox
    downloadbutton["state"] = DISABLED
    analysisbutton["state"] = DISABLED
    filepathbutton["state"] = DISABLED
    downloadsubbutton["state"] = DISABLED
    caption = captionbox.get()
    threading.Thread(target = downloadYTsub).start()

通過(guò) threadstart去啟動(dòng)下載函式
雖然略顯麻煩但可以在這個(gè)函式中插入按鈕狀態(tài)設(shè)定什麼的,一些全域變數(shù)的設(shè)定也可以在這裡
當(dāng)作一個(gè)啟動(dòng)階段

創(chuàng)作回應(yīng)

相關(guān)創(chuàng)作

更多創(chuàng)作