天天看点

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

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

泰坦尼克号里面说过几次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不是万能的,当你有一万种使用它的思想,它才是万能的;如何让好的工具更加大放异彩,是我们需要经历和思考的。

后台回复「截图」获取代码

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

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

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

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

本文参与 腾讯云自媒体分享计划,欢迎热爱写作的你一起参与!

本文章分享自微信公众号

小詹学Python

作者:小詹&有乔木

原始发表时间:2019-09-19

如有侵权,请联系 [email protected] 删除。