骚操作!那些富有感情的影视台词截图都是哪来的?
- 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不是万能的,当你有一万种使用它的思想,它才是万能的;如何让好的工具更加大放异彩,是我们需要经历和思考的。
后台回复“截图”获取代码
推荐阅读:(点击下方标题即可跳转)