当我们祝福生日快乐的时候,仅仅是生日快乐显得干瘪,找来的表情包生硬诙谐。可是配合我们共同看过的影视,发过去影视截图,电影里面充沛的感情能在一张图片里表达的淋漓尽致,可我们又能收集到多少影视截图呢,我们日常看电影的时候又怎么会留心这种东西呢?
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')
02:49:56,480 --> 02:49:58,150 i love you, jack.
当我们知道了指定字幕发生的时间,我们也就能很简单的截图保存了。
本来海量的工作,在Python的帮助之下解决了,当然也不是简单的Python。路上我们要找到好爬取的网站,我们要解析字幕文件的格式,我们要提前想到我们想要的台词数据藏在字幕文件里面,字幕文件为了定位,必须有时间标签。
Python不是万能的,当你有一万种使用它的思想,它才是万能的;如何让好的工具更加大放异彩,是我们需要经历和思考的。
后台回复「截图」获取代码
推荐阅读:(点击下方标题即可跳转)