python批量下载抖音视频


Posted in Python onJune 17, 2019

本文实例为大家分享了python批量下载抖音视频的具体代码,供大家参考,具体内容如下

知识储备:博主是在Pycharm下进行的
文件夹:dou_ying

python批量下载抖音视频

1、在文件夹doy_ying下新建第一个文件:dou_ying_video_download.py

代码:

# coding=utf-8
"""
@author: jiajiknag
程序功能:批量下载抖音视频
"""
import requests
import bs4
import os
import json
import re
import sys
import time
# 如果一个对象没有实现上下文,我们就不能把它用于with语句。这个时候,可以用closing()来把该对象变为上下文对象。
# closing-将任意对象变为上下文对象,并支持with语句。
from contextlib import closing
# Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库
# urllib3.disable_warnings()禁用urllib3警告的方法
requests.packages.urllib3.disable_warnings()
# 创建类Sipder()
class Spider():
 def __init__(self):
  # UA对照表:https://blog.csdn.net/time888/article/details/72822729
  self.headers = {
      # 用户代理:用于浏览器识别的,可以看出自己系统版本,浏览器,浏览器内核等
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
      }
  # 输出信息-视频信息
  print('[INFO]:Douyin(抖音) App Video downloader...')
  print('[Version]: V1.0')
  print('[Author]: Jiajikang')

 # 创建函数run():外部调用运行
 def run(self):
  # 输入ID地址(爬去某人抖音视频的抖音号)
  user_id = input('Enter the ID:')
  try:
   # 因为抖音号是数字所以使用int()验证是否是数字
   int(user_id)
  # 输入错误时输出except下的语句
  except:
   print('[Error]:ID error...')
   return
  video_names, video_urls, nickname = self._parse_userID(user_id)
  # os.listdir()方法用于返回指定的文件夹包含的文件或文件夹的名字的列表
  if nickname not in os.listdir():
   # os.mkdir() 方法用于以数字权限模式创建目录
   os.mkdir(nickname)
  print('[INFO]:Number of Videos <%s>' % len(video_urls))
  for num in range(len(video_names)):
   # %d是一个占位符,标识一个字符串型的数据, %s也是一个占位符,标识一个字符串型的数据
   print('[INFO]:Parsing <No.%d> <Url:%s>' % (num+1, video_urls[num]))
   temp = video_names[num].replace('\\', '')
   video_name = temp.replace('/', '')
   # 调用函数_downloader()
   self._downloader(video_urls[num], os.path.join(nickname, video_name))
   print('\n')
  print('[INFO]:All Done...')

 # 创建函数_downloader()并含有参数:路径和视频的url-视频下载
 def _downloader(self, video_url, path):
  # 定义size并初始化为0
  size = 0
  # 定义一个变量download_url:利用函数_get_download_url()来获取视频url
  download_url = self._get_download_url(video_url)
  with closing(requests.get(download_url, headers=self.headers, stream=True, verify=False)) as response:
   chunk_size = 1024
   content_size = int(response.headers['content-length'])
   if response.status_code == 200:
    sys.stdout.write('[File Size]: %0.2f MB\n' % (content_size/chunk_size/1024))
    # 使用写入的方式打开,如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    with open(path, 'wb') as f:
     # 遍历获取数据
     for data in response.iter_content(chunk_size=chunk_size):
      # 向文件中写入指定的字符串data
      f.write(data)
      # 计算写入字符串的长度
      size += len(data)
      # flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
      f.flush()
      sys.stdout.write('[Progress]: %0.2f%%' % float(size/content_size*100) + '\r')
      sys.stdout.flush()


 # 创建函数_get_download_url()并含有形参video_url:获得视频下载地址
 def _get_download_url(self, video_url):
  # 获取视频的下载地址
  # Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。要想检查某个主机的 SSL 证书,你可以使用 verify 参数:
  # 定义变量res用来接收视频地址,verify 仅应用于主机证书
  res = requests.get(url=video_url, verify=False)
  # 将res.text 文件利用'lxml'解析成xml文件,了解lxml--https://blog.csdn.net/tanzuozhev/article/details/50442243
  soup = bs4.BeautifulSoup(res.text, 'lxml')
  # 使用find_all来获取网页中JavaScript中的script的变量;[-1]去除最后一个字符
  script = soup.find_all('script')[-1]
  # 定义变量date=正则表达式\[(.+)]\,[0]可以使其返回一个字典
  video_url_js = re.findall('var data = \[(.+)\];', str(script))[0]
  # 使用loads()下载
  html = json.loads(video_url_js)
  # 返回,使用[0]是返回一个字典
  return html['video']['play_addr']['url_list'][0]


 # 定义函数_parse_userID()且形参user_id;通过user_id获取该用户发布的所有视频
 def _parse_userID(self, user_id):
  # 获取所有视频
  video_names = []
  video_urls = []
  unique_id = ''
  # 当获取的id不是用户的id时:
  while unique_id != user_id:
   # 获取url-下载
   search_url = 'https://api.amemv.com/aweme/v1/discover/search/?keyword={}&count=10&type=1&aid=1128'.format(user_id)
   res = requests.get(url=search_url, verify=False)
   res_dic = json.loads(res.text)
   uid = res_dic['user_list'][0]['user_info']['uid']
   aweme_count = res_dic['user_list'][0]['user_info']['aweme_count']
   nickname = res_dic['user_list'][0]['user_info']['nickname']
   unique_id = res_dic['user_list'][0]['user_info']['unique_id']
  # 用户的url
  user_url = 'https://www.douyin.com/aweme/v1/aweme/post/?user_id={}&max_cursor=0&count={}'.format(uid, aweme_count)
  # 请求获取用户的url
  res = requests.get(url=user_url, verify=False)
  # 下载后去的url转换的文本
  res_dic = json.loads(res.text)
  i = 1
  # 遍历下载的文本
  for each in res_dic['aweme_list']:
   share_desc = each['share_info']['share_desc']
   if '抖音-原创音乐短视频社区' == share_desc:
    video_names.append(str(i) + '.mp4')
    i += 1
   else:
    video_names.append(share_desc + '.mp4')
   video_urls.append(each['share_info']['share_url'])
  return video_names, video_urls, nickname

