用python制作个视频下载器


Posted in Python onFebruary 01, 2021

前言

某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~
当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而生:“生活已然很无聊,不如再无聊些叭”。
于是,我决定开一个专题,便称之为kimol君的无聊小发明。
妙…啊~~~

众所周知,视频是一个学习新姿势知识的良好媒介。那么,如何利用爬虫更加方便快捷地下载视频呢?本文将从数据包分析到代码实现来进行一个相对完整的讲解。

一、爬虫分析

本次选取的目标视频网站为某度旗下的好看视频:

https://haokan.baidu.com

1.视频搜索

进入主页后,我们可以看到一个搜索框历历在目:

用python制作个视频下载器

当我们点击搜索按钮之后,会出现与关键字(ps.这里要考,大家仔细看?)相匹配的视频,我们需要做的便是抓包来分析其中的请求数据。

关于抓包工具,可以选择三方工具(如Fiddler或者Burpsuit等),当然也可以选择浏览器自带的调试工具(在浏览器中按F12即可打开)。
在这里我选择了后者,打开F12调试工具,选择网络:

用python制作个视频下载器

在点击搜索按钮之后我们可以看到相应的网络请求出现在下面的工具框中:

用python制作个视频下载器

通过简单的查找之后我们可以很容易地发现对应的搜索请求(红框标出部分),其对应的地址为:

https://haokan.baidu.com/videoui/page/search?query=kimol君666

那么,我们通过requests库来模拟该请求,便可实现搜索视频的功能:

import requests
res = requests.get('https://haokan.baidu.com/videoui/page/search?query=xxxxx')# xxxxx表示你需要搜索的关键字

注:这里不需要用到请求头headers,但是不能一概而论。是否需要请求头要根据具体网站分析哦~

你没有看错,我只用了2行代码便实现了视频网站的搜索功能。有时候,爬虫就是这么简单?!
在得到请求后,接下来我们要对这个请求返回的数据进行分析,同样是在F12调试工具中点击右侧的响应便可以看到请求的响应:

用python制作个视频下载器

很显然,这里返回的是一个HTML格式的数据,我们只需要通过re库或是bs4库等将我们需要的数据提取出来即可。至此,关于视频搜索的分析基本算是完成了。
然而!细心的小伙伴会发现,我们现在可以获得搜索结果,但是没办法选择页面呀。对嚯~那咋办呀?

同样,我们继续抓包分析不就可以了嘛~ 我倒要看看你是怎么翻页的。果然,下滑鼠标之后我们得到了新的请求:

用python制作个视频下载器

其请求地址变为了:

https://haokan.baidu.com/videoui/page/search?pn=2&rn=10&_format=json&tab=video&query=kimol君666

请求多了pn、rn、_format、tab等参数,而且请求返回的格式也变为了JSON格式(岂不美哉?更方便提取想要的数据了)。通过简单测试可以知道,这些参数分别代表:

参数 说明
pn 请求的页码
rn 每次请求返回的数据量
_format 请求返回的数据格式
tab 请求的标签类型

那么,相应的代码可以改为:

import requests
page = 1
keyword = 'xxxxx' # xxxxx为搜索的关键字
url = 'https://haokan.baidu.com/videoui/page/search?pn=%d&rn=10&_format=json&tab=video&query=%s'%(page,keyword)
res = requests.get(url)
data = res.json()

至此,视频搜索部分的分析算是告于段落了。

2.视频下载

视频下载的思路也很清晰,只需进入播放视频的界面找到相应的视频原文件地址即可。
小手一点,我们便进到了一个视频的播放界面,我们可以发现其URL很有规律:它通过一个vid的参数来指向的相应视频。

用python制作个视频下载器

右键视频播放页面查看源码(或者通过右键视频检查元素也可),我们可以找到视频播放的src,其对应的正则表达式为:

p = '<video class="video" src=(.*?)>'

那么,我们可以定义一个函数来解析视频的原文件地址:

def get_videoUrl(vid):
 '''
 提取视频信息中的视频源地址
 '''
 res = requests.get('https://haokan.baidu.com/v?vid=%s'%vid)
 html = res.text
 videoUrl = re.findall('<video class="video" src=(.*?)>',html)[0]
 return videoUrl

输入视频的id参数,将返回视频的真正文件地址。有了视频的地址,要下载视频便是信手拈来:

def download_video(vid):
 '''
 下载视频文件
 '''
 savePath = 'xxxxx.mp4' # 定义存储的文件名
 videoUrl = get_videoUrl(vid) # 获取视频下载地址 
 res = requests.get(videoUrl)
 with open(savePath,'wb') as f:
 f.write(res.content)

至此,我们已经可以根据关键字搜索相关的视频,并且可以把视频下载到本地了。这也意味着:关于本次视频下载爬虫的介绍也就结束了,剩下的就是根据自己实际需求对代码进行包装即可。

