溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么用Python一次性下載某音上的音樂

發(fā)布時間:2022-02-21 15:47:04 來源:億速云 閱讀:124 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“怎么用Python一次性下載某音上的音樂”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么用Python一次性下載某音上的音樂”吧!

Python 鏈接抖音

python下載某音內(nèi)容的帖子網(wǎng)上有一些,但都比較麻煩,需要通過adb連接安卓手機(jī)后,模擬操作。我這么懶,這種事兒玩不來…那么,該如何獲取某音內(nèi)容呢?網(wǎng)上搜了下大概有兩種方式,一個是瀏覽器插件快抖,另外一個是我今天要說的某音網(wǎng)頁版。其實這兩者差別不是很大,都是先將某音內(nèi)容下載至服務(wù)器后,通過開發(fā)簡單網(wǎng)站配置域名后,讓大家訪問。

爬蟲實現(xiàn)分析

熱歌榜內(nèi)容

大家先開看看這個抖音熱歌榜歌曲,每頁20首歌曲,一個55頁。但細(xì)不細(xì)心大家都能發(fā)現(xiàn),很多歌曲存在重復(fù)的問題。所以,等下爬蟲的時候,我們需要先準(zhǔn)備一個music_list,用來識別這首歌曲是否已經(jīng)下載過了…

網(wǎng)頁解析

網(wǎng)頁比較簡單,一個div中包裹了一個ul>li*20,我們是不是該這樣獲?。?/p>

soup.find('div',{"class":"pull-left"}).find('ul').findAll('a')

如果你說是,那么一定沒有好好看我前天整理的文章通過哪吒豆瓣影評,帶你分析python爬蟲快速入門:https://www.jianshu.com/p/ae38f7607902,我在文章中專門提到了一個小技巧,通過使用attr的屬性進(jìn)行快速解析,那么最快速的獲取方式是:

soup.findAll('a', attrs={'onclick': True})

我們只需要獲取所有的a標(biāo)簽,切這些標(biāo)簽中包含onclick這個屬性即可。

巧用eval

我們解析到的內(nèi)容通過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:今天一個朋友說我寫代碼沒注釋,我這是現(xiàn)身說法的告訴你,如何能寫出讓別人壓根看不懂的代碼,就是不寫注釋啊,哈哈!其實,代碼我都在文章中一點一點的講解了,所以沒有寫,但秉承著害怕大佬們?nèi)£P(guān)的心態(tài),我還是把注釋加上吧…

代碼實現(xiàn)

總體來說實現(xià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)頁請求,返回網(wǎng)頁內(nèi)容
        否則,解析音樂地址,并返回音樂二進(jìn)制文件
        :param url: 請求url(分網(wǎng)頁、音樂兩類)
        :return: 網(wǎng)頁內(nèi)容 & 音樂二進(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)頁內(nèi)容,解析音樂名稱、下載地址
        調(diào)用音樂下載方法
        :param html: 網(wǎng)頁內(nèi)容
        """
        soup = BeautifulSoup(html, 'lxml')
        # 根據(jù)關(guān)鍵字onclick查找每個下載地址
        for tag_a in soup.findAll('a', attrs={'onclick': True}):
            # 下載格式'("name","link","")',通過eval將str轉(zhuǎn)化為tuple類型
            link_list = eval(tag_a['onclick'][5:])
            music_name, music_link = link_list[:2]
            # 因為存在部分重復(fù)音樂,故設(shè)置判斷下載過的音樂跳過
            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()

到此,相信大家對“怎么用Python一次性下載某音上的音樂”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI