python批量下載抖音視頻
本文實(shí)例為大家分享了python批量下載抖音視頻的具體代碼,供大家參考,具體內(nèi)容如下
知識(shí)儲(chǔ)備:博主是在Pycharm下進(jìn)行的
文件夾:dou_ying

1、在文件夾doy_ying下新建第一個(gè)文件:dou_ying_video_download.py
代碼:
# coding=utf-8
"""
@author: jiajiknag
程序功能:批量下載抖音視頻
"""
import requests
import bs4
import os
import json
import re
import sys
import time
# 如果一個(gè)對(duì)象沒(méi)有實(shí)現(xiàn)上下文,我們就不能把它用于with語(yǔ)句。這個(gè)時(shí)候,可以用closing()來(lái)把該對(duì)象變?yōu)樯舷挛膶?duì)象。
# closing-將任意對(duì)象變?yōu)樯舷挛膶?duì)象,并支持with語(yǔ)句。
from contextlib import closing
# Urllib3是一個(gè)功能強(qiáng)大,條理清晰,用于HTTP客戶端的Python庫(kù)
# urllib3.disable_warnings()禁用urllib3警告的方法
requests.packages.urllib3.disable_warnings()
# 創(chuàng)建類Sipder()
class Spider():
def __init__(self):
# UA對(duì)照表:https://blog.csdn.net/time888/article/details/72822729
self.headers = {
# 用戶代理:用于瀏覽器識(shí)別的,可以看出自己系統(tǒng)版本,瀏覽器,瀏覽器內(nèi)核等
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
}
# 輸出信息-視頻信息
print('[INFO]:Douyin(抖音) App Video downloader...')
print('[Version]: V1.0')
print('[Author]: Jiajikang')
# 創(chuàng)建函數(shù)run():外部調(diào)用運(yùn)行
def run(self):
# 輸入ID地址(爬去某人抖音視頻的抖音號(hào))
user_id = input('Enter the ID:')
try:
# 因?yàn)槎兑籼?hào)是數(shù)字所以使用int()驗(yàn)證是否是數(shù)字
int(user_id)
# 輸入錯(cuò)誤時(shí)輸出except下的語(yǔ)句
except:
print('[Error]:ID error...')
return
video_names, video_urls, nickname = self._parse_userID(user_id)
# os.listdir()方法用于返回指定的文件夾包含的文件或文件夾的名字的列表
if nickname not in os.listdir():
# os.mkdir() 方法用于以數(shù)字權(quán)限模式創(chuàng)建目錄
os.mkdir(nickname)
print('[INFO]:Number of Videos <%s>' % len(video_urls))
for num in range(len(video_names)):
# %d是一個(gè)占位符,標(biāo)識(shí)一個(gè)字符串型的數(shù)據(jù), %s也是一個(gè)占位符,標(biāo)識(shí)一個(gè)字符串型的數(shù)據(jù)
print('[INFO]:Parsing <No.%d> <Url:%s>' % (num+1, video_urls[num]))
temp = video_names[num].replace('\\', '')
video_name = temp.replace('/', '')
# 調(diào)用函數(shù)_downloader()
self._downloader(video_urls[num], os.path.join(nickname, video_name))
print('\n')
print('[INFO]:All Done...')
# 創(chuàng)建函數(shù)_downloader()并含有參數(shù):路徑和視頻的url-視頻下載
def _downloader(self, video_url, path):
# 定義size并初始化為0
size = 0
# 定義一個(gè)變量download_url:利用函數(shù)_get_download_url()來(lái)獲取視頻url
download_url = self._get_download_url(video_url)
with closing(requests.get(download_url, headers=self.headers, stream=True, verify=False)) as response:
chunk_size = 1024
content_size = int(response.headers['content-length'])
if response.status_code == 200:
sys.stdout.write('[File Size]: %0.2f MB\n' % (content_size/chunk_size/1024))
# 使用寫(xiě)入的方式打開(kāi),如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。
with open(path, 'wb') as f:
# 遍歷獲取數(shù)據(jù)
for data in response.iter_content(chunk_size=chunk_size):
# 向文件中寫(xiě)入指定的字符串data
f.write(data)
# 計(jì)算寫(xiě)入字符串的長(zhǎng)度
size += len(data)
# flush() 方法是用來(lái)刷新緩沖區(qū)的,即將緩沖區(qū)中的數(shù)據(jù)立刻寫(xiě)入文件,同時(shí)清空緩沖區(qū),不需要是被動(dòng)的等待輸出緩沖區(qū)寫(xiě)入。
f.flush()
sys.stdout.write('[Progress]: %0.2f%%' % float(size/content_size*100) + '\r')
sys.stdout.flush()
# 創(chuàng)建函數(shù)_get_download_url()并含有形參video_url:獲得視頻下載地址
def _get_download_url(self, video_url):
# 獲取視頻的下載地址
# Requests 可以為 HTTPS 請(qǐng)求驗(yàn)證 SSL 證書(shū),就像 web 瀏覽器一樣。要想檢查某個(gè)主機(jī)的 SSL 證書(shū),你可以使用 verify 參數(shù):
# 定義變量res用來(lái)接收視頻地址,verify 僅應(yīng)用于主機(jī)證書(shū)
res = requests.get(url=video_url, verify=False)
# 將res.text 文件利用'lxml'解析成xml文件,了解lxml--https://blog.csdn.net/tanzuozhev/article/details/50442243
soup = bs4.BeautifulSoup(res.text, 'lxml')
# 使用find_all來(lái)獲取網(wǎng)頁(yè)中JavaScript中的script的變量;[-1]去除最后一個(gè)字符
script = soup.find_all('script')[-1]
# 定義變量date=正則表達(dá)式\[(.+)]\,[0]可以使其返回一個(gè)字典
video_url_js = re.findall('var data = \[(.+)\];', str(script))[0]
# 使用loads()下載
html = json.loads(video_url_js)
# 返回,使用[0]是返回一個(gè)字典
return html['video']['play_addr']['url_list'][0]
# 定義函數(shù)_parse_userID()且形參user_id;通過(guò)user_id獲取該用戶發(fā)布的所有視頻
def _parse_userID(self, user_id):
# 獲取所有視頻
video_names = []
video_urls = []
unique_id = ''
# 當(dāng)獲取的id不是用戶的id時(shí):
while unique_id != user_id:
# 獲取url-下載
search_url = 'https://api.amemv.com/aweme/v1/discover/search/?keyword={}&count=10&type=1&aid=1128'.format(user_id)
res = requests.get(url=search_url, verify=False)
res_dic = json.loads(res.text)
uid = res_dic['user_list'][0]['user_info']['uid']
aweme_count = res_dic['user_list'][0]['user_info']['aweme_count']
nickname = res_dic['user_list'][0]['user_info']['nickname']
unique_id = res_dic['user_list'][0]['user_info']['unique_id']
# 用戶的url
user_url = 'https://www.douyin.com/aweme/v1/aweme/post/?user_id={}&max_cursor=0&count={}'.format(uid, aweme_count)
# 請(qǐng)求獲取用戶的url
res = requests.get(url=user_url, verify=False)
# 下載后去的url轉(zhuǎn)換的文本
res_dic = json.loads(res.text)
i = 1
# 遍歷下載的文本
for each in res_dic['aweme_list']:
share_desc = each['share_info']['share_desc']
if '抖音-原創(chuàng)音樂(lè)短視頻社區(qū)' == 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
"""
if __name__ == '__main__':
# 創(chuàng)建對(duì)象
sp = Spider()
sp.run()
"""
溫馨提示: 有些庫(kù)是要自己去下載,一般使用命令在提示符下輸入:pip install 自己要下載的庫(kù),如下圖是博主下載的。

