前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[Python] 首发,批量下载抖音单用户所有无水印视频

[Python] 首发,批量下载抖音单用户所有无水印视频

作者头像
@派大星
发布2023-06-28 14:09:40
发布2023-06-28 14:09:40
1.3K00
代码可运行
举报
文章被收录于专栏:码上遇见你码上遇见你
运行总次数:0
代码可运行

首先声明该方法仅供个人学习交流使用,严禁非法获利。

  1. 获取用户主页分享链接:用户主页右上角点开,获取分享链接

得到类似分享链接:在抖音,记录美好生活!https://v.douyin.com/eSN7g1c/

  1. 运行程序,批量下载该用户无水印视频:
  • 获取用户抖音昵称,并创建同名文件夹存放视频
  • 校验用户所有时间段是否发布过视频,校验数量为0则跳过,不为0则进行下载
  • 下载并保存,数量和用户主页视频数量一致
  • 验证一下,确实无水印,bingo!
  1. 分享程序思路

1.根据用户页面分享的链接提取url2.根据url来进行请求,通过禁用重定向来获取headers['location'],再从中提取sec_id3.拼接该用户所有视频列表请求url,然后在下载保存即可。下面给出一个请求参数示例:params = { 'sec_uid' : 'MS4wLjABAAAAbtSlJK_BfUcuqyy8ypNouqEH7outUXePTYEcAIpY9rk', #每个用户不同 'count' : '200', #每次请求返回视频list中视频条数,不建议太大 'min_cursor' : '1612108800000',#用户视频开始时间,带毫秒的时间戳 'max_cursor' : '1619251716404',#用户视频结束时间,带毫秒时间戳 'aid' : '1128',#未知参数,可有可无 '_signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR' #签名值,直接从请求参数里面复制一个就能一直用}

  1. 关键代码: 1).提取分享链接中的url
代码语言:javascript
代码运行次数:0
运行
复制
string = input('粘贴分享链接:')
shroturl = re.findall('[a-z]+://[\S]+', string, re.I|re.M)[0]

2).请求上述url,禁用重定向获取location的value,在正则提取出sec_id

代码语言:javascript
代码运行次数:0
运行
复制
startpage = requests.get(url=shroturl, headers=headers, allow_redirects=False)
location = startpage.headers['location']
sec_uid = re.findall('(?<=sec_uid=)[a-z,A-Z,0-9, _, -]+', location, re.M|re.I)[0]

3).拼接请求用户信息url,获取用户昵称,也可以获取其他信息,这里只取昵称

代码语言:javascript
代码运行次数:0
运行
复制
getname = requests.get(url='https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={}'.format(sec_uid), headers=headers).text
userinfo = json.loads(getname)
name = userinfo['user_info']['nickname']

4).创建用户昵称同名文件夹,切换到该路径下

代码语言:javascript
代码运行次数:0
运行
复制
Path = name
if os.path.exists(path=Path) == False:
    os.mkdir(path=Path)
else:
    print('directory exist')
os.chdir(path=Path)

5).视频时间戳生成,原本可以直接使用一个大跨度的时间段,但是在测试中发现时间跨度太大的话,下载的视频数量会变少,多次测试后确定以1个月为间隔,年份从2018到2021,基本上也没有更早的视频了吧

代码语言:javascript
代码运行次数:0
运行
复制
year = ('2018','2019','2020','2021')
month = ('01','02','03','04','05','06','07','08','09','10','11','12')
timepool = [x+'-'+y+'-01 00:00:00' for x in year for y in month ]
print(timepool)
k = len(timepool)
for i in range(k) :
    if i < k-1 :
        print('begintime='+timepool[i])
        print('endtime='+timepool[i+1])
        beginarray = time.strptime(timepool[i], "%Y-%m-%d %H:%M:%S")
        endarray = time.strptime(timepool[i+1], "%Y-%m-%d %H:%M:%S")
        t1 = int(time.mktime(beginarray) * 1000)
        t2 = int(time.mktime(endarray) * 1000)
        print(t1,t2)

6).到这里,params里面的参数都拿到了,直接拼接视频列表url,把返回结果存入json中。

代码语言:javascript
代码运行次数:0
运行
复制
awemeurl = 'https://www.iesdouyin.com/web/api/v2/aweme/post/?'
       awemehtml = requests.get(url=awemeurl, params=params, headers=headers).text
       data = json.loads(awemehtml)

