python3下载抖音视频的完整代码
python3下载抖音视频的代码如下所示:
#-*-coding:utf-8-*- fromcontextlibimportclosing importrequests,json,re,os,sys,random fromipaddressimportip_address fromsubprocessimportPopen,PIPE importurllib classDouYin(object): def__init__(self,width=500,height=300): """ 抖音App视频下载 """ rip=ip_address('0.0.0.0') whilerip.is_private: rip=ip_address('.'.join(map(str,(random.randint(0,255)for_inrange(4))))) self.headers={ 'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'accept-encoding':'gzip,deflate,br', 'accept-language':'zh-CN,zh;q=0.9', 'pragma':'no-cache', 'cache-control':'no-cache', 'upgrade-insecure-requests':'1', 'user-agent':'Mozilla/5.0(Linux;U;Android5.1.1;zh-cn;MI4SBuild/LMY47V)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/53.0.2785.146MobileSafari/537.36XiaoMi/MiuiBrowser/9.1.3', 'X-Real-IP':str(rip), 'X-Forwarded-For':str(rip), } defget_video_urls(self,user_id,type_flag='f'): """ 获得视频播放地址 Parameters: user_id:查询的用户UID Returns: video_names:视频名字列表 video_urls:视频链接列表 nickname:用户昵称 """ video_names=[] video_urls=[] share_urls=[] max_cursor=0 has_more=1 i=0 share_user_url='https://www.douyin.com/share/user/%s'%user_id share_user=requests.get(share_user_url,headers=self.headers) whileshare_user.status_code!=200: share_user=requests.get(share_user_url,headers=self.headers) _dytk_re=re.compile(r"dytk\s*:\s*'(.+)'") dytk=_dytk_re.search(share_user.text).group(1) _nickname_re=re.compile(r'(.+?)<\/p>') nickname=_nickname_re.search(share_user.text).group(1) urllib.request.urlretrieve('https://raw.githubusercontent.com/Jack-Cherish/python-spider/master/douyin/fuck-byted-acrawler.js','fuck-byted-acrawler.js') try: Popen(['node','-v'],stdout=PIPE,stderr=PIPE).communicate() except(OSError,IOError)aserr: print('请先安装node.js:https://nodejs.org/') sys.exit() user_url_prefix='https://www.douyin.com/aweme/v1/aweme/favorite'iftype_flag=='f'else'https://www.douyin.com/aweme/v1/aweme/post' print('解析视频链接中') whilehas_more!=0: process=Popen(['node','fuck-byted-acrawler.js',str(user_id)],stdout=PIPE,stderr=PIPE) _sign=process.communicate()[0].decode().strip('\n').strip('\r') 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) req=requests.get(user_url,headers=self.headers) whilereq.status_code!=200: req=requests.get(user_url,headers=self.headers) html=json.loads(req.text) try: whilehtml['aweme_list']==[]: i=i+1 sys.stdout.write('已重新链接'+str(i)+'次(若超过100次,请ctrl+c强制停止再重来)'+'\r') sys.stdout.flush() process=Popen(['node','fuck-byted-acrawler.js',str(user_id)],stdout=PIPE,stderr=PIPE) _sign=process.communicate()[0].decode().strip('\n').strip('\r') 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) req=requests.get(user_url,headers=self.headers) whilereq.status_code!=200: req=requests.get(user_url,headers=self.headers) html=json.loads(req.text) except: pass i=0 foreachinhtml['aweme_list']: try: 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' uri=each['video']['play_addr']['uri'] video_url=url%uri except: continue share_desc=each['share_info']['share_desc'] ifos.name=='nt': forcinr'\/:*?"<>|': nickname=nickname.replace(c,'').strip().strip('\.') share_desc=share_desc.replace(c,'').strip() share_id=each['aweme_id'] ifshare_descin['抖音-原创音乐短视频社区','TikTok','']: video_names.append(share_id+'.mp4') else: video_names.append(share_id+'-'+share_desc+'.mp4') share_urls.append(each['share_info']['share_url']) video_urls.append(video_url) max_cursor=html['max_cursor'] has_more=html['has_more'] returnvideo_names,video_urls,share_urls,nickname defget_download_url(self,video_url,watermark_flag): """ 获得带水印的视频播放地址 Parameters: video_url:带水印的视频播放地址 Returns: download_url:带水印的视频下载地址 """ #带水印视频 ifwatermark_flag==True: download_url=video_url.replace('/play/','/playwm/') #无水印视频 else: download_url=video_url.replace('/playwm/','/play/') returndownload_url defvideo_downloader(self,video_url,video_name,watermark_flag=False): """ 视频下载 Parameters: video_url:带水印的视频地址 video_name:视频名 watermark_flag:是否下载带水印的视频 Returns: 无 """ size=0 video_url=self.get_download_url(video_url,watermark_flag=watermark_flag) withclosing(requests.get(video_url,headers=self.headers,stream=True))asresponse: chunk_size=1024 content_size=int(response.headers['content-length']) ifresponse.status_code==200: sys.stdout.write('[文件大小]:%0.2fMB\n'%(content_size/chunk_size/1024)) withopen(video_name,'wb')asfile: fordatainresponse.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() defrun(self): """ 运行函数 Parameters: None Returns: None """ self.hello() print('搜索api需要登录,暂时使用UID下载\n分享用户页面,用浏览器打开短链接,原始链接中/share/user/后的数字即是UID') user_id=input('请输入ID(例如95006183):') user_id=user_idifuser_idelse'95006183' watermark_flag=input('是否下载带水印的视频(0-否(默认),1-是):') watermark_flag=watermark_flagifwatermark_flag!=''else'0' watermark_flag=bool(int(watermark_flag)) type_flag=input('f-收藏的(默认),p-上传的:') type_flag=type_flagiftype_flag!=''else'f' save_dir=input('保存路径(例如"E:/Download/",默认"./Download/"):') save_dir=save_dirifsave_direlse"./Download/" video_names,video_urls,share_urls,nickname=self.get_video_urls(user_id,type_flag) nickname_dir=os.path.join(save_dir,nickname) ifnotos.path.exists(save_dir): os.makedirs(save_dir) ifnicknamenotinos.listdir(save_dir): os.mkdir(nickname_dir) iftype_flag=='f': if'favorite'notinos.listdir(nickname_dir): os.mkdir(os.path.join(nickname_dir,'favorite')) print('视频下载中:共有%d个作品!\n'%len(video_urls)) fornuminrange(len(video_urls)): print('解析第%d个视频链接[%s]中,请稍后!\n'%(num+1,share_urls[num])) if'\\'invideo_names[num]: video_name=video_names[num].replace('\\','') elif'/'invideo_names[num]: video_name=video_names[num].replace('/','') else: video_name=video_names[num] video_path=os.path.join(nickname_dir,video_name)iftype_flag!='f'elseos.path.join(nickname_dir,'favorite',video_name) ifos.path.isfile(video_path): print('视频已存在') else: self.video_downloader(video_urls[num],video_path,watermark_flag) print('\n') print('下载完成!') defhello(self): """ 打印欢迎界面 Parameters: None Returns: None """ print('*'*100) print('\t\t\t\t抖音App视频下载小助手') print('\t\t作者:JackCui、steven7851') print('*'*100) if__name__=='__main__': douyin=DouYin() douyin.run()
总结
以上所述是小编给大家介绍的python3下载抖音视频的完整代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!