python教程知乎,

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: