python教程知乎,
前言
现在知乎允许上传视频,但是不能下载。气得我在绝望中研究了一下,然后滚动代码下载保存视频。
接下来,为什么猫一点都不怕蛇?举个例子,分享一下整个下载过程。
相关学习推荐:python视频教程
调试一下
打开F12,找到光标,如下图所示:
然后将光标移到视频上。如下图:
嘿,这是什么?一个神秘的链接: https://www.zhihu.com/video/出现在视野中xxxxx
,让我们将此链接复制到浏览器并打开它:
好像这就是我们要找的视频。别急,先来看看网页的要求,然后你会发现一个很有意思的要求(重点来了)3360
我们自己来看看数据吧。
{
播放列表 : {
ld: {
宽度 : 360,
格式 : mp4 ,
play _ URL : https://vdn . vzuu.com/LD/05fc 411 e-d8e 0-11e 8-bb8b-0242 AC 112 a0b . MP4?auth _ key=1541477643-0-0-987 C2C 504d 14 ab 1165 ce 2e d 47759d 927 expiration=1541477643 disable _ local _ cache=1 ,
持续时间 : 17,
尺码: 1123111,
比特率 : 509,
身高 : 640
},
hd: {
宽度 : 720,
格式 : mp4 ,
play _ URL : https://vdn . vzuu.com/HD/05fc 411 e-d8e 0-11e 8-bb8b-0242 AC 112 a0b . MP4?auth _ key=1541477643-0-0-8b 8024 a 22 a 62 f 097 ca 31 b 8 b 06 b 7233 a1 expiration=1541477643 disable _ local _ cache=1 ,
持续时间 : 17,
尺码: 4354364,
比特率 : 1974,
身高 : 1280
},
sd: {
宽度 : 480,
格式 : mp4 ,
play _ URL : https://vdn . vzuu.com/SD/05fc 411 e-d8e 0-11e 8-bb8b-0242 AC 112 a0b . MP4?auth _ key=1541477643-0-0-5948 c 2562d 817218 c 9 a9 fc 41 abad 1 df 8 expiration=1541477643 disable _ local _ cache=1 ,
持续时间 : 17,
尺码: 1920976,
比特率 : 871,
高度 : 848
}
},
标题 : ,
持续时间 : 17,
cover_info: {
宽度 : 720,
缩略图 : https://pic 2 . zhimg.com/80/v2-97b 9435 a 0 c 32d 01 c 7 c 931 BD 00120327d _ b . jpg ,
身高 : 1280
},
键入 : 视频,
id: 1039146361396174848 ,
杂项信息 : {}
}没错,我们要下载的视频就在这里,ld代表
普清,sd 代表标清, hd 代表高清,把相应链接再次在浏览器打开,然后右键保存就可以下载视频了。
代码
知道整个流程是什么样子,接下来撸代码的过程就简单了,这里就不过再做过多解释了,直接上代码:
# -*- encoding: utf-8 -*-结语import re
import requests
import uuid
import datetime
class DownloadVideo:
__slots__ = [
'url', 'video_name', 'url_format', 'download_url', 'video_number',
'video_api', 'clarity_list', 'clarity'
]
def __init__(self, url, clarity='ld', video_name=None):
self.url = url
self.video_name = video_name
self.url_format = "https://www.zhihu.com/question/\d+/answer/\d+"
self.clarity = clarity
self.clarity_list = ['ld', 'sd', 'hd']
self.video_api = 'https://lens.zhihu.com/api/videos'
def check_url_format(self):
pattern = re.compile(self.url_format)
matches = re.match(pattern, self.url)
if matches is None:
raise ValueError(
"链接格式应符合:https://www.zhihu.com/question/{number}/answer/{number}"
)
return True
def get_video_number(self):
try:
headers = {
'User-Agent':
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
}
response = requests.get(self.url, headers=headers)
response.encoding = 'utf-8'
html = response.text
video_ids = re.findall(r'data-lens-id="(\d+)"', html)
if video_ids:
video_id_list = list(set([video_id for video_id in video_ids]))
self.video_number = video_id_list[0]
return self
raise ValueError("获取视频编号异常:{}".format(self.url))
except Exception as e:
raise Exception(e)
def get_video_url_by_number(self):
url = "{}/{}".format(self.video_api, self.video_number)
headers = {}
headers['Referer'] = 'https://v.vzuu.com/video/{}'.format(
self.video_number)
headers['Origin'] = 'https://v.vzuu.com'
headers[
'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
headers['Content-Type'] = 'application/json'
try:
response = requests.get(url, headers=headers)
response_dict = response.json()
if self.clarity in response_dict['playlist']:
self.download_url = response_dict['playlist'][
self.clarity]['play_url']
else:
for clarity in self.clarity_list:
if clarity in response_dict['playlist']:
self.download_url = response_dict['playlist'][
self.clarity]['play_url']
break
return self
except Exception as e:
raise Exception(e)
def get_video_by_video_url(self):
response = requests.get(self.download_url)
datetime_str = datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S")
if self.video_name is not None:
video_name = "{}-{}.mp4".format(self.video_name, datetime_str)
else:
video_name = "{}-{}.mp4".format(str(uuid.uuid1()), datetime_str)
path = "{}".format(video_name)
with open(path, 'wb') as f:
f.write(response.content)
def download_video(self):
if self.clarity not in self.clarity_list:
raise ValueError("清晰度参数异常,仅支持:ld(普清),sd(标清),hd(高清)")
if self.check_url_format():
return self.get_video_number().get_video_url_by_number().get_video_by_video_url()
if __name__ == '__main__':
a = DownloadVideo('https://www.zhihu.com/question/53031925/answer/524158069')
print(a.download_video())
代码还有优化空间,这里面我只是下载了回答中的第一个视频,理论上应该存在一个回答下可以有多个视频的。如果还有什么疑问或者建议,可以多多交流。
相关学习推荐:python视频教程以上就是学习python 抓取知乎指定回答下视频的方法的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。