目前主要功能是完成知乎视频的下载.

在抓包和网页分析发现有blob:https://...格式的视频链接, 但是无法访问, 不过知乎好像是m3u8格式的, 具体的我也不太清楚, 但这并不妨碍我们的下载工作.

关键在于 https://lens.zhihu.com/api/videos/1024143280014860288 这个api返回的json数据, 包含了不同分辨率的视频url,但其中url打开后是这样的文本文件

其中ts就是被分割后的相对url, 拼接后就可以下载播放了, 不过这里还要做的就是将所有被分割的视频合并成一个完整的视频文件,具体的可参考下面代码.

----------------------分割线----->

有相关基础的同学都会知道一个知乎视频是被分割成了许多片段.这样的话的确带来了诸多好处,但同时给它的下载带来了麻烦(手动滑稽). 这里的话项目给出了完整的下载流程,具体我也不多讲了.

项目内视频的初步链接可通过如图方式获取:

F12 元素选择器选中视频框后会找到<iframe>标签,其中的src就是对应的视频初步链接.

下面贴上代码:

HttpUtil.java
1 importorg.json.JSONObject;2
3 import java.io.*;4 importjava.net.URL;5 importjava.net.URLConnection;6 importjava.util.ArrayList;7 importjava.util.List;8 importjava.util.regex.Matcher;9 importjava.util.regex.Pattern;10
11 /**
12 * 该类完成视频下载的一些基本操作13 *@authorAs_14 * @date 2018-09-17 20:29:1215 * @githubhttps://github.com/apknet
16  */
17 public classHttpUtil {18
19     /**
20 * 由api提取出最高清晰度的url21 *@paramurl22 *@returnplay_url23      */
24     public static String getPlayUrl(String url) throwsIOException {25
26         String json =getContent(url);27
28         JSONObject jsonObject = new JSONObject(json).getJSONObject("playlist");29
30         if(jsonObject.has("hd")){31             return jsonObject.getJSONObject("hd").getString("play_url");32         }else if(jsonObject.has("sd")){33             return jsonObject.getJSONObject("sd").getString("play_url");34         }else if(jsonObject.has("ld")){35             return jsonObject.getJSONObject("ld").getString("play_url");36 }37         return null;38 }39
40     /**
41 * 解析出播放清单文件内分散的多个js格式视频url42 *@paramurl43 *@return
44      */
45     public static List<String> getSrcList(String url) throwsIOException {46         List<String> list = new ArrayList<>();47         String content =getContent(url);48         //提取出相对路径
49         String relUrl = url.replaceAll("/\\w+-\\w+-\\w+-\\w+-\\w+\\.m3u8.*", "");50
51         //正则提取出的为相对路径, 需与前面的relUrl完成拼接
52         Matcher matcher = Pattern.compile("EXTINF:\\d+\\.\\d+,(.+?)#").matcher(content);53
54         while(matcher.find()){55             System.out.println(matcher.group(1));56             list.add(relUrl + "/" + matcher.group(1));57 }58
59         returnlist;60 }61
62     /**
63 * 读取输入流并写到输出流中,该函数用于合并分散的视频文件64 *@paramin65 *@paramout66 *@throwsIOException67      */
68     public static void combineStream(InputStream in, OutputStream out) throwsIOException {69         byte[] bytes = new byte[1024];70         intn;71         while ((n = in.read(bytes)) != -1){72             out.write(bytes, 0, n);73 }74 in.close();75 }76
77     public static InputStream getInputStream(String url) throwsIOException {78         URLConnection connection = newURL(url).openConnection();79         connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36");80         returnconnection.getInputStream();81 }82
83     private static String getContent(String url) throwsIOException {84         URLConnection connection = newURL(url).openConnection();85         connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36");86
87         InputStream inputStream =connection.getInputStream();88         BufferedReader reader = new BufferedReader(newInputStreamReader(inputStream));89
90         StringBuilder stringBuilder = newStringBuilder();91 String line;92         while((line = reader.readLine()) != null){93 stringBuilder.append(line);94 }95 reader.close();96 inputStream.close();97         returnstringBuilder.toString();98 }99 }

Main.java

importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.net.URL;importjava.net.URLConnection;importjava.util.List;public classMain {public static voidmain(String[] args) {//将下面的数字替换成对应的知乎视频的id即可String url_1 = "https://lens.zhihu.com/api/videos/1024143280014860288";try{FileOutputStream outputStream= new FileOutputStream(new File("/home/as_/IdeaProjects/VideoHelper/video_1.mp4"));List<String> urls =HttpUtil.getSrcList(HttpUtil.getPlayUrl(url_1));for(String url: urls){HttpUtil.combineStream(HttpUtil.getInputStream(url), outputStream);}}catch(IOException e) {e.printStackTrace();}}}

最后附上

转载于:https://www.cnblogs.com/asche/p/9664987.html

知乎视频下载(爬虫)相关推荐

  1. python实战笔记之(9):TKinter制作知乎视频下载器

    前两天写了一个下载知乎视频的小程序,现在给他加了个图形界面,并生成exe文件.同时对原来的程序进行了优化,使用多线程进行任务分配和下载ts文件,解决了GUI卡顿的问题并大大加快了下载速度. 界面如下: ...

  2. 极客学院职业路径图课程视频下载-爬虫

    一.序言 最近看了极客学院的视频教程,相当不错,渴望把视频下载到本地.手动下载耗时耗力,因而决定研究一番,写一程序自动下载,终于小有成果!有图为证: 二.技术难点 既然要实现自动下载,免不了要爬取极客 ...

  3. 小程序 params_【微信小程序】知乎视频一键保存

    前言 浏览知乎的时候发现知乎里的视频没有提供保存到本地的功能.搜索了一波解决方法后,发现有个答主做的小程序应该是最佳解决方案,不过答主并没有给出实现方式.正好最近在学小程序开发,所以就研究了一下,做了 ...

  4. python实战笔记之(8):下载知乎视频

    这篇想写很久了,今天专门搞了搞,现在把用python下载知乎视频的整个流程码下来. (1)目标站点分析 比如这篇知乎文章https://www.zhihu.com/question/279247693 ...

  5. python爬虫之b站视频下载(python学习笔记)

    b站视频爬取(python学习笔记) 亲爱的b站自从在2020年3月23日将av号改为BV号后,之前的很多爬虫已经不能用了,暂时没看懂这操作的意义何在,反而一大串大小写英文字母加数字的BV号让人很难记 ...

  6. python需要花钱下载吗_用Python下载知乎视频,非常实用

    原标题:用Python下载知乎视频,非常实用 Python下载知乎视频. # -*- coding: utf-8 -*- """ 下载知乎视频: 依赖: pip inst ...

  7. python爬微信公众号视频_python爬虫公众号所有信息,并批量下载公众号视频

    之前写过一篇类似的文章:python爬取公众号,用最简单的方式爬虫 还有同学一直在问,可能中间有一些小细节不明确,这次彻底明确一下细节. 本篇添加一个批量下载公众号内视频的功能,可以实现完全复制一个公 ...

  8. python爬虫app步骤_Python爬虫之App爬虫视频下载的实现

    这篇文章我们来讲一下在网站建设中,Python爬虫之App爬虫视频下载的实现.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 前言 随着手app的发展逐渐强大,我们手机应用每 ...

  9. 视频下载工具 (python爬虫和wxpython实现)

    本工具是用python语言实现功能,wxPython实现界面,pyinstaller打包成的电脑软件. 软件已经全部上传 我的gitee库 ,可自行下载使用. 目录 一.图片展示 1.界面展示 2.实 ...

最新文章

  1. python二维游戏编程 超级大脑_超级大脑教练 - 主页
  2. 现在流行的源程序版本管理软件和项目管理软件
  3. mysql 字段存储多个值 ,判断一个值是否在其中
  4. php 完美分页,php完美分页类程序
  5. 三年前赚走马云665亿的外卖小哥,现在怎么样了?
  6. 在IIS中给某一个网站添加binding的坑
  7. 使用MS Test进行单元测试
  8. linux 手动 创建数据库连接,Linux下手动创建Oracle数据库过程
  9. 双专线接入H3C防火墙无法远程到设备
  10. Pycharm画图中文显示报错:UserWarning: Glyph 20013 (\N{CJK UNIFIED IDEOGRAPH-4E2D}) missing from current font.
  11. Forth 系统实现
  12. 谷歌开源芯片 180 纳米制造工艺
  13. 原生/RN/Flutter选型
  14. 【教案】心田花开:如何辅导一年级孩子看图写话
  15. 【软考中级】软件设计师学习笔记
  16. 小红书笔记api_odoo与小红书对接笔记
  17. Who owns my data(2019/4/16)
  18. VB.net byval和byref
  19. 爬虫练习(3)-- 36Kr 站点正则和 ajax 混合
  20. Windows10系统时间同步没有效果的解决方法

热门文章

  1. 闲话四巨头:腾讯,阿里,百度,华为
  2. 优雅地实现一个高效、异步数据实时刷新的列表
  3. 基于debezium实时数据同步(Oracle为主)
  4. word文档如何排版图片
  5. Argument(s) are different! Wanted:
  6. 访问者模式的java语言_Java 设计模式系列(二三)访问者模式(Vistor)
  7. stm32 U盘升级 bootloader程序 基于stm32f407 将升级包下载到U盘中,插入到设备中,完成对主程序的升级
  8. Help Hanzo(区间素数筛)
  9. (附源码)springboot校园购物网站APP 毕业设计041037
  10. mysql表分区join_​实战:Flink 1.12 维表 Join Hive 最新分区功能体验