2、在文件夾doy_ying下新建第二個(gè)文件:run.py
代碼:
# coding=utf-8 """ @author: jiajiknag 程序功能: 測(cè)試抖音視頻的下載 """ from dou_ying_video_download import Spider if __name__ == '__main__': # 創(chuàng)建類Spider()對(duì)象 sp = Spider() # 運(yùn)行開(kāi)始下載 sp.run()
3、結(jié)果
這是我在抖音中隨便找的一個(gè)發(fā)布抖音視頻比較少的來(lái)測(cè)試一下,以及我還下載了自己的抖音


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)指定范圍內(nèi)篩選并剔除Excel表格中的數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)在指定范圍內(nèi)篩選并剔除Excel表格中的數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-06-06
Python機(jī)器學(xué)習(xí)算法之決策樹(shù)算法的實(shí)現(xiàn)與優(yōu)缺點(diǎn)
決策樹(shù)(Decision Tree)是一種基本的分類與回歸方法,這篇文章主要給大家介紹了關(guān)于Python機(jī)器學(xué)習(xí)算法之決策樹(shù)算法實(shí)現(xiàn)與優(yōu)缺點(diǎn)的相關(guān)資料,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié)
這篇文章主要介紹了Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié),對(duì)strip()和lstrip()和rstrip()這三個(gè)函數(shù)做了簡(jiǎn)單的講解,需要的朋友可以參考下2015-04-04
python select.select模塊通信全過(guò)程解析
這篇文章主要為大家解析了python select.select模塊通信全過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
詳解Python if-elif-else知識(shí)點(diǎn)
本篇文章給大家總結(jié)了Python中if-elif-else的相關(guān)知識(shí)點(diǎn)以及語(yǔ)法相關(guān)內(nèi)容,有興趣的朋友參考學(xué)習(xí)下。2018-06-06
python批量識(shí)別圖片指定區(qū)域文字內(nèi)容
這篇文章主要為大家詳細(xì)介紹了python識(shí)別圖片指定區(qū)域文字內(nèi)容,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
python去除刪除數(shù)據(jù)中\(zhòng)u0000\u0001等unicode字符串的代碼
這篇文章主要介紹了python去除刪除數(shù)據(jù)中\(zhòng)u0000\u0001等unicode字符串的代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
python的ImageTk.PhotoImage大坑及解決
這篇文章主要介紹了python的ImageTk.PhotoImage大坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
TensorFlow實(shí)現(xiàn)簡(jiǎn)單線性回歸
這篇文章主要為大家詳細(xì)介紹了TensorFlow實(shí)現(xiàn)簡(jiǎn)單線性回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

