使用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 相关文章推荐
python发送邮件示例(支持中文邮件标题)
Feb 16 Python
Python实现统计单词出现的个数
May 28 Python
简述Python中的进程、线程、协程
Mar 18 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Django实现快速分页的方法实例
Oct 22 Python
50行Python代码实现人脸检测功能
Jan 23 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
python 反向输出字符串的方法
Jul 16 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
Selenium 滚动页面至元素可见的方法
Mar 18 Python
python Cartopy的基础使用详解
Nov 01 Python
python字典的元素访问实例详解
Jul 21 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
2014过年倒计时示例
2014/01/31 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
js获取视频时长代码
2014/04/10 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
js仿360开机效果
2019/12/26 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
简单理解Python中的装饰器
2015/07/31 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
python实现最长公共子序列
2018/05/22 Python
django解决订单并发问题【推荐】
2019/07/31 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
毕业生找工作的求职信范文
2013/12/24 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
农民工创业典型事迹
2014/01/25 职场文书
毕业自我评价
2014/02/05 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
保险专业求职信
2014/07/07 职场文书
法定代表人资格证明书
2014/09/11 职场文书
小学教学工作总结2015
2015/05/13 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
Java常用函数式接口总结
2021/06/29 Java/Android