抖音上超好聽的神曲音樂,Python教你一次性下載
2023-04-08 20:09:11 1
不知道什麼時候開始,中國出現了南抖音、北快手的互文格局(東市買駿馬,西市買鞍韉…)。剛才提到了,之前比較喜歡刷抖音,對於我這種佛系程序猿,看網上這些整容妹子基本一個樣。喜歡抖音主要是兩個初衷,學做菜聽音樂。朋友之前常說,人家抖音看妹子看的樂呵呵,你看人家做菜也能津津有味,一個人在那兒傻笑…民以食為天,我看到色香味俱全的菜,做的那麼好吃的樂呵樂呵還不行麼。
抖音捧紅了很多人,也讓很多本不怎麼讓大家熟知的歌曲、BGM,經過翻唱、混剪與視頻搭配,從而傳播大街小巷。什麼「若不是你,突然闖進我心裡…」亦或者「也許未來遙遠在光年之外,我願守候未知裡為你等待…」,成了大家閒時在嘴邊哼唱的調調。那麼,有沒有想過將這些好聽的剪輯批量下載下來呢?
Python 連結抖音
python下載抖音內容的帖子網上有一些,但都比較麻煩,需要通過adb連接安卓手機後抖音上好聽的歌曲,模擬操作。我這麼懶,這種事兒玩不來…那麼,該如何獲取抖音內容呢?網上搜了下大概有兩種方式,一個是瀏覽器插件快抖,另外一個是我今天要說的抖音網頁版。其實這兩者差別不是很大,都是先將抖音內容下載至伺服器後,通過開發簡單網站配置域名後,讓大家訪問。讓我們來看看抖音網頁版:
哎喲吼,居然看到了昨天爬蟲的「喬奶奶」…當然今天的重點不是視頻,而是下載它全站所有的音樂!
爬蟲實現分析
大家先開看看這個抖音熱歌榜歌曲,每頁20首歌曲,一個55頁。但細不細心大家都能發現,很多歌曲存在重複的問題。所以,等下爬蟲的時候,我們需要先準備一個music_list,用來識別這首歌曲是否已經下載過了…
網頁比較簡單,一個div中包裹了一個ul>li*20,我們是不是該這樣獲取:
soup.find('div',{"class":"pull-left"}).find('ul').findAll('a')
通過使用attr的屬性進行快速解析,那麼最快速的獲取方式是:
soup.findAll('a', attrs={'onclick': True})
我們只需要獲取所有的a標籤,切這些標籤中包含onclick這個屬性即可。
我們解析到的內容通過attr[『onclick』],可以得到他的屬性open1(『夜』,』p9-dy.byteimg.com/obj/61a2000…),如何能快速獲取歌曲名字和url呢?這裡我們需要用到一個eval的小技巧:
index = "open1('夜','#39;,'')"
index[5:]
"('夜','#39;,'')"
index_tuple = eval(index[5:])
print(index_tuple, type(index_tuple))
('夜', '#39;, '')
index_tuple[0]
'夜'
index_tuple[1]
'#39;
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):