使用Python下載抖音各大V視頻的思路詳解
前言
本文的文字及圖片來源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,如有問題請及時(shí)聯(lián)系我們以作處理。
以下文章來源于Python七號 ,作者 somenzz
Python爬蟲、數(shù)據(jù)分析、網(wǎng)站開發(fā)等案例教程視頻免費(fèi)在線觀看
https://space.bilibili.com/523606542
上次寫了用 Python 批量下載知乎視頻的方式,這次分享用 Python 批量下載抖音個(gè)人主頁的全部無水印視頻,本文重點(diǎn)不是提供一個(gè)好用的腳本,而是講述如何寫出這樣的腳本,正所謂授人以魚,不如授人以漁,所謂的爬蟲,基本都是這個(gè)套路。
思路
先說下思路,要批量下載視頻,可以先嘗試成功下載一個(gè),確定沒有水印,然后在寫一個(gè)循環(huán)進(jìn)行批量下載。
難點(diǎn):下載一個(gè)視頻可能很簡單,但下載多個(gè)就稍微有點(diǎn)復(fù)雜,需要抓取多個(gè)視頻對應(yīng)的 url,抖音這塊做了防爬措施,只允許手機(jī)上看到個(gè)人主頁的視頻列表,電腦端的網(wǎng)頁卻看不到,這就需要抓取手機(jī)的 https 包,這里借助 Burpsuite 進(jìn)行抓包。
這里用到了 Burpsuite ,因此我把自己常用的 Burpsuite 2.1.06 專業(yè)版放在了網(wǎng)盤里面,公眾號「Python七號」回復(fù)「burp」獲取,下載后運(yùn)行start_burp.bat或sh start_burp.sh即可一鍵啟動,無需購買許可,非常方便。
爬取單個(gè)視頻
- 找一個(gè)抖音視頻鏈接,點(diǎn)擊分享,復(fù)制鏈接,在電腦上用打開,然后打開開發(fā)者工具,點(diǎn)擊 network 選項(xiàng)。
- 刷新,看接口,找到返回值里有播放地址的接口:
這里面有個(gè) play_addr,內(nèi)部有個(gè) urllist,我們復(fù)制這個(gè) urllist[0] 在瀏覽器打開,網(wǎng)站跳轉(zhuǎn)到了真正的播放地址,同時(shí)可以看到下載的按鈕:
下載這個(gè)視頻,發(fā)現(xiàn)是帶水印的,如何下載到不帶水印的視頻呢?網(wǎng)上搜索了下,方法就是將上述 urllist[0] 中的 playwm 改成 play 就可以了。
然后開始寫代碼,獲取這個(gè) urllist[0],并下載
def get(share_url) -> dict: """ share_url -> 抖音視頻分享url 返回格式 [{'url':'', 'title','format':'',},{}] """ data = [] headers = { 'accept': 'application/json', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' } api = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={item_id}" rep = requests.get(share_url, headers=headers, timeout=10) if rep.ok: # item_id item_id = re.findall(r'video/(\d+)', rep.url) if item_id: item_id = item_id[0] # video info rep = requests.get(api.format(item_id=item_id), headers=headers, timeout=10) if rep.ok and rep.json()["status_code"] == 0: info = rep.json()["item_list"][0] tmp = {} tmp["title"] = info["desc"] #去水印的視頻鏈接 play_url = info["video"]["play_addr"]["url_list"][0].replace('playwm', 'play') tmp["url"] = play_url tmp["format"] = 'mp4' def get(share_url) -> dict: """ share_url -> 抖音視頻分享url 返回格式 [{'url':'', 'title','format':'',},{}] """ data = [] headers = { 'accept': 'application/json', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' } api = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={item_id}" rep = requests.get(share_url, headers=headers, timeout=10) if rep.ok: # item_id item_id = re.findall(r'video/(\d+)', rep.url) if item_id: item_id = item_id[0] # video info rep = requests.get(api.format(item_id=item_id), headers=headers, timeout=10) if rep.ok and rep.json()["status_code"] == 0: info = rep.json()["item_list"][0] tmp = {} tmp["title"] = info["desc"] #去水印的視頻鏈接 play_url = info["video"]["play_addr"]["url_list"][0].replace('playwm', 'play') tmp["url"] = play_url tmp["format"] = 'mp4' data.append(tmp) return data if __name__ =='__main__': videos = get('https://www.iesdouyin.com/share/video/6920538027345415431/?region=&mid=6920538030852885262&u_code=48&titleType=title&did=0&iid=0') for video in videos: downloader.download(video['url'],video['title'],video['format'],'./download') data.append(tmp) return data if __name__ =='__main__': videos = get('https://www.iesdouyin.com/share/video/6920538027345415431/?region=&mid=6920538030852885262&u_code=48&titleType=title&did=0&iid=0') for video in videos: downloader.download(video['url'],video['title'],video['format'],'./download')
這里 downloader.download 函數(shù),與前文知乎視頻下載 里的函數(shù)一樣,這里就不貼代碼了。
獲取個(gè)人主頁視頻鏈接
前兩步已經(jīng)實(shí)現(xiàn)了單個(gè)抖音視頻的無水印下載,現(xiàn)在我們要做的就是找到大量的這種鏈接,直接循環(huán)就可以了。
任意打開一個(gè)大 V 的個(gè)人主頁,分享,復(fù)制鏈接,使用瀏覽器打開,一個(gè)視頻也看不到,而使用抖音 App 就可以看到:
瀏覽器
抖音APP
說明抖音做了一定的限制,防止從瀏覽器看到多個(gè)視頻的信息。這時(shí)就需要學(xué)會從手機(jī) APP 來抓包,看看手機(jī)上的 http 請求是怎么發(fā)起的,然后使用程序來模擬。
我一直在用的 BurpSuite(下面簡稱 Burp) 非常好用,這里順便分享下如何使用:
1、運(yùn)行 Burp
下載后運(yùn)行start_burp.bat或sh start_burp.sh來啟動 Burp,然后打開代理設(shè)置,綁定到運(yùn)行 Burp 的機(jī)器 IP,如下圖所示:
注意不要設(shè)置 ip 為 127.0.0.1,這樣設(shè)置的話,只有本地請求可以使用代理,手機(jī)無法連接此代理。
2、手機(jī)設(shè)置代理
手機(jī)與電腦連接同一 wifi,IPhone 的操作如下:然后進(jìn)入設(shè)置-> 無線局域網(wǎng) -> 點(diǎn)擊同一 wifi 右邊的 information 符號,然后下拉,點(diǎn)擊配置代理,配置和 BurpSuite 一樣的 ip 和端口。Android 的手機(jī)的設(shè)置也差不多。至此可以在 BurpSuite 上抓取手機(jī)的 http 流量。
3、手機(jī)下載 Burp 的證書,并設(shè)置信任
手機(jī)瀏覽器 進(jìn)入 http://burp。點(diǎn)擊 CA 下載證書。設(shè)置->通用->描述文件->點(diǎn)擊 PortSwigger CA->安裝設(shè)置->通用->關(guān)于本機(jī)->證書信任設(shè)置,將 BurpSuite 的證書開啟
這樣就可以抓取手機(jī)上發(fā)起的 https 包了。
4、設(shè)置 BurpSuite 中斷
這一步驟設(shè)置之后,手機(jī)上的請求會在這里阻塞,你可以放行選擇放行,或修改數(shù)據(jù)包后放行,也可以發(fā)往 repeater,以便后續(xù)重放請求,因此來自前端的請求是不可信的。
現(xiàn)在打開手機(jī)上的抖音 App,這里便會出現(xiàn)大量的請求阻塞在這里,我們選擇放行,會發(fā)現(xiàn)抖音 App 里的數(shù)據(jù)一步一步的出現(xiàn)??焖⒌絺€(gè)人主頁的視頻之前,將請求發(fā)到 Repeater,如下圖所示:
然后打開 BurpSuite 的 Repeater 選項(xiàng)卡,就可以看到剛才發(fā)過來的請求,這時(shí)我們選擇重放,看數(shù)據(jù),決定我們需要使用的接口,如下圖所示:
發(fā)現(xiàn)這個(gè)接口滿足請求,這里可以看到接口的 url,headers 的各種參數(shù),headers 中的 User-Agent 參數(shù),是區(qū)分客戶端是瀏覽器還是 App 的重要標(biāo)識,因此就可以寫代碼來模擬請求,進(jìn)而獲取需要的批量下載鏈接。
由于 url 中的參數(shù)非常多,有些是固定不變的,有些隨著不同人的主頁參數(shù)會發(fā)生變化,如果僅僅是自己使用,可以簡單的通過正則表達(dá)式來提取這些 url 鏈接,然后進(jìn)行批量下載就可以了。
如果是想寫好一個(gè)腳本供別人使用,那么就需要做更多的工作,比如說,需要查看更多的 api,以便確定 url 及 headers 中的參數(shù)是如何獲取或生成的,然后寫腳本自動化這一過程,有些情況下,還涉及到加密混淆等反爬措施,這里就不再展開了,請感興趣的讀者自行探索。
最后的話
爬取視頻的關(guān)鍵在于找到視頻的播放地址,有了播放地址,即使不寫代碼,也可以使用瀏覽器下載,尋找播放地址還不夠,要考慮是否能去水印,如果要批量下載,那就要知道如何獲取更多的視頻鏈接,在瀏覽器抓取不到的時(shí)候,考慮使用 BurpSuite 抓取手機(jī)的流量包,進(jìn)一步提取接口的數(shù)據(jù),或模擬手機(jī)請求,對搞爬蟲的同學(xué),BurpSuite 是一個(gè)瑞士軍刀,非常實(shí)用。
如果本文對你有所幫助,請點(diǎn)個(gè)贊或再看吧,謝謝支持。
到此這篇關(guān)于使用Python下載抖音各大V視頻的思路詳解的文章就介紹到這了,更多相關(guān)Python下載抖音視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 使用with上下文實(shí)現(xiàn)計(jì)時(shí)功能
with 語句適用于對資源進(jìn)行訪問的場合,確保不管使用過程中是否發(fā)生異常都會執(zhí)行必要的“清理”操作,釋放資源,比如文件使用后自動關(guān)閉、線程中鎖的自動獲取和釋放等。這篇文章主要介紹了Python 使用with上下文實(shí)現(xiàn)計(jì)時(shí),需要的朋友可以參考下2018-03-03使用memory_profiler監(jiān)測python代碼運(yùn)行時(shí)內(nèi)存消耗方法
今天小編就為大家分享一篇使用memory_profiler監(jiān)測python代碼運(yùn)行時(shí)內(nèi)存消耗方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12使用Python第三方庫pygame寫個(gè)貪吃蛇小游戲
這篇文章主要介紹了使用Python第三方庫pygame寫個(gè)貪吃蛇小游戲,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03一次性徹底講透Python中pd.concat與pd.merge
本文主要介紹了一次性徹底講透Python中pd.concat與pd.merge,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06python實(shí)現(xiàn)將list拼接為一個(gè)字符串
這篇文章主要介紹了python實(shí)現(xiàn)將list拼接為一個(gè)字符串方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Python實(shí)現(xiàn)數(shù)據(jù)可視化大屏布局的示例詳解
數(shù)據(jù)可視化大屏展示需求無疑是對數(shù)據(jù)分析結(jié)果最好的詮釋,能夠使得別人能夠輕松的就理解我們的數(shù)據(jù)意圖。本文將通過pyecharts模塊來實(shí)現(xiàn),感興趣的可以了解一下2022-11-11Python實(shí)現(xiàn)視頻自動打碼的示例代碼
我們在觀看視頻的時(shí)候,有時(shí)候會出現(xiàn)一些奇怪的馬賽克,影響我們的觀影體驗(yàn),那么這些馬賽克是如何精確的加上去的呢?本文就來為大家詳細(xì)講講2022-04-04