騷操作!那些富有感情的影視台詞截圖都是哪來的?

  • 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,自己外面套個循環就好)

分析頁面結構和內容,我們得到本模組需要的步驟。

  1. 獲取該頁面網頁源碼,繞過反爬
  2. 獲取下載地址
  3. 保存文件(是一個壓縮包,內含多個字幕文件)
#封裝頭部  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不是萬能的,當你有一萬種使用它的思想,它才是萬能的;如何讓好的工具更加大放異彩,是我們需要經歷和思考的。

後台回復「截圖」獲取程式碼

推薦閱讀:(點擊下方標題即可跳轉)

騷操作!清理曾經愛過的網站

騷操作!如何給你愛的讀者每天發早報?

《中餐廳》彈幕數據分析,我不要你覺得,我只要我覺得!