网页视频抓取工具 知乎(之前利用python简单爬虫抓过一些图片,最近想到了抓取视频)
优采云 发布时间: 2021-10-22 15:01网页视频抓取工具 知乎(之前利用python简单爬虫抓过一些图片,最近想到了抓取视频)
之前用python简单爬虫抓取了一些图片,最近想到了抓取视频。因为在很多地方,视频是无法下载的。所以我觉得有必要在紧急情况下学习它。注:仅记录此处遇到的网站视频示例,不保证适用于所有情况。
基本概念和想法
目标问题是在视频网站中下载喜欢的视频文件并保存为MP4格式。这里涉及几种文件格式。一般网络视频使用的流媒体协议,具体内容非专业领域了解不多,不深入讨论。在我要抓拍的视频站中,发现原来的视频数据被分成了很多个TS流,每个TS流的地址都记录在m3u8文件列表中,如图:
所以解决问题的方法是:第一步,抓取目标视频的m3u8地址的URL;第二步,提取TS流;最后,将流合并为 MP4 格式。在搜索相关解决方案时,发现可以使用FFMPEG直接将m3u8转为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 方法都有效。