骚操作!那些富有感情的影视台词截图都是哪来的?

  • 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不是万能的,当你有一万种使用它的思想,它才是万能的;如何让好的工具更加大放异彩,是我们需要经历和思考的。

后台回复“截图”获取代码

推荐阅读:(点击下方标题即可跳转)

骚操作!清理曾经爱过的网站

骚操作!如何给你爱的读者每天发早报?

《中餐厅》弹幕数据分析,我不要你觉得,我只要我觉得!