python批量爬取下载抖音视频


Posted in Python onJune 17, 2019

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

import os
import requests
import re
import sys
import asyncio
import aiohttp

headers = {
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) '
         'Version/11.0 Mobile/15A372 Safari/604.1'
}

VIDEO_URLS, PAGE = [], 1


def get_info(url):
  """
  :param url: 用户的链接
  :return:返回name,dytk,user_id 参数
  """
  name = None
  dytk = None
  user_id = None
  try:
    response = requests.get(url, headers=headers)
    user_id = response.url.split('/')[5].split('?')[0]
    name = re.search(r'class="nickname">(.*?)<', response.text)[1]
    dytk = re.search(r"dytk: '(.*?)'", response.text)[1]
  except (TypeError, IndexError):
    sys.stdout.write('Waring:输入的链接错误')
  except requests.exceptions:
    sys.stdout.write('Waring:链接错误')
  finally:
    return name, user_id, dytk


def make_dir(name):
  """
  建立文件夹
  :param name: 用户名称
  :return:
  """
  if not os.path.isdir(name):
    os.mkdir(name)
  else:
    pass


def get_all_video(user_id, max_cursor, dytk):
  """
  获取视频的地址
  :param user_id:
  :param max_cursor:
  :param dytk:
  :return:
  """
  url = "https://www.amemv.com/aweme/v1/aweme/post/?"
  params = {'user_id': user_id,
       'count': 21,
       'max_cursor': max_cursor,
       'dytk': dytk}
  try:
    response = requests.get(url=url, params=params, headers=headers)
    if response.status_code == 200:
      datas = response.json()
      for data in datas['aweme_list']:
        name = data.get('share_info').get('share_desc')
        url = data.get('video').get('play_addr').get('url_list')[0].replace('playwm', 'play')
        VIDEO_URLS.append([name, url])
      if datas['has_more'] == 1 and datas.get('max_cursor') != 0:
        global PAGE
        print(f'收集第{PAGE}页视频')
        PAGE += 1
        return get_all_video(user_id, datas.get('max_cursor'), dytk)
      else:
        print('收集完成')
        return VIDEO_URLS
    else:
      print('状态码:', response.status_code)
      return None
  except Exception as e:
    print('Waring:', e)
    return


async def download_video(index, name, video_name, url):
  """
  下载视频
  :param index:  视频id
  :param name:  用户名称
  :param video_name: 视频名称
  :param url:   下载url
  :return:
  """
  print(f'正在下载第{index}个视频:{video_name}')
  video_path = '{}/{}.mp4'.format(name, video_name)
  if not os.path.isfile(video_path):
    try:
      async with aiohttp.ClientSession() as session:
        async with session.get(url=url, headers=headers, ssl=False) as response:
          with open(video_path, 'wb') as f:
            while True:
              chunk = await response.content.read(1024)
              f.write(chunk)
              if not chunk:
                break
            print(f'下载完成第{index}个视频:{video_name}')
    except Exception as e:
      print('waring:download faild', video_name, e)
      return
  else:
    print('文件已存在')


def main():
  url = 'http://v.douyin.com/dEorkn/'
  name, user_id, dytk = get_info(url)
  if not (name, user_id, dytk):
    return
  make_dir(name)
  get_all_video(user_id, 0, dytk)
  print(f'{name}:总共有{len(VIDEO_URLS)}个视频')
  tasks = []
  for index, item in enumerate(VIDEO_URLS, 1):
    video_name = item[0]
    url = item[1]
    tasks.append(asyncio.ensure_future(download_video(index, name, video_name, url)))
  loop = asyncio.get_event_loop()
  loop.run_until_complete(asyncio.wait(tasks))
  loop.run_until_complete(asyncio.sleep(0))
  loop.close()
  print(f'{name}视频下载完成!')


if __name__ == '__main__':
  main()

python批量爬取下载抖音视频

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

Python 相关文章推荐
python实现给字典添加条目的方法
Sep 25 Python
Python的迭代器和生成器
Jul 29 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
python 队列详解及实例代码
Oct 18 Python
python高阶爬虫实战分析
Jul 29 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
Python基于requests实现模拟上传文件
Apr 21 Python
Python面向对象特殊属性及方法解析
Sep 16 Python
python 绘制场景热力图的示例
Sep 23 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
python Scrapy爬虫框架的使用
Jan 21 Python
Django url 路由匹配过程详解
Jan 22 Python
python批量下载抖音视频
Jun 17 #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
You might like
一步一步学习PHP(7) php 字符串相关应用
2010/03/05 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
python 字符串格式化代码
2013/03/17 Python
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
Django REST framwork的权限验证实例
2020/04/02 Python
用 Python 制作地球仪的方法
2020/04/24 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
2015年十一国庆节演讲稿
2015/03/20 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL