• 某站视频python抓取: m3u8转mp4


    之前利用python简单爬虫抓过一些图片,最近想到了抓取视频。由于很多地方视频不提供下载。所以觉得有必要学习一下,以备不时之需。备注:这里仅记录碰到的网站视频实例,不保证适用所有情况。

    基本概念与思路
    目标问题是,在某视频网站下载喜欢的视频文件并保存为MP4格式。这里涉及到几种文件格式。一般网络视频都采用的流协议,具体内容非专业领域不是很了解,不深入讨论。在我想抓取的视频站中,发现原视频数据分割为很多个TS流,每个TS流的地址记录在m3u8文件列表中,如图所示:
    M3U8

    所以解决问题的思路边是:第一步,抓取目标视频的m3u8的地址URL;第二步,提取提取TS流;最后,合并流成MP4格式。 在搜素相关解决办法时,发现可以利用FFMPEG可以直接实现m3u8 转MP4。流程图如下:

    Created with Raphaël 2.1.2 开始 获取m3u8 url 获取ts流 合成mp4 结束

    代码实现:

    import re
    import uuid
    import subprocess
    import requests
    
    QUALITY = 'ld' # video quality maybe 'ld' 'sd' or  'hd'
    def get_video_ids_from_url(url):
    
         html = requests.get(url, headers=HEADERS).text
         video_ids = re.findall(r'data-lens-id="(d+)"', html)
         #print(video_ids)   
         if video_ids:
            return set([int(video_id) for video_id in video_ids])
         return []
    
     def yield_video_m3u8_url_from_video_ids(video_ids):
        for video_id in video_ids:
            api_video_url = 'https://lens.zhihu.com/api/videos/{}'.format(int(video_id)) # 下载的是知乎视频
            #print(api_video_url)
            r = requests.get(api_video_url, headers=HEADERS)
            playlist = r.json()['playlist']
            print(playlist)
            m3u8_url = playlist[QUALITY]['play_url']        
            yield m3u8_url
    
     def download(url):
            video_ids = get_video_ids_from_url(url)    
            m3u8_list = list(yield_video_m3u8_url_from_video_ids(video_ids))
            filename = '{}.mp4'.format(uuid.uuid4())
            path = ""            
            for idx, m3u8_url in enumerate(m3u8_list):
                # here " and " is important!
                 cmd_str = 'ffmpeg -i "' + m3u8_url + '" ' + '-acodec copy -vcodec copy -absf aac_adtstoasc ' + path + filename.format(str(idx))
                 print(cmd_str)
                 subprocess.call(cmd_str,shell=True )
    
     if __name__ == '__main__': # 贴上你需要下载的 回答或者文章的链接
            url = 'your video page url'
            download(url)

    上面代码自动搜素m3u8文件链接,如果不是批处理,可手动查询地址然后进行后续转码。在方法windows 与linux 均有效。

  • 相关阅读:
    总结Android逆向入门成长必备技能
    BootKit病毒——“异鬼Ⅱ”的前世今生
    NSA武器库知识整理
    SQL菜鸟学习札记(二)
    SQL菜鸟学习札记(一)
    梦织未来Windows驱动编程 第06课 驱动对磁盘文件的操作
    梦织未来Windows驱动编程 第05课 小结(读取另一驱动,遍历所有驱动)
    梦织未来Windows驱动编程 第03课 驱动的编程规范
    【原创】信息搜索力
    【原创】经典排序回顾
  • 原文地址:https://www.cnblogs.com/brother-louie/p/13976552.html
Copyright © 2020-2023  润新知