python下載抖音內(nèi)容的帖子網(wǎng)上有一些,但都比較麻煩,需要通過(guò)adb連接安卓手機(jī)后,模擬操作。我這么懶,這種事兒玩不來(lái)…那么,該如何獲取抖音內(nèi)容呢?網(wǎng)上搜了下大概有兩種方式,一個(gè)是瀏覽器插件快抖,另外一個(gè)是我今天要說(shuō)的抖音網(wǎng)頁(yè)版。其實(shí)這兩者差別不是很大,都是先將抖音內(nèi)容下載至服務(wù)器后,通過(guò)開(kāi)發(fā)簡(jiǎn)單網(wǎng)站配置域名后,讓大家訪問(wèn)。讓我們來(lái)看看抖音網(wǎng)頁(yè)版:
大家先開(kāi)看看這個(gè)抖音熱歌榜歌曲,每頁(yè)20首歌曲,一個(gè)55頁(yè)。但細(xì)不細(xì)心大家都能發(fā)現(xiàn),很多歌曲存在重復(fù)的問(wèn)題。所以,等下爬蟲(chóng)的時(shí)候,我們需要先準(zhǔn)備一個(gè)music_list,用來(lái)識(shí)別這首歌曲是否已經(jīng)下載過(guò)了…
網(wǎng)頁(yè)比較簡(jiǎn)單,一個(gè)div中包裹了一個(gè)ul>li*20,我們是不是該這樣獲?。?/p>
soup.find('div',{"class":"pull-left"}).find('ul').findAll('a')
如果你說(shuō)是,那么一定沒(méi)有好好看我前天整理的文章通過(guò)哪吒豆瓣影評(píng),帶你分析python爬蟲(chóng)快速入門(mén):https://www.jianshu.com/p/ae38f7607902,我在文章中專門(mén)提到了一個(gè)小技巧,通過(guò)使用attr的屬性進(jìn)行快速解析,那么最快速的獲取方式是:
soup.findAll('a', attrs={'onclick': True})
我們只需要獲取所有的a標(biāo)簽,切這些標(biāo)簽中包含onclick這個(gè)屬性即可。
我們解析到的內(nèi)容通過(guò)attr[‘onclick'],可以得到他的屬性open1(‘夜','http://p9-dy.byteimg.com/obj/61a20007a98954b0831d),如何能快速獲取歌曲名字和url呢?這里我們需要用到一個(gè)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:今天一個(gè)朋友說(shuō)我寫(xiě)代碼沒(méi)注釋,我這是現(xiàn)身說(shuō)法的告訴你,如何能寫(xiě)出讓別人壓根看不懂的代碼,就是不寫(xiě)注釋啊,哈哈!其實(shí),代碼我都在文章中一點(diǎn)一點(diǎn)的講解了,所以沒(méi)有寫(xiě),但秉承著害怕大佬們?nèi)£P(guān)的心態(tài),我還是把注釋加上吧…
總體來(lái)說(shuō)實(shí)現(xiàn)比較簡(jiǎn)單,全部代碼如下:
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(): """ 獲取代碼執(zhí)行目錄,并在目錄下創(chuàng)建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方法 如果為網(wǎng)頁(yè)請(qǐng)求,返回網(wǎng)頁(yè)內(nèi)容 否則,解析音樂(lè)地址,并返回音樂(lè)二進(jìn)制文件 :param url: 請(qǐng)求url(分網(wǎng)頁(yè)、音樂(lè)兩類) :return: 網(wǎng)頁(yè)內(nèi)容 音樂(lè)二進(jìn)制文件 """ r = requests.get(url, timeout=5) if url.endswith('html'): return r.text else: return r.content def analysis_html(self, html): """ 根據(jù)獲取的網(wǎng)頁(yè)內(nèi)容,解析音樂(lè)名稱、下載地址 調(diào)用音樂(lè)下載方法 :param html: 網(wǎng)頁(yè)內(nèi)容 """ soup = BeautifulSoup(html, 'lxml') # 根據(jù)關(guān)鍵字onclick查找每個(gè)下載地址 for tag_a in soup.findAll('a', attrs={'onclick': True}): # 下載格式'("name","link","")',通過(guò)eval將str轉(zhuǎn)化為tuple類型 link_list = eval(tag_a['onclick'][5:]) music_name, music_link = link_list[:2] # 因?yàn)榇嬖诓糠种貜?fù)音樂(lè),故設(shè)置判斷下載過(guò)的音樂(lè)跳過(guò) 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): """ 解析音樂(lè)文件,完成音樂(lè)下載 :param music_name: 音樂(lè)名稱 :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("抖音音樂(lè):{} 下載完成".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()
來(lái)讓我們看看效果吧:
網(wǎng)站是通過(guò)nginx負(fù)載均衡搭建的,有一些鏈接已經(jīng)失效了。最終下載了不重復(fù)的592首抖音音樂(lè)。
同樣的,大家喜歡可以按照這種方法,嘗試下載一下網(wǎng)站的抖音視頻。
以上就是如何用Python一次性下載抖音上音樂(lè)的詳細(xì)內(nèi)容,更多關(guān)于Python一次性下載抖音上音樂(lè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:益陽(yáng) 黔西 惠州 黑龍江 常德 鷹潭 上海 四川
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《如何用Python一次性下載抖音上音樂(lè)》,本文關(guān)鍵詞 如,何用,Python,一次性,下載,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。