使用Python下载抖音各大V视频的思路详解


Posted in Python onFebruary 06, 2021

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

以下文章来源于Python七号 ,作者 somenzz

Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

https://space.bilibili.com/523606542

上次写了用 Python 批量下载知乎视频的方式,这次分享用 Python 批量下载抖音个人主页的全部无水印视频,本文重点不是提供一个好用的脚本,而是讲述如何写出这样的脚本,正所谓授人以鱼,不如授人以渔,所谓的爬虫,基本都是这个套路。

思路

先说下思路,要批量下载视频,可以先尝试成功下载一个,确定没有水印,然后在写一个循环进行批量下载。

难点:下载一个视频可能很简单,但下载多个就稍微有点复杂,需要抓取多个视频对应的 url,抖音这块做了防爬措施,只允许手机上看到个人主页的视频列表,电脑端的网页却看不到,这就需要抓取手机的 https 包,这里借助 Burpsuite 进行抓包。

使用Python下载抖音各大V视频的思路详解

这里用到了 Burpsuite ,因此我把自己常用的 Burpsuite 2.1.06 专业版放在了网盘里面,公众号「Python七号」回复「burp」获取,下载后运行start_burp.bat或sh start_burp.sh即可一键启动,无需购买许可,非常方便。

爬取单个视频

  • 找一个抖音视频链接,点击分享,复制链接,在电脑上用打开,然后打开开发者工具,点击 network 选项。
  • 刷新,看接口,找到返回值里有播放地址的接口:

使用Python下载抖音各大V视频的思路详解

这里面有个 play_addr,内部有个 urllist,我们复制这个 urllist[0] 在浏览器打开,网站跳转到了真正的播放地址,同时可以看到下载的按钮:

使用Python下载抖音各大V视频的思路详解

下载这个视频,发现是带水印的,如何下载到不带水印的视频呢?网上搜索了下,方法就是将上述 urllist[0] 中的 playwm 改成 play 就可以了。

然后开始写代码,获取这个 urllist[0],并下载

def get(share_url) -> dict:
  """
  share_url -> 抖音视频分享url
  返回格式 [{'url':'', 'title','format':'',},{}]
  """
  data = []
  headers = {
    'accept': 'application/json',
    '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'
  }
  api = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={item_id}"

  rep = requests.get(share_url, headers=headers, timeout=10)
  if rep.ok:
    # item_id
    item_id = re.findall(r'video/(\d+)', rep.url)
    if item_id:
      item_id = item_id[0]
      # video info
      rep = requests.get(api.format(item_id=item_id), headers=headers, timeout=10)
      if rep.ok and rep.json()["status_code"] == 0:
        info = rep.json()["item_list"][0]
        tmp = {}
        tmp["title"] = info["desc"]

        #去水印的视频链接
        play_url = info["video"]["play_addr"]["url_list"][0].replace('playwm', 'play')
        tmp["url"] = play_url
        tmp["format"] = 'mp4'
       def get(share_url) -> dict:
  """
  share_url -> 抖音视频分享url
  返回格式 [{'url':'', 'title','format':'',},{}]
  """
  data = []
  headers = {
    'accept': 'application/json',
    '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'
  }
  api = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={item_id}"

  rep = requests.get(share_url, headers=headers, timeout=10)
  if rep.ok:
    # item_id
    item_id = re.findall(r'video/(\d+)', rep.url)
    if item_id:
      item_id = item_id[0]
      # video info
      rep = requests.get(api.format(item_id=item_id), headers=headers, timeout=10)
      if rep.ok and rep.json()["status_code"] == 0:
        info = rep.json()["item_list"][0]
        tmp = {}
        tmp["title"] = info["desc"]

        #去水印的视频链接
        play_url = info["video"]["play_addr"]["url_list"][0].replace('playwm', 'play')
        tmp["url"] = play_url
        tmp["format"] = 'mp4'
        data.append(tmp)

  return data

if __name__ =='__main__':
  videos = get('https://www.iesdouyin.com/share/video/6920538027345415431/?region=&mid=6920538030852885262&u_code=48&titleType=title&did=0&iid=0')
  for video in videos:
    downloader.download(video['url'],video['title'],video['format'],'./download') data.append(tmp)

  return data

if __name__ =='__main__':
  videos = get('https://www.iesdouyin.com/share/video/6920538027345415431/?region=&mid=6920538030852885262&u_code=48&titleType=title&did=0&iid=0')
  for video in videos:
    downloader.download(video['url'],video['title'],video['format'],'./download')

这里 downloader.download 函数,与前文知乎视频下载 里的函数一样,这里就不贴代码了。

获取个人主页视频链接

前两步已经实现了单个抖音视频的无水印下载,现在我们要做的就是找到大量的这种链接,直接循环就可以了。

任意打开一个大 V 的个人主页,分享,复制链接,使用浏览器打开,一个视频也看不到,而使用抖音 App 就可以看到:

使用Python下载抖音各大V视频的思路详解