二、我的代码

这里提供一个我自己的代码,仅供参考:

# =============================================================================
# 好看视频_v0.1
# =============================================================================
import re
import os
import time
import queue
import requests
import threading
import pandas as pd

class Haokan:
 def __init__(self):
 self.url = 'https://haokan.baidu.com/videoui/page/search?pn=%d&rn=20&_format=json&tab=video&query=%s'
 self.headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
  'Connection': 'keep-alive',
  'Upgrade-Insecure-Requests': '1',
  'TE': 'Trailers',
 }
 self.savaPath = './videos' # 视频存储路径
 
 def get_info(self,keywords,page):
 '''
 搜索关键字,获取相关视频信息
 '''
 self.result = [] # 相关视频信息
 for p in range(1,page+1):
  res = requests.get(self.url%(p,keywords),headers=self.headers)
  data = res.json()['data']['response']
  videos = data['list']
  self.result.extend(videos)
  print('"第%d页"爬取完成!'%(p+1))
 self.result = pd.DataFrame(self.result)
 self.result.to_excel('%s.xlsx'%keywords,index=False)
 # 定义队列,用于多线程下载视频
 self.url_queue = queue.Queue() 
 for vid,url in zip(self.result['vid'],self.result['url']):
  self.url_queue.put((vid,url))
 
 def get_videoUrl(self,url):
 '''
 提取视频信息中的视频源地址
 '''
 res = requests.get(url,headers=self.headers)
 html = res.text
 videoUrl = re.findall('<video class="video" src=(.*?)>',html)[0]
 return videoUrl
 
 def download_video(self,videoId,videoUrl):
 '''
 下载视频文件
 '''
 # 如果视频存储目录不存在则创建
 if not os.path.exists(self.savaPath):
  os.mkdir(self.savaPath)
 res = requests.get(videoUrl,headers=self.headers)
 with open('%s/%s.mp4'%(self.savaPath,videoId),'wb') as f:
  f.write(res.content)
  
 def run(self):
 while not self.url_queue.empty():
  t_s = time.time()
  vid,url = self.url_queue.get()
  try:
  video_url = self.get_videoUrl(url)
  self.download_video(vid,video_url)
  except:
  print('"%s.mp4"下载失败!'%vid)
  continue
  t_e = time.time()
  print('"%s.mp4"下载完成!(用时%.2fs)'%(vid,t_e-t_s))
  
if __name__ == "__main__":
 keywords = '多啦A梦'
 page = 1 # 爬取页数,每页20条信息
 t_s = time.time()
 haokan = Haokan()
 haokan.get_info(keywords,page)
 N_thread = 3 # 线程数
 thread_list = []
 for i in range(N_thread):
 thread_list.append(threading.Thread(target=haokan.run))
 for t in thread_list:
 t.start()
 for t in thread_list:
 t.join()
 t_e = time.time()
 print('任务完成!(用时%.2fs)'%(t_e-t_s))

运行代码,可以看到小频频全都来到我的碗里了?~

用python制作个视频下载器

写在最后

今天分享的视频下载算是最基础的了,它宛如一位慈祥的老奶奶,慈眉善目,面带笑容。它没有各种繁琐的反爬机制(甚至连headers都不进行验证),而且数据返回的格式也是极其友好的,就连视频格式也显得如此的温柔。

我相信在“她”的陪伴下,我们可以走好学习爬虫的第一步。纵使日后我们还将面临IP验证、参数验证、验证码、行为检测、瑞数系统等等诸多反爬考验,也许还需应对视频格式转换等挑战。
但是,请记住kimol君将始终陪伴在你们身边~

最后,感谢各位大大的耐心阅读,咋们下次再会~

以上就是用python制作个视频下载器的详细内容,更多关于python 制作视频下载器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中的map、reduce和filter浅析
Apr 26 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
python书籍信息爬虫实例
Mar 19 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
python傅里叶变换FFT绘制频谱图
Jul 19 Python
Django 外键的使用方法详解
Jul 19 Python
python多进程重复加载的解决方式
Dec 13 Python
详解Python实现进度条的4种方式
Jan 15 Python
python如何实时获取tcpdump输出
Sep 16 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python基于pexpect库自动获取日志信息
Feb 01 #Python
Python入门基础之数字字符串与列表
Feb 01 #Python
Pyecharts 中Geo函数常用参数的用法说明
Feb 01 #Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 #Python
python实现代码审查自动回复消息
Feb 01 #Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 #Python
python 列表推导和生成器表达式的使用
Feb 01 #Python
You might like
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
vue-test-utils初使用详解
2019/05/23 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
matplotlib绘图实例演示标记路径
2018/01/23 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
详解Python中的测试工具
2019/06/09 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
违反课堂纪律检讨书
2014/01/19 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
英语课外活动总结
2014/08/27 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
Go语言怎么使用变长参数函数
2022/07/15 Golang