本篇博客纯干货!!!
最近接到leader安排的采集任务,抓取采集世界上最大的视频共享网站YouTube的视频字幕。
当我打开视频链接点击显示字幕按钮时,通过浏览器抓取到timedtext这样的一个请求,而返回的内容正式我想要的数据——每个时间点的字幕。
分析该URL有视频ID、signature、key、expire等参数,每次发生变化的是signature,开始通过js突破该参数。过程这里不做详细描述。
终于在该视频源代码中找到这样一段js
"playerCaptionsTracklistRenderer\":{\"captionTracks\":[{\"baseUrl\":\"https:\/\/www.youtube.com\/api\/timedtext?xorp=True\\u0026signature=DC15F46CCF5A97B616CFF6EA13626BC34E24B848.454E61B37E4E1AE37BF2C83F311D8EB362B165AA\\u0026hl=zh-CN\\u0026sparams=caps%2Cv%2Cxoaf%2Cxorp%2Cexpire\\u0026expire=1566051203\\u0026caps=\\u0026key=yttt1\\u0026xoaf=1\\u0026v=7j0xuYKZO4g\\u0026lang=en\\u0026name=English\",
原来一直费尽心思想解析的URL暴露在源码中了,格式化代码后知道他是一段json串,很多视频信息都在该json中,如发布时间、标题、简介、点击量等;心中的小激动?
接下来,通过正则匹配需要的URL
ytplayer_config = json.loads(re.search('ytplayer.config\s*=\s*([^\n]+?});', response.text).group(1))
caption_tracks = json.loads(ytplayer_config['args']['player_response'])['captions']['playerCaptionsTracklistRenderer']['captionTracks']
for c in caption_tracks:
url = c["baseUrl"] # 在url后拼接上&tlang=zh-Hans返回的字幕为中文,&tlang=en-Hans返回的字幕为英文
最后得到字幕URL通过python请求后解析拿到字幕数据。大功告成
有字幕的视频才会有baseUrl这个值,没有字幕的视频这样取会报异常的哦~
字幕解析出来了,下一步批量采集需要的视频字幕。
需求:
通过搜索采集结果中所有字幕。
分析:
视频翻页是基于ajax请求来的,源码里面的信息始终都是第一页的数据,
ok 那既然这样,我们来分析ajax请求,我喜欢用谷歌浏览器,打开开发者工具,network,来抓包。
鼠标一直往下拉,会自动请求,是个post请求,一看就是返回的视频信息。
看到这里很高兴,离胜利已经不远了。但,我们先来看下headers 以及发送的post参数,看了之后 就一句 wtf。。。
一万个羊驼在奔腾,我把那些加密的参数都标记了,前后端交互,既然是发过去的数据,那肯定已经在前端产生了,至于什么产生的,那就要一步一步分析来了,最后。对 我没有分析出来。。。刚开始挨着挨查看js文件,参数的确是在js里面产生的,但。。。tmd写的太复杂了。。。能力有限,解决不了。难道就这样放弃了吗。肯定不会,不然 各位也不会看到这篇文章了。于是,我灵机一动,在地址栏里面输入&page=
结果,真的返回视频了。。。卧槽 哈哈哈,我当时真是很开心呢。因为前端页面上并没有翻页按钮,没想到竟然还真的可以这样翻页。。。哈哈
接下来就是匹配每页的视频链接 – 访问 – 获取字幕
完活 交差 回家 吃饭 睡觉咯
感谢观看!