如何用Python一次性下載抖音上音樂
Python 鏈接抖音
python下載抖音內容的帖子網上有一些,但都比較麻煩,需要通過adb連接安卓手機後,模擬操作。我這麼懶,這種事兒玩不來…那麼,該如何獲取抖音內容呢?網上搜瞭下大概有兩種方式,一個是瀏覽器插件快抖,另外一個是我今天要說的抖音網頁版。其實這兩者差別不是很大,都是先將抖音內容下載至服務器後,通過開發簡單網站配置域名後,讓大傢訪問。讓我們來看看抖音網頁版:
爬蟲實現分析
熱歌榜內容
大傢先開看看這個抖音熱歌榜歌曲,每頁20首歌曲,一個55頁。但細不細心大傢都能發現,很多歌曲存在重復的問題。所以,等下爬蟲的時候,我們需要先準備一個music_list,用來識別這首歌曲是否已經下載過瞭…
網頁解析
網頁比較簡單,一個div中包裹瞭一個ul>li*20,我們是不是該這樣獲取:
soup.find('div',{"class":"pull-left"}).find('ul').findAll('a')
如果你說是,那麼一定沒有好好看我前天整理的文章通過哪吒豆瓣影評,帶你分析python爬蟲快速入門:https://www.jianshu.com/p/ae38f7607902,我在文章中專門提到瞭一個小技巧,通過使用attr的屬性進行快速解析,那麼最快速的獲取方式是:
soup.findAll('a', attrs={'onclick': True})
我們隻需要獲取所有的a標簽,切這些標簽中包含onclick這個屬性即可。
巧用eval
我們解析到的內容通過attr[‘onclick’],可以得到他的屬性open1(‘夜’,’http://p9-dy.byteimg.com/obj/61a20007a98954b0831d),如何能快速獲取歌曲名字和url呢?這裡我們需要用到一個eval的小技巧:
index = "open1('夜','http://p9-dy.byteimg.com/obj/61a20007a98954b0831d','')" index[5:] "('夜','http://p9-dy.byteimg.com/obj/61a20007a98954b0831d','')" index_tuple = eval(index[5:]) print(index_tuple, type(index_tuple)) ('夜', 'http://p9-dy.byteimg.com/obj/61a20007a98954b0831d', '') <class 'tuple'> index_tuple[0] '夜' index_tuple[1] 'http://p9-dy.byteimg.com/obj/61a20007a98954b0831d'
ps:今天一個朋友說我寫代碼沒註釋,我這是現身說法的告訴你,如何能寫出讓別人壓根看不懂的代碼,就是不寫註釋啊,哈哈!其實,代碼我都在文章中一點一點的講解瞭,所以沒有寫,但秉承著害怕大佬們取關的心態,我還是把註釋加上吧…
代碼實現
總體來說實現比較簡單,全部代碼如下:
import os import requests from bs4 import BeautifulSoup import threading import time class DouYinMusic: def __init__(self): self.music_list = [] self.path = self.download_path() @staticmethod def download_path(): """ 獲取代碼執行目錄,並在目錄下創建Music文件夾 :return Music文件夾全路徑 """ base_dir = os.path.dirname(os.path.abspath(__file__)) _path = os.path.join(base_dir, "Music") if not os.path.exists(_path): os.mkdir(_path) return _path def get_request(self, url): """ 封裝requests.get方法 如果為網頁請求,返回網頁內容 否則,解析音樂地址,並返回音樂二進制文件 :param url: 請求url(分網頁、音樂兩類) :return: 網頁內容 & 音樂二進制文件 """ r = requests.get(url, timeout=5) if url.endswith('html'): return r.text else: return r.content def analysis_html(self, html): """ 根據獲取的網頁內容,解析音樂名稱、下載地址 調用音樂下載方法 :param html: 網頁內容 """ soup = BeautifulSoup(html, 'lxml') # 根據關鍵字onclick查找每個下載地址 for tag_a in soup.findAll('a', attrs={'onclick': True}): # 下載格式'("name","link","")',通過eval將str轉化為tuple類型 link_list = eval(tag_a['onclick'][5:]) music_name, music_link = link_list[:2] # 因為存在部分重復音樂,故設置判斷下載過的音樂跳過 if music_name in self.music_list: continue self.music_list.append(music_name) t = threading.Thread(target=self.download_music, args=(music_name, music_link)) time.sleep(0.5) t.start() def download_music(self, music_name, music_link): """ 解析音樂文件,完成音樂下載 :param music_name: 音樂名稱 :param music_link: 下載地址 """ _full_name = os.path.join(self.path, music_name) with open(_full_name + '.mp3', 'wb') as f: f.write(self.get_request(music_link)) print("抖音音樂:{} 下載完成".format(music_name)) def run(self): """ 主方法,用於批量生成url """ for page in range(1,55): url = "http://douyin.bm8.com.cn/t_{}.html".format(page) html = self.get_request(url) self.analysis_html(html) if __name__ == '__main__': main = DouYinMusic() main.run()
來讓我們看看效果吧:
網站是通過nginx負載均衡搭建的,有一些鏈接已經失效瞭。最終下載瞭不重復的592首抖音音樂。
同樣的,大傢喜歡可以按照這種方法,嘗試下載一下網站的抖音視頻。
以上就是如何用Python一次性下載抖音上音樂的詳細內容,更多關於Python一次性下載抖音上音樂的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python爬蟲之批量下載喜馬拉雅音頻
- Python實現快速保存微信公眾號文章中的圖片
- Python Django搭建文件下載服務器的實現
- Python 批量下載陰陽師網站壁紙
- Python爬取網站圖片並保存的實現示例