浏览器

使用Python下载抖音各大V视频的思路详解

抖音APP

说明抖音做了一定的限制,防止从浏览器看到多个视频的信息。这时就需要学会从手机 APP 来抓包,看看手机上的 http 请求是怎么发起的,然后使用程序来模拟。

我一直在用的 BurpSuite(下面简称 Burp) 非常好用,这里顺便分享下如何使用:

1、运行 Burp

下载后运行start_burp.bat或sh start_burp.sh来启动 Burp,然后打开代理设置,绑定到运行 Burp 的机器 IP,如下图所示:

使用Python下载抖音各大V视频的思路详解

注意不要设置 ip 为 127.0.0.1,这样设置的话,只有本地请求可以使用代理,手机无法连接此代理。

2、手机设置代理

手机与电脑连接同一 wifi,IPhone 的操作如下:然后进入设置-> 无线局域网 -> 点击同一 wifi 右边的 information 符号,然后下拉,点击配置代理,配置和 BurpSuite 一样的 ip 和端口。Android 的手机的设置也差不多。至此可以在 BurpSuite 上抓取手机的 http 流量。

3、手机下载 Burp 的证书,并设置信任

手机浏览器 进入 http://burp。点击 CA 下载证书。设置->通用->描述文件->点击 PortSwigger CA->安装设置->通用->关于本机->证书信任设置,将 BurpSuite 的证书开启

这样就可以抓取手机上发起的 https 包了。

4、设置 BurpSuite 中断

使用Python下载抖音各大V视频的思路详解

这一步骤设置之后,手机上的请求会在这里阻塞,你可以放行选择放行,或修改数据包后放行,也可以发往 repeater,以便后续重放请求,因此来自前端的请求是不可信的。

现在打开手机上的抖音 App,这里便会出现大量的请求阻塞在这里,我们选择放行,会发现抖音 App 里的数据一步一步的出现。快刷到个人主页的视频之前,将请求发到 Repeater,如下图所示:

使用Python下载抖音各大V视频的思路详解

然后打开 BurpSuite 的 Repeater 选项卡,就可以看到刚才发过来的请求,这时我们选择重放,看数据,决定我们需要使用的接口,如下图所示:

使用Python下载抖音各大V视频的思路详解

发现这个接口满足请求,这里可以看到接口的 url,headers 的各种参数,headers 中的 User-Agent 参数,是区分客户端是浏览器还是 App 的重要标识,因此就可以写代码来模拟请求,进而获取需要的批量下载链接。

由于 url 中的参数非常多,有些是固定不变的,有些随着不同人的主页参数会发生变化,如果仅仅是自己使用,可以简单的通过正则表达式来提取这些 url 链接,然后进行批量下载就可以了。

如果是想写好一个脚本供别人使用,那么就需要做更多的工作,比如说,需要查看更多的 api,以便确定 url 及 headers 中的参数是如何获取或生成的,然后写脚本自动化这一过程,有些情况下,还涉及到加密混淆等反爬措施,这里就不再展开了,请感兴趣的读者自行探索。

最后的话

爬取视频的关键在于找到视频的播放地址,有了播放地址,即使不写代码,也可以使用浏览器下载,寻找播放地址还不够,要考虑是否能去水印,如果要批量下载,那就要知道如何获取更多的视频链接,在浏览器抓取不到的时候,考虑使用 BurpSuite 抓取手机的流量包,进一步提取接口的数据,或模拟手机请求,对搞爬虫的同学,BurpSuite 是一个瑞士军刀,非常实用。

如果本文对你有所帮助,请点个赞或再看吧,谢谢支持。

到此这篇关于使用Python下载抖音各大V视频的思路详解的文章就介绍到这了,更多相关Python下载抖音视频内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
videocapture库制作python视频高速传输程序
Dec 23 Python
Python中列表、字典、元组、集合数据结构整理
Nov 20 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
Python requests发送post请求的一些疑点
May 20 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
PyQt5实现简易计算器
May 30 Python
python3实现猜数字游戏
Dec 07 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
python 中xpath爬虫实例详解
Aug 26 Python
tensorflow 环境变量设置方式
Feb 06 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
Pytorch实验常用代码段汇总
Nov 19 Python
python wsgiref源码解析
Feb 06 #Python
Python 中的函数装饰器和闭包详解
Feb 06 #Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 #Python
python 利用matplotlib在3D空间中绘制平面的案例
Feb 06 #Python
PyQt5通过信号实现MVC的示例
Feb 06 #Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 #Python
python 利用panda 实现列联表(交叉表)
Feb 06 #Python
You might like
php session 写入数据库
2016/02/13 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
js压缩利器
2007/02/20 Javascript
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
微信小程序实现锚点功能
2019/11/20 Javascript
python计算时间差的方法
2015/05/20 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
python实现ping命令小程序
2020/12/28 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
卡特教练观后感
2015/06/08 职场文书
修改并编译golang源码的操作步骤
2021/07/25 Golang
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android