7).直接从json中提取我们要的内容{“视频数量”,“视频title”,“无水印视频url”},然后还等啥,下载吧

代码语言:javascript
代码运行次数:0
运行
复制
awemenum = len(data['aweme_list'])
        print(awemenum)
        for i in range(awemenum):
            videotitle = data['aweme_list'][i]['desc'].replace("?", "").replace("\"","").replace(":","")
            videourl = data['aweme_list'][i]['video']['play_addr']['url_list'][0]
            start = time.time()
            print('{} ===>downloading'.format(videotitle))
            with open(videotitle+'.mp4', 'wb') as v:
                try:
                    v.write(requests.get(url=videourl, headers=headers).content)
                    end = time.time()
                    cost = end - start
                    print('{} ===>downloaded ===>cost {}s'.format(videotitle, cost))
                except Exception as e:
                    print('download error')

完整代码分享:

代码语言:javascript
代码运行次数:0
运行
复制
import requests
import json
import os
import time
import re
"""
1.根据用户页面分享的字符串提取短url
2.根据短url加上302获取location,提取sec_id
3.拼接视频列表请求url
params = {
    'sec_uid' : 'MS4wLjABAAAAbtSlJK_BfUcuqyy8ypNouqEH7outUXePTYEcAIpY9rk',
    'count' : '200',
    'min_cursor' : '1612108800000',
    'max_cursor' : '1619251716404',
    'aid' : '1128',
    '_signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR'
}
"""
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Mobile Safari/537.36"
}
# string  = '在抖音,记录美好生活! https://v.douyin.com/ekkTsYw/'
string = input('粘贴分享链接:')
 
shroturl = re.findall('[a-z]+://[\S]+', string, re.I|re.M)[0]
print(shroturl)
startpage = requests.get(url=shroturl, headers=headers, allow_redirects=False)
location = startpage.headers['location']
sec_uid = re.findall('(?<=sec_uid=)[a-z,A-Z,0-9, _, -]+', location, re.M|re.I)[0]
getname = requests.get(url='https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid={}'.format(sec_uid), headers=headers).text
userinfo = json.loads(getname)
name = userinfo['user_info']['nickname']
print(userinfo['user_info']['nickname'])
Path = name
if os.path.exists(path=Path) == False:
    os.mkdir(path=Path)
else:
    print('directory exist')
os.chdir(path=Path)
 
"""new function"""
year = ('2018','2019','2020','2021')
month = ('01','02','03','04','05','06','07','08','09','10','11','12')
timepool = [x+'-'+y+'-01 00:00:00' for x in year for y in month ]
print(timepool)
k = len(timepool)
for i in range(k) :
    if i < k-1 :
        print('begintime='+timepool[i])
        print('endtime='+timepool[i+1])
        beginarray = time.strptime(timepool[i], "%Y-%m-%d %H:%M:%S")
        endarray = time.strptime(timepool[i+1], "%Y-%m-%d %H:%M:%S")
        t1 = int(time.mktime(beginarray) * 1000)
        t2 = int(time.mktime(endarray) * 1000)
        print(t1,t2)
 
        params = {
            'sec_uid' : sec_uid,
            'count' : 200,
            'min_cursor' : t1,
            'max_cursor' : t2,
            'aid' : 1128,
            '_signature' : 'PtCNCgAAXljWCq93QOKsFT7QjR'
        }
        awemeurl = 'https://www.iesdouyin.com/web/api/v2/aweme/post/?'
        awemehtml = requests.get(url=awemeurl, params=params, headers=headers).text
        data = json.loads(awemehtml)
        # print(data)
        # print(type(data))
        awemenum = len(data['aweme_list'])
        print(awemenum)
        for i in range(awemenum):
            videotitle = data['aweme_list'][i]['desc'].replace("?", "").replace("\"","").replace(":","")
            videourl = data['aweme_list'][i]['video']['play_addr']['url_list'][0]
            start = time.time()
            print('{} ===>downloading'.format(videotitle))
            with open(videotitle+'.mp4', 'wb') as v:
                try:
                    v.write(requests.get(url=videourl, headers=headers).content)
                    end = time.time()
                    cost = end - start
                    print('{} ===>downloaded ===>cost {}s'.format(videotitle, cost))
                except Exception as e:
                    print('download error')
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 完整代码分享:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档