騷操作!那些富有感情的影視台詞截圖都是哪來的?
- 2019 年 10 月 6 日
- 筆記

泰坦尼克號裡面說過幾次LOVE?


當我們祝福生日快樂的時候,僅僅是生日快樂顯得乾癟,找來的表情包生硬詼諧。可是配合我們共同看過的影視,發過去影視截圖,電影裡面充沛的感情能在一張圖片里表達的淋漓盡致,可我們又能收集到多少影視截圖呢,我們日常看電影的時候又怎麼會留心這種東西呢?
Python大法好啊!
思路設計
如果想要獲取到電影台詞,語音識別不要想,肯定是靠字幕文件的搜索統計來獲得。那麼程式的目標就是
- 爬取字幕文件
- 搜索分析統計字幕文件
- 保存結果
在這裡需要有一個小常識就是,字幕文件的格式應該是包含電影台詞出現時間和電影台詞的,我們需要記錄時間和相應的台詞。
我們暫定目標為 尋找泰坦尼克號,裡面所有帶love的台詞和時間。
爬蟲
經過許多字幕網站測試,那些長得越簡單的字幕網站,下載鏈接擺的越明顯的網站,越難爬取,封裝headers、cookies都沒法簡單獲取字幕的下載鏈接(http://www.zimuku.la 網站的下載地址誰會分析,或者想一起探討爬蟲技術,可以加作者微信好友,微訊號15600820866)。
見過一些測試我找到了 射手網(偽) – assrt.net ,不用換ip,不用cookies,簡單封裝headers偽裝瀏覽器即可。我思考如何爬取那個很難的字幕網站,浪費了兩天時間,還沒有頭緒。測試好幾個字幕網站,找到一個爬取簡單的網站,只用了一小時。還真是方向比努力更加重要,在達成目標的途徑上,要靈活多變,思考尋找。
這裡我們的目標是泰坦尼克號,我們人工搜索到泰坦尼克號的頁面:

泰坦尼克號
url = "https://assrt.net/xml/sub/610/610293.xml"
我們從這個地址開始,尋找這個電影裡面所有的love(至於全網上百萬影視所有的love,自己外面套個循環就好)
分析頁面結構和內容,我們得到本模組需要的步驟。
- 獲取該頁面網頁源碼,繞過反爬
- 獲取下載地址
- 保存文件(是一個壓縮包,內含多個字幕文件)
#封裝頭部 headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'} #獲取網頁源碼 req = requests.get(url, headers=headers)
#正則匹配,並且子串直接獲取下載地址 ans = re.search(u"(/download/.*?)"", str(req.content, 'utf8')) download_url = "https://assrt.net" + ans.group(1)
#下載內含字幕文件的zip文件到桌面 data = requests.get(download_url, headers=headers) adr = "C:\Users\XU\Desktop\" + str( download_url[download_url.rfind('/')+1:] ) with open(adr,"wb") as code: code.write(data.content)
解壓
網站部分提供的是zip文件,不都是直接可以打開的ass,art文件,我們做一個判斷,如果是zip那我們就用模組直接給他解壓了,沒什麼難度,Python真好用
#解壓文件 def unzip(adr): #後綴判斷 if(adr[-3:]=='zip'): f = zipfile.ZipFile(adr, 'r') os.chdir("C:\Users\XU\Desktop") #解壓所有文件 for file in f.namelist(): f.extract(file,"temp/") f.close() fileList = os.listdir( "C:\Users\XU\Desktop\temp") os.chdir("C:\Users\XU\Desktop\temp") #返迴文件列表,便於多個文件搜索 return fileList else: os.chdir("C:\Users\XU\Desktop\") return [adr,]
字幕文件的格式

無非就是 時間 顏色字體大小等資訊 字幕文本
一眼看穿,按行讀取,匹配出時間和字幕就成。
提取並搜索
參數是待查找的字幕文件和我們要找的台詞
def search(fileList,msg): #結果保存進list ans = [] #循環每個文件 for file in fileList: with open(file, encoding='utf8', errors='ignore') as file_obj: for line in file_obj.readlines(): #找英語的話,全部小寫處理 line = line.lower() #如果找到了,就保存 if line.find(msg)!= -1: #保存的格式是時間+當前台詞 ans.append(last_line+line+'n') #information #上一行的時間直接保存在last_line里,具體格式要熟讀字幕文件的格式才能看懂哦 last_line = line #多個字幕文件,其中內容相同,但是語言不一樣,只要找到了一個,說明不用繼續找下去了 if len(ans)!=0: break return ans
保存搜索結果
def write_down(ans): with open('ans.txt','w') as f: f.writelines(ans) f.close() print("查找到"+str(len(ans))+'句話,已保存至ans')
泰坦尼克號裡面說過幾次LOVE,在什麼時間?


02:49:56,480 –> 02:49:58,150 i love you, jack.
小結
當我們知道了指定字幕發生的時間,我們也就能很簡單的截圖保存了。
本來海量的工作,在Python的幫助之下解決了,當然也不是簡單的Python。路上我們要找到好爬取的網站,我們要解析字幕文件的格式,我們要提前想到我們想要的台詞數據藏在字幕文件裡面,字幕文件為了定位,必須有時間標籤。
Python不是萬能的,當你有一萬種使用它的思想,它才是萬能的;如何讓好的工具更加大放異彩,是我們需要經歷和思考的。
後台回復「截圖」獲取程式碼
推薦閱讀:(點擊下方標題即可跳轉)