""" 
if __name__ == '__main__':
 # 创建对象
 sp = Spider()
 sp.run()
"""

温馨提示: 有些库是要自己去下载,一般使用命令在提示符下输入:pip install 自己要下载的库,如下图是博主下载的。

python批量下载抖音视频

2、在文件夹doy_ying下新建第二个文件:run.py

代码:

# coding=utf-8
"""
@author: jiajiknag
程序功能: 测试抖音视频的下载
"""
from dou_ying_video_download import Spider
if __name__ == '__main__':
 # 创建类Spider()对象
 sp = Spider()
 # 运行开始下载
 sp.run()

3、结果

这是我在抖音中随便找的一个发布抖音视频比较少的来测试一下,以及我还下载了自己的抖音

python批量下载抖音视频python批量下载抖音视频

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 创建子进程模块subprocess详解
Apr 08 Python
通过Python来使用七牛云存储的方法详解
Aug 07 Python
python设计模式大全
Jun 27 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
Mar 16 Python
Python实现统计文本文件字数的方法
May 05 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
python求平均数、方差、中位数的例子
Aug 22 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 Python
Python爬虫HTPP请求方法有哪些
Jun 03 Python
OpenCV 图像梯度的实现方法
Jul 25 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 #Python
python文本数据处理学习笔记详解
Jun 17 #Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 #Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 #Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 #Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 #Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 #Python
You might like
PHP 处理图片的类实现代码
2009/10/23 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
PHP之header函数详解
2021/03/02 PHP
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
浅谈Python基础之I/O模型
2017/05/11 Python
Python 函数返回值的示例代码
2019/03/11 Python
Python 中@property的用法详解
2020/01/15 Python
Django ModelForm操作及验证方式
2020/03/30 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
Notino法国:购买香水和化妆品
2019/04/15 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
六十大寿答谢词
2014/01/12 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