Python爬虫学习教程,批量爬取下载抖音视频

这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

项目源码展示:

  1 ‘‘‘
  2 在学习过程中有什么不懂得可以加我的
  3 python学习交流扣扣qun,934109170
  4 群里有不错的学习教程、开发工具与电子书籍。
  5 与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容。
  6 ‘‘‘
  7 # -*- coding:utf-8 -*-
  8 from contextlib import closing
  9 import requests, json, re, os, sys, random
 10 from ipaddress import ip_address
 11 from subprocess import Popen, PIPE
 12 import urllib
 13 class DouYin(object):
 14  def __init__(self, width = 500, height = 300):
 15  """
 16  抖音App视频下载
 17  """
 18  rip = ip_address(‘0.0.0.0‘)
 19  while rip.is_private:
 20   rip = ip_address(‘.‘.join(map(str, (random.randint(0, 255) for _ in range(4)))))
 21  self.headers = {
 22   ‘accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8‘,
 23   ‘accept-encoding‘: ‘gzip, deflate, br‘,
 24   ‘accept-language‘: ‘zh-CN,zh;q=0.9‘,
 25   ‘pragma‘: ‘no-cache‘,
 26   ‘cache-control‘: ‘no-cache‘,
 27   ‘upgrade-insecure-requests‘: ‘1‘,
 28   ‘user-agent‘: ‘Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; MI 4S Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.1.3‘,
 29   ‘X-Real-IP‘: str(rip),
 30   ‘X-Forwarded-For‘: str(rip),
 31  }
 32  def get_video_urls(self, user_id, type_flag=‘f‘):
 33  """
 34  获得视频播放地址
 35  Parameters:
 36   user_id:查询的用户UID
 37  Returns:
 38   video_names: 视频名字列表
 39   video_urls: 视频链接列表
 40   nickname: 用户昵称
 41  """
 42  video_names = []
 43  video_urls = []
 44  share_urls = []
 45  max_cursor = 0
 46  has_more = 1
 47  i = 0
 48  share_user_url = ‘https://www.douyin.com/share/user/%s‘ % user_id
 49  share_user = requests.get(share_user_url, headers=self.headers)
 50  while share_user.status_code != 200:
 51   share_user = requests.get(share_user_url, headers=self.headers)
 52  _dytk_re = re.compile(r"dytk\s*:\s*‘(.+)‘")
 53  dytk = _dytk_re.search(share_user.text).group(1)
 54  _nickname_re = re.compile(r‘<p class="nickname">(.+?)<\/p>‘)
 55  nickname = _nickname_re.search(share_user.text).group(1)
 56  urllib.request.urlretrieve(‘https://raw.githubusercontent.com/Jack-Cherish/python-spider/master/douyin/fuck-byted-acrawler.js‘, ‘fuck-byted-acrawler.js‘)
 57  try:
 58   Popen([‘node‘, ‘-v‘], stdout=PIPE, stderr=PIPE).communicate()
 59  except (OSError, IOError) as err:
 60   print(‘请先安装 node.js: https://nodejs.org/‘)
 61   sys.exit()
 62  user_url_prefix = ‘https://www.douyin.com/aweme/v1/aweme/favorite‘ if type_flag == ‘f‘ else ‘https://www.douyin.com/aweme/v1/aweme/post‘
 63  print(‘解析视频链接中‘)
 64  while has_more != 0:
 65   process = Popen([‘node‘, ‘fuck-byted-acrawler.js‘, str(user_id)], stdout=PIPE, stderr=PIPE)
 66   _sign = process.communicate()[0].decode().strip(‘\n‘).strip(‘\r‘)
 67   user_url = user_url_prefix + ‘/?user_id=%s&max_cursor=%s&count=21&aid=1128&_signature=%s&dytk=%s‘ % (user_id, max_cursor, _sign, dytk)
 68   req = requests.get(user_url, headers=self.headers)
 69   while req.status_code != 200:
 70   req = requests.get(user_url, headers=self.headers)
 71   html = json.loads(req.text)
 72   try:
 73   while html[‘aweme_list‘] == []:
 74    i = i + 1
 75    sys.stdout.write(‘已重新链接‘ + str(i) + ‘次 (若超过100次,请ctrl+c强制停止再重来)‘ + ‘\r‘)
 76    sys.stdout.flush()
 77    process = Popen([‘node‘, ‘fuck-byted-acrawler.js‘, str(user_id)], stdout=PIPE, stderr=PIPE)
 78    _sign = process.communicate()[0].decode().strip(‘\n‘).strip(‘\r‘)
 79    user_url = user_url_prefix + ‘/?user_id=%s&max_cursor=%s&count=21&aid=1128&_signature=%s&dytk=%s‘ % (user_id, max_cursor, _sign, dytk)
 80    req = requests.get(user_url, headers=self.headers)
 81    while req.status_code != 200:
 82    req = requests.get(user_url, headers=self.headers)
 83    html = json.loads(req.text)
 84   except:
 85   pass
 86   i = 0
 87   for each in html[‘aweme_list‘]:
 88   try:
 89    url = ‘https://aweme.snssdk.com/aweme/v1/play/?video_id=%s&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0‘
 90    uri = each[‘video‘][‘play_addr‘][‘uri‘]
 91    video_url = url % uri
 92   except:
 93    continue
 94   share_desc = each[‘share_info‘][‘share_desc‘]
 95   if os.name == ‘nt‘:
 96    for c in r‘\/:*?"<>|‘:
 97    nickname = nickname.replace(c, ‘‘).strip().strip(‘\.‘)
 98    share_desc = share_desc.replace(c, ‘‘).strip()
 99   share_id = each[‘aweme_id‘]
100   if share_desc in [‘抖音-原创音乐短视频社区‘, ‘TikTok‘, ‘‘]:
101    video_names.append(share_id + ‘.mp4‘)
102   else:
103    video_names.append(share_id + ‘-‘ + share_desc + ‘.mp4‘)
104   share_urls.append(each[‘share_info‘][‘share_url‘])
105   video_urls.append(video_url)
106   max_cursor = html[‘max_cursor‘]
107   has_more = html[‘has_more‘]
108  return video_names, video_urls, share_urls, nickname
109  def get_download_url(self, video_url, watermark_flag):
110  """
111  获得带水印的视频播放地址
112  Parameters:
113   video_url:带水印的视频播放地址
114  Returns:
115   download_url: 带水印的视频下载地址
116  """
117  # 带水印视频
118  if watermark_flag == True:
119   download_url = video_url.replace(‘/play/‘, ‘/playwm/‘)
120  # 无水印视频
121  else:
122   download_url = video_url.replace(‘/playwm/‘, ‘/play/‘)
123  return download_url
124  def video_downloader(self, video_url, video_name, watermark_flag=False):
125  """
126  视频下载
127  Parameters:
128   video_url: 带水印的视频地址
129   video_name: 视频名
130   watermark_flag: 是否下载带水印的视频
131  Returns:
132   无
133  """
134  size = 0
135  video_url = self.get_download_url(video_url, watermark_flag=watermark_flag)
136  with closing(requests.get(video_url, headers=self.headers, stream=True)) as response:
137   chunk_size = 1024
138   content_size = int(response.headers[‘content-length‘])
139   if response.status_code == 200:
140   sys.stdout.write(‘ [文件大小]:%0.2f MB\n‘ % (content_size / chunk_size / 1024))
141   with open(video_name, ‘wb‘) as file:
142    for data in response.iter_content(chunk_size = chunk_size):
143    file.write(data)
144    size += len(data)
145    file.flush()
146    sys.stdout.write(‘ [下载进度]:%.2f%%‘ % float(size / content_size * 100) + ‘\r‘)
147    sys.stdout.flush()
148  def run(self):
149  """
150  运行函数
151  Parameters:
152   None
153  Returns:
154   None
155  """
156  self.hello()
157  print(‘搜索api需要登录,暂时使用UID下载\n分享用户页面,用浏览器打开短链接,原始链接中/share/user/后的数字即是UID‘)
158  user_id = input(‘请输入ID (例如95006183):‘)
159  user_id = user_id if user_id else ‘95006183‘
160  watermark_flag = input(‘是否下载带水印的视频 (0-否(默认), 1-是):‘)
161  watermark_flag = watermark_flag if watermark_flag!=‘‘ else ‘0‘
162  watermark_flag = bool(int(watermark_flag))
163  type_flag = input(‘f-收藏的(默认), p-上传的:‘)
164  type_flag = type_flag if type_flag!=‘‘ else ‘f‘
165  save_dir = input(‘保存路径 (例如"E:/Download/", 默认"./Download/"):‘)
166  save_dir = save_dir if save_dir else "./Download/"
167  video_names, video_urls, share_urls, nickname = self.get_video_urls(user_id, type_flag)
168  nickname_dir = os.path.join(save_dir, nickname)
169  if not os.path.exists(save_dir):
170   os.makedirs(save_dir)
171  if nickname not in os.listdir(save_dir):
172   os.mkdir(nickname_dir)
173  if type_flag == ‘f‘:
174   if ‘favorite‘ not in os.listdir(nickname_dir):
175   os.mkdir(os.path.join(nickname_dir, ‘favorite‘))
176  print(‘视频下载中:共有%d个作品!\n‘ % len(video_urls))
177  for num in range(len(video_urls)):
178   print(‘ 解析第%d个视频链接 [%s] 中,请稍后!\n‘ % (num + 1, share_urls[num]))
179   if ‘\\‘ in video_names[num]:
180   video_name = video_names[num].replace(‘\\‘, ‘‘)
181   elif ‘/‘ in video_names[num]:
182   video_name = video_names[num].replace(‘/‘, ‘‘)
183   else:
184   video_name = video_names[num]
185   video_path = os.path.join(nickname_dir, video_name) if type_flag!=‘f‘ else os.path.join(nickname_dir, ‘favorite‘, video_name)
186   if os.path.isfile(video_path):
187   print(‘视频已存在‘)
188   else:
189   self.video_downloader(video_urls[num], video_path, watermark_flag)
190   print(‘\n‘)
191  print(‘下载完成!‘)
192  def hello(self):
193  """
194  打印欢迎界面
195  Parameters:
196   None
197  Returns:
198   None
199  """
200  print(‘*‘ * 100)
201  print(‘\t\t\t\t抖音App视频下载小助手‘)
202  print(‘\t\t作者:Jack Cui、steven7851‘)
203  print(‘*‘ * 100)
204 if __name__ == ‘__main__‘:
205  douyin = DouYin()
206  douyin.run()

运行结果:

爬取结果截图

原文地址:https://www.cnblogs.com/xiaoyiq/p/11192969.html

时间: 2024-10-12 09:09:58

Python爬虫学习教程,批量爬取下载抖音视频的相关文章

Python爬虫新手教程:爬取了6574篇文章,告诉你产品经理在看什么!

作为互联网界的两个对立的物种,产品汪与程序猿似乎就像一对天生的死对头:但是在产品开发链条上紧密合作的双方,只有通力合作,才能更好地推动项目发展.那么产品经理平日里面都在看那些文章呢?我们程序猿该如何投其所好呢?我爬取了人人都是产品经理栏目下的所有文章,看看产品经理都喜欢看什么. 1. 分析背景 1.1. 为什么选择「人人都是产品经理」 人人都是产品经理是以产品经理.运营为核心的学习.交流.分享平台,集媒体.培训.招聘.社群为一体,全方位服务产品人和运营人,成立8年举办在线讲座500+期,线下分享

Python爬虫实战教程:爬取网易新闻;爬虫精选 高手技巧

前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. stars声明很多小伙伴学习Python过程中会遇到各种烦恼问题解决不了.为此小编建了个群 624440745. 不懂的问题有老司机解决里面还有最新Python教程项目可拿,,一起相互监督共同进步! 此文属于入门级级别的爬虫,老司机们就不用看了. 本次主要是爬取网易新闻,包括新闻标题.作者.来源.发布时间.新闻正文. 首先我们打开163的网站,我们随意选择一个分类,这里我选

Python爬虫实战二之爬取百度贴吧帖子

大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路. 2016/12/2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:ht

转 Python爬虫实战二之爬取百度贴吧帖子

静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件

用Python全自动下载抖音视频!

/ 01 / Charles 用Charles来找视频的API接口,具体操作和之前当当网那个案例一样,不细说. 这里通过滑动抖音App,可以获取到视频的请求信息. 通过多次实验,发现链接的后面是会不停的改变,只有链接的前头始终不变,即「http://v1-dy」「http://v6-dy」「http://v9-dy」不变. 所以在写脚本的时候,可以以这些信息做为链接开头. / 02 / mitmproxy 利用mitmproxy中的mitmdump组件,对接Python脚本,用Python实现监

python爬虫学习教程之兼职网数据爬取

源码分享: 可以对着代码练习,学习编程一定要多动手练习. 代码运行效果截图 学习python.python爬虫过程中有不懂的可以加入我的python零基础系统学习交流秋秋qun:前面是934,中间109,后面是170,与你分享Python企业当下人才需求及怎么从零基础学习Python,和学习什么内容.相关学习视频资料.开发工具都有分享! 原文地址:https://www.cnblogs.com/xiaoxiany/p/11072510.html

python3 爬虫学习-根据关键词爬取百度百科内容

小白编了好久才写出来,记录一下免得之后再用的时候都忘了还得重新学~ 学习爬虫最开始是学习了慕课上的python课程,然后学习了慕课和网易云上的爬虫教程.这两个自己去查一下就好了~ 开始还比较费劲,毕竟熟悉需要时间么,而且python也不太熟悉. 关于python版本:我一开始看很多资料说python2比较好,因为很多库还不支持3,但是使用到现在为止觉得还是pythin3比较好用,因为编码什么的问题,觉得2还是没有3方便.而且在网上找到的2中的一些资料稍微改一下也还是可以用. 好了,开始说爬百度百

Python 爬虫入门实例(爬取小米应用商店的top应用apk)

一,爬虫是什么? 爬虫就是获取网络上各种资源,数据的一种工具.具体的可以自行百度. 二,如何写简单爬虫 1,获取网页内容 可以通过 Python(3.x) 自带的 urllib,来实现网页内容的下载.实现起来很简单 import urllib.request url="http://www.baidu.com" response=urllib.request.urlopen(url) html_content=response.read() 还可以使用三方库 requests ,实现起

Python实战:Python爬虫学习教程,获取电影排行榜

Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本文是在前一部分Python基础之上程序员带你十天快速入门Python,玩转电脑软件开发(四),再次进行的Python爬虫实战课程. 正则表达式实例简单详解 正则表达式干什么用? 就是在字符串中提取我们需要的内容的. 记得哦,要先引用正则表达式模块的哦. re就是正则表达式相