使用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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python中用于检查英文字母大写的isupper()方法
May 19 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
Python基于pandas实现json格式转换成dataframe的方法
Jun 22 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
Python上下文管理器用法及实例解析
Nov 11 Python
pycharm修改file type方式
Nov 19 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
pycharm快捷键汇总
Feb 14 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
python 爬虫如何正确的使用cookie
Oct 27 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
Terran兵种介绍
2020/03/14 星际争霸
PHP中str_replace函数使用小结
2008/10/11 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
js使用eval解析json(js中使用json)
2014/01/17 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python使用MD5加密字符串示例
2014/08/22 Python
Python3实现生成随机密码的方法
2014/08/23 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
python可以用哪些数据库
2020/06/22 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
美国礼品卡商城: Gift Card Mall
2017/08/25 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
应届生求职信范文
2014/05/26 职场文书
公司演讲稿开场白
2014/08/25 职场文书
委托书的写法
2014/09/16 职场文书
2014最新实习证明模板
2014/10/02 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python