简介

抖音,是一款可以拍短视频的音乐创意短视频社交软件,该软件于2016年9月上线,是一个专注年轻人的15秒音乐短视频社区。用户可以通过这款软件选择歌曲,拍摄15秒的音乐短视频,形成自己的作品。此APP已在Android各大应用商店和APP Store均有上线。

今天咱们就用Python爬取抖音视频

想要学习Python?Python学习交流群:683380553满足你的需求,资料都已经上传群文件流,可以自行下载!

准备:

环境:Python3.6+Windows

IDE:你开行就好,喜欢用哪个就用哪个

模块:

1 from splinter.driver.webdriver.chrome import Options, Chrome
2 from splinter.browser import Browser
3 from contextlib import closing
4 import requests, json, time, re, os, sys, time
5 from bs4 import BeautifulSoup

获得视频播放地址

  • 查询的用户ID

  • 视频名字列表

  • 视频链接列表

  • 用户昵称

def get_video_urls(self, user_id):+        video_names = []
+        video_urls = []
+        unique_id = ''
+        while unique_id != user_id:
+            search_url = 'https://api.amemv.com/aweme/v1/discover/search/?cursor=0&keyword=%s&count=10&type=1&retry_type=no_retry&iid=17900846586&device_id=34692364855&ac=wifi&channel=xiaomi&aid=1128&app_name=aweme&version_code=162&version_name=1.6.2&device_platform=android&ssmix=a&device_type=MI+5&device_brand=Xiaomi&os_api=24&os_version=7.0&uuid=861945034132187&openudid=dc451556fc0eeadb&manifest_version_code=162&resolution=1080*1920&dpi=480&update_version_code=1622' % user_id
+            req = requests.get(url = search_url, verify = False)
+            html = json.loads(req.text)
+            aweme_count = html['user_list'][0]['user_info']['aweme_count']
+            uid = html['user_list'][0]['user_info']['uid']
+            nickname = html['user_list'][0]['user_info']['nickname']
+            unique_id = html['user_list'][0]['user_info']['unique_id']
+        user_url = 'https://www.douyin.com/aweme/v1/aweme/post/?user_id=%s&max_cursor=0&count=%s' % (uid, aweme_count)
+        req = requests.get(url = user_url, verify = False)
+        html = json.loads(req.text)
+        i = 1
+        for each in html['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

获得带水印的视频播放地址

  • video_url:带水印的视频播放地址

  • download_url: 带水印的视频下载地址

def get_download_url(self, video_url):+        req = requests.get(url = video_url, verify = False)
+        bf = BeautifulSoup(req.text, 'lxml')
+        script = bf.find_all('script')[-1]
+        video_url_js = re.findall('var data = \[(.+)\];', str(script))[0]
+        video_html = json.loads(video_url_js)
+        download_url = video_html['video']['play_addr']['url_list'][0]
+        return download_url

视频下载

  • video_url: 带水印的视频地址

  • video_name: 视频名

  • watermark_flag: 是否下载不带水印的视频

def video_downloader(self, video_url, video_name, watermark_flag=True):
+        """
+        视频下载
+        Parameters:
+            video_url: 带水印的视频地址
+            video_name: 视频名
+            watermark_flag: 是否下载不带水印的视频
+        Returns:
+            无
+        """
+        size = 0
+        if watermark_flag == True:
+            video_url = self.remove_watermark(video_url)
+        else:
+            video_url = self.get_download_url(video_url)
+        with closing(requests.get(video_url, stream=True, verify = False)) as response:
+            chunk_size = 1024
+            content_size = int(response.headers['content-length'])
+            if response.status_code == 200:
+                sys.stdout.write('  [文件大小]:%0.2f MB\n' % (content_size / chunk_size / 1024))
+
+                with open(video_name, "wb") as file:
+                    for data in response.iter_content(chunk_size = chunk_size):
+                        file.write(data)
+                        size += len(data)
+                        file.flush()
+
+                        sys.stdout.write('  [下载进度]:%.2f%%' % float(size / content_size * 100) + '\r')
+                        sys.stdout.flush()

获得无水印的视频播放地址

def remove_watermark(self, video_url):
+        """
+        获得无水印的视频播放地址
+        Parameters:
+            video_url: 带水印的视频地址
+        Returns:
+            无水印的视频下载地址
+        """
+        self.driver.visit('http://douyin.iiilab.com/')
+        self.driver.find_by_tag('input').fill(video_url)
+        self.driver.find_by_xpath('//button[@class="btn btn-default"]').click()
+        html = self.driver.find_by_xpath('//div[@class="thumbnail"]/div/p')[0].html
+        bf = BeautifulSoup(html, 'lxml')
+        return bf.find('a').get('href')

下载视频

def run(self):
+        """
+        运行函数
+        Parameters:
+            None
+        Returns:
+            None
+        """
+        self.hello()
+        user_id = input('请输入ID(例如40103580):')
+        video_names, video_urls, nickname = self.get_video_urls(user_id)
+        if nickname not in os.listdir():
+            os.mkdir(nickname)
+        print('视频下载中:共有%d个作品!\n' % len(video_urls))
+        for num in range(len(video_urls)):
+            print('  解析第%d个视频链接 [%s] 中,请稍后!\n' % (num+1, video_urls[num]))
+            if '\\' in video_names[num]:
+                video_name = video_names[num].replace('\\', '')
+            elif '/' in video_names[num]:
+                video_name = video_names[num].replace('/', '')
+            else:
+                video_name = video_names[num]
+            self.video_downloader(video_urls[num], os.path.join(nickname, video_name))
+            print('\n')
+
+        print('下载完成!')

全部代码

+# -*- coding:utf-8 -*-想要学习Python?Python学习交流群:683380553满足你的需求,资料都已经上传群文件流,可以自行下载!
+from splinter.driver.webdriver.chrome import Options, Chrome
+from splinter.browser import Browser
+from contextlib import closing
+import requests, json, time, re, os, sys, time
+from bs4 import BeautifulSoup
+class DouYin(object):def __init__(self, width = 500, height = 300):
+        """
+        抖音App视频下载
+        """
+        # 无头浏览器
+        chrome_options = Options()
+        chrome_options.add_argument('user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"')
+        self.driver = Browser(driver_name='chrome', executable_path='D:/chromedriver', options=chrome_options, headless=True)
+def get_video_urls(self, user_id):
+        """
+        获得视频播放地址
+        Parameters:
+            user_id:查询的用户ID
+        Returns:
+            video_names: 视频名字列表
+            video_urls: 视频链接列表
+            nickname: 用户昵称
+        """
+        video_names = []
+        video_urls = []
+        unique_id = ''
+        while unique_id != user_id:
+            search_url = 'https://api.amemv.com/aweme/v1/discover/search/?cursor=0&keyword=%s&count=10&type=1&retry_type=no_retry&iid=17900846586&device_id=34692364855&ac=wifi&channel=xiaomi&aid=1128&app_name=aweme&version_code=162&version_name=1.6.2&device_platform=android&ssmix=a&device_type=MI+5&device_brand=Xiaomi&os_api=24&os_version=7.0&uuid=861945034132187&openudid=dc451556fc0eeadb&manifest_version_code=162&resolution=1080*1920&dpi=480&update_version_code=1622' % user_id
+            req = requests.get(url = search_url, verify = False)
+            html = json.loads(req.text)
+            aweme_count = html['user_list'][0]['user_info']['aweme_count']
+            uid = html['user_list'][0]['user_info']['uid']
+            nickname = html['user_list'][0]['user_info']['nickname']
+            unique_id = html['user_list'][0]['user_info']['unique_id']
+        user_url = 'https://www.douyin.com/aweme/v1/aweme/post/?user_id=%s&max_cursor=0&count=%s' % (uid, aweme_count)
+        req = requests.get(url = user_url, verify = False)
+        html = json.loads(req.text)
+        i = 1
+        for each in html['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
+def get_download_url(self, video_url):
+        """
+        获得带水印的视频播放地址
+        Parameters:
+            video_url:带水印的视频播放地址
+        Returns:
+            download_url: 带水印的视频下载地址
+        """
+        req = requests.get(url = video_url, verify = False)
+        bf = BeautifulSoup(req.text, 'lxml')
+        script = bf.find_all('script')[-1]
+        video_url_js = re.findall('var data = \[(.+)\];', str(script))[0]
+        video_html = json.loads(video_url_js)
+        download_url = video_html['video']['play_addr']['url_list'][0]
+        return download_url
+def video_downloader(self, video_url, video_name, watermark_flag=True):
+        """
+        视频下载
+        Parameters:
+            video_url: 带水印的视频地址
+            video_name: 视频名
+            watermark_flag: 是否下载不带水印的视频
+        Returns:
+            无
+        """
+        size = 0
+        if watermark_flag == True:
+            video_url = self.remove_watermark(video_url)
+        else:
+            video_url = self.get_download_url(video_url)
+        with closing(requests.get(video_url, stream=True, verify = False)) as response:
+            chunk_size = 1024
+            content_size = int(response.headers['content-length'])
+            if response.status_code == 200:
+                sys.stdout.write('  [文件大小]:%0.2f MB\n' % (content_size / chunk_size / 1024))
+
+                with open(video_name, "wb") as file:
+                    for data in response.iter_content(chunk_size = chunk_size):
+                        file.write(data)
+                        size += len(data)
+                        file.flush()
+
+                        sys.stdout.write('  [下载进度]:%.2f%%' % float(size / content_size * 100) + '\r')
+                        sys.stdout.flush()
+
+def remove_watermark(self, video_url):
+        """
+        获得无水印的视频播放地址
+        Parameters:
+            video_url: 带水印的视频地址
+        Returns:
+            无水印的视频下载地址
+        """
+        self.driver.visit('http://douyin.iiilab.com/')
+        self.driver.find_by_tag('input').fill(video_url)
+        self.driver.find_by_xpath('//button[@class="btn btn-default"]').click()
+        html = self.driver.find_by_xpath('//div[@class="thumbnail"]/div/p')[0].html
+        bf = BeautifulSoup(html, 'lxml')
+        return bf.find('a').get('href')
+def run(self):
+        """
+        运行函数
+        Parameters:
+            None
+        Returns:
+            None
+        """
+        self.hello()
+        user_id = input('请输入ID(例如40103580):')
+        video_names, video_urls, nickname = self.get_video_urls(user_id)
+        if nickname not in os.listdir():
+            os.mkdir(nickname)
+        print('视频下载中:共有%d个作品!\n' % len(video_urls))
+        for num in range(len(video_urls)):
+            print('  解析第%d个视频链接 [%s] 中,请稍后!\n' % (num+1, video_urls[num]))
+            if '\\' in video_names[num]:
+                video_name = video_names[num].replace('\\', '')
+            elif '/' in video_names[num]:
+                video_name = video_names[num].replace('/', '')
+            else:
+                video_name = video_names[num]
+            self.video_downloader(video_urls[num], os.path.join(nickname, video_name))
+            print('\n')
+
+        print('下载完成!')
+def hello(self):
+        """
+        打印欢迎界面
+        Parameters:
+            None
+        Returns:
+            None
+        """
+        print('*' * 100)
+        print('\t\t\t\t抖音App视频下载小助手')
+        print('\t\t作者:Python学习交流群:125240963')
+        print('*' * 100)
+
+
+if __name__ == '__main__':
+    douyin = DouYin()
+    douyin.run()

怎么用Python爬取抖音小视频? 资深程序员都这样爬取的(附源码)相关推荐

  1. mitmproxy+appium爬取抖音小视频

    mitmproxy+appium爬取抖音小视频 目标 自动化爬取抖音APP小视频,随机获取用户,下载五个小视频,结果以用户ID为单位保存至video目录 环境配置 见: 视频下载 dy_mitmdum ...

  2. 仿抖音短视频h5单页版htnl上传即可使用源码文件

    仿抖音短视频的模板 项目是前后端分离,前端采用uniapp开发,后端目前是用frphp临时搭建的接口,后续为了方便管理内容,会移植到极致cms上.现在也可丢到网站里当一个单页使用,无聊时可以刷一刷短视 ...

  3. python爬抖音短视频_python爬取抖音小视频

    import os,json,requests #伪装头 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) App ...

  4. 使用python爬取抖音app视频!谁说APP数据爬不了的!

    记录一下如何用python爬取app数据,本文以爬取抖音视频app为例. 编程工具:pycharm app抓包工具:mitmproxy app自动化工具:appium 运行环境:windows10 思 ...

  5. python3 爬虫实战:mitmproxy 对接 python 下载抖音小视频

    From:https://blog.csdn.net/Fan_shui/article/details/81461253 一.前言 前面我们已经用 appium 爬取了微信朋友圈,今天我们学习下 mi ...

  6. python好用 appium fiddler_python3 爬虫实战:mitmproxy 对接 python 下载抖音小视频

    一.前言 前面我们已经用 appium 爬取了微信朋友圈,今天我们学习下 mitmproxy,mitmproxy 是干什么的呢,它跟 charles 和 fiddler类似,是一个抓包工具,以控制台的 ...

  7. python批量删缩进_鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频?...

    鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频? 前言 半个月前,后台有个小伙伴问我,如何将视频中的音频提取出来,并且将声音转成文字写入到 word 中,正好接下来的 ...

  8. python3爬虫实战(三):mitmproxy对接python下载抖音小视频

    一.前言 前面我们已经用appium爬取了微信朋友圈,今天我们学习下mitmproxy,mitmproxy是干什么的呢,它跟charles和fiddler类似,是一个抓包工具,以控制台的形式显示,mi ...

  9. 资深程序员教你,用python入门的知识抓取抖音短视频,太厉害了

    抖音短视频可以说是当下最流行的自媒体平台,而python编程同样也是目前最流行的编程语言. 今天,就让一位大厂的资深程序员,用最简单的方式,使用python抓取抖音短视频. 到时候我会把所有的源代码都 ...

  10. 爬虫项目实战三:爬取抖音短视频

    爬取抖音网页版短视频 目标 项目准备 网站分析 反爬分析 每一页的链接分析 代码实现 效果显示 目标 爬取抖音短视频,批量下载到本地. 项目准备 软件:Pycharm 第三方库:requests,fa ...

最新文章

  1. innodb表空间结构
  2. 2016/07 — 周年记录
  3. 基础算法之快速排序Quick Sort
  4. Android中获取网络图片的三种方法
  5. SAP CRM呼叫中心polling and C4C notification polling
  6. YOLOv5算法详解
  7. Markdown——编辑器语法——字体、字号与颜色
  8. protobuf windows lib链接库生成
  9. 【英语学习】【WOTD】magniloquent 释义/词源/示例
  10. 用MATLAB编程课程设计,matlab课程设计报告---用Mtlab编程实现句柄图形应用
  11. sleep期间读取所有_java并发学习第四弹:走进JDK源码去了解sleep和join
  12. typeof的用法 typeof的返回值是一个字符串 返回的字符串类别
  13. [Bzoj2120]数颜色
  14. LaTeX Package cleveref: cleveref must be loaded after hyperref!. 的解决方案
  15. Win10--YOLOX训练和测试VOC格式数据
  16. Excel·VBA单元格区域行列数转换函数
  17. 计算机网络学习笔记(九)——网络层IP地址
  18. BCB中嵌入资源文件的研究
  19. python中怎么画一个机器猫_用python画机器猫--哆啦A梦,开干!
  20. 关于先有鸡还是先有蛋问题的科学的探讨

热门文章

  1. matplotlib报错:Glyph 25151 (\N{CJK UNIFIED IDEOGRAPH-623F}) missing from current font. func(*args)
  2. 计算机协同工作,计算机协同工作的几种关键技术
  3. java中求数组中最大值
  4. html毕业设计任务要求,毕业设计任务及进度安排|毕业设计进度安排
  5. 以XSUB、XPUB为例,浅谈ZeroMQ的传输桥接(转发代理)
  6. 段码液晶屏实现原理和需要注意的事项
  7. 性能测试工具篇(开源商业)
  8. 非智能手机通信录备份并还原至Android智能手机方法
  9. Zabbix 5.0.13 与阿里云企业邮箱告警
  10. 应用程序现代化权威指南