这次还是解析视频,用到的工具是python,浏览器。因为最近觉得动物世界很有意思,所以找了一个央视的官网,免费的。网址:
https://tv.cctv.com/cctv1/?spm=C52056131267.PAgOvvq0dRfD.0.0
可以看电视,我比较喜欢看看大自然的东西,所以就选择了《动物世界》,可以回看。
今天分析的网址是:https://tv.cctv.com/lm/dwsj/?spm=C52056131267.PAgOvvq0dRfD.0.0
直接打开网址,F12获得视频网址:
1.png (1.05 MB, 下载次数: 0)
下载附件
2021-3-25 10:19 上传
恩,不错。有很多视频。这样一个一个找太费劲,看看网页是怎么获取数据的:
1.png (1.09 MB, 下载次数: 0)
下载附件
2021-3-25 10:23 上传
这个数据有些可疑,试一下:
>>> url = "https://api.cntv.cn/NewVideo/getVideoListByColumn?id=TOPC1451378967257534&serviceId=tvcctv&mode=0&n=20&p=1&t=jsonp&cb=setItemByidELMTGwEXpUuBn9MYpWasvymv160224"
>>> msg = requests.get(url,headers=headers,timeout=20)
>>> msg.encoding = chardet.detect(msg.content)['encoding']
>>> m = msg.text
>>> m[:200]
'setItemByidELMTGwEXpUuBn9MYpWasvymv160224({"data":{"total":1000,"list":[{"guid":"4b1fe761763b4d1dbef89c8aa8f40922","id":"VIDEMzNCMJ6a719xvMsMRT2j210325","time":"2021-03-25 00:37:00","title":"\\u300a\\u5'
看看抓到了什么?
>>> exec("msg="+m[m.find("({"):m.rfind("})")+2])
>>> url = msg['data']['list'][0]['url'].replace("\\","")
>>> url
'https://tv.cctv.com/2021/03/25/VIDEMzNCMJ6a719xvMsMRT2j210325.shtml'
>>> msg['data']['list'][0]['title']
'《动物世界》 20210325 树洞与“房客”(下)'
似乎是视频详细信息?地址都有,没错,就是它了。浏览器打开看看,确定无疑。继续抓包:
>>> msg = requests.get(url,headers=headers,timeout=20)
>>> msg.encoding = chardet.detect(msg.content)["encoding"]
>>> m = msg.text
网页搜索,看看具体视频网址怎么查找?
>>> url = "https://tv.cctv.com/2021/03/25/VIDEMzNCMJ6a719xvMsMRT2j210325.shtml"
>>> msg = requests.get(url,headers=headers,timeout=20)
>>> msg.encoding = chardet.detect(msg.content)['encoding']
>>> m = msg.text
ok,现在数据抓到了,开始分析。还是之前的套路,浏览器F12打开开发者工具,直接搜索:
1.png (383.07 KB, 下载次数: 0)
下载附件
2021-3-25 10:03 上传
还是没有具体信息,预料之中。继续通过浏览器获取到的数据分析:
2.png (415.71 KB, 下载次数: 0)
下载附件
2021-3-25 10:06 上传
看到有main.m3u8文件,还是去搜一下看看能不能找到:
>>> m.find("main.m3u8")
-1
果然没有。突然发现上面有一行“getHttpVideoInfo.do……”字样的链接,难道是这个?试试看:
>>> url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid=4b1fe761763b4d1dbef89c8aa8f40922"
>>> msg = requests.get(url,headers=headers,timeout=20)
Traceback (most recent call last):
File "C:\Users\shenhj.lyxs\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connection.py", line 159, in _new_conn
………………
嗯,出错了,看来时截取的地址有问题。重新截取:
>>> url = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid=4b1fe761763b4d1dbef89c8aa8f40922&client=flash&im=0"
>>> msg = requests.get(url,headers=headers,timeout=20)
没问题。好,看看抓到了什么信息?
>>> f=open("d:/temp/test.txt","w")
>>> f.write(m)
12845
>>> f.close()
打开文件,类似这样的内容:
{"ack":"yes","status":"001","tag":"动物世界 猫头鹰 山雀 啄木鸟 阿尔卑斯山","title":"《动物世界》 20210325 树洞与“房客”(下)","play_channel":"CCTV-1高清","produce":"","editer_name":"linshuxiang","produce_id":"wxsb01","column":"动物世界高清","f_pgmtime":"2021-03-25 02:18:15","cdn_info":{"cdn_vip":"vod.cntv.lxdns.com","cdn_code":"VOD-MP4-CDN-CNC","cdn_name":"3rd网宿"},"video":{"totalLength":"1789.08","chapters":[{"duration":"300.00","image":"https://p5.img.cctvpic.com/fmspic/2021/03/25/4b1fe761763b4d1dbef89c8aa8f40922-1.jpg","url":"https://vod.cntv.lxdns.com/flash/mp4video63/TMS/2021/03/25/4b1fe761763b4d1dbef89c8aa8f40922_h264418000nero_aac32-1.mp4"},{"duration":"300.00","image":"https://p5.img.cctvpic.com/fmspic/2021/03/25/4b1fe761763b4d1dbef89c8aa8f40922-1.jpg","url":"https://vod.cntv.lxdns.com/flash/mp4video63/TMS/2021/03/25/4b1fe761763b4d1dbef89c8aa8f40922_h264418000nero_aac32-2.mp4"},
………………
看起来是json数据。里面的内容很简单明了,url后面的内容就是一段段的视频了。浏览器打开看看,确认了。全部下载,然后用ffmpeg合并成一个完整的,ok,视频获取完成。(如何合并,参见我前面的分析。)
写作不易,免费评分来点呗?