最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何用Python一次性下載抖音上音樂(lè)

 更新時(shí)間:2021年05月17日 11:08:33   作者:華為云開發(fā)者社區(qū)  
不知道什么時(shí)候開始,中國(guó)出現(xiàn)了南抖音、北快手的互文格局。喜歡抖音主要是兩個(gè)初衷,學(xué)做菜聽音樂(lè)。抖音捧紅了很多人,也讓很多本不怎么讓大家熟知的歌曲、BGM,經(jīng)過(guò)翻唱、混剪與視頻搭配,從而傳播大街小巷。有沒(méi)有想過(guò)將這些好聽的剪輯批量下載下來(lái)呢?

Python 鏈接抖音

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ò)開發(fā)簡(jiǎn)單網(wǎng)站配置域名后,讓大家訪問(wèn)。讓我們來(lái)看看抖音網(wǎng)頁(yè)版:

爬蟲實(shí)現(xiàn)分析

熱歌榜內(nèi)容

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

網(wǎng)頁(yè)解析

網(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爬蟲快速入門:https://www.jianshu.com/p/ae38f7607902,我在文章中專門提到了一個(gè)小技巧,通過(guò)使用attr的屬性進(jìn)行快速解析,那么最快速的獲取方式是:

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

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

巧用eval

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

代碼實(shí)現(xiàn)

總體來(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)文章!

相關(guān)文章

  • 使用fiddler抓包工具Python requests報(bào)錯(cuò):ValueError: check_hostname requires server_hostname的解決

    使用fiddler抓包工具Python requests報(bào)錯(cuò):ValueError: check_h

    這篇文章主要介紹了使用fiddler抓包工具Python requests報(bào)錯(cuò):ValueError: check_hostname requires server_hostname的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 基于Python制作B站視頻下載小工具

    基于Python制作B站視頻下載小工具

    這篇文章主要為大家介紹一個(gè)小工具,可以用于B站視頻的下載,只需要輸入對(duì)應(yīng)視頻的網(wǎng)頁(yè)地址就可以進(jìn)行下載到本地了。感興趣的可以了解一下
    2022-01-01
  • 使用python實(shí)現(xiàn)excel的Vlookup功能

    使用python實(shí)現(xiàn)excel的Vlookup功能

    這篇文章主要介紹了使用python實(shí)現(xiàn)excel的Vlookup功能,當(dāng)我們想要查找的數(shù)據(jù)量較大時(shí),這時(shí)則有請(qǐng)我們的主角VLookup函數(shù)出場(chǎng),那么如何用python實(shí)現(xiàn)VLookup呢,需要的朋友可以參考下
    2023-04-04
  • Python+Flask實(shí)現(xiàn)自定義分頁(yè)的示例代碼

    Python+Flask實(shí)現(xiàn)自定義分頁(yè)的示例代碼

    分頁(yè)操作在web開發(fā)中幾乎是必不可少的,而flask不像django自帶封裝好的分頁(yè)操作。所以本文將自定義實(shí)現(xiàn)分頁(yè)效果,需要的可以參考一下
    2022-09-09
  • python多線程使用方法實(shí)例詳解

    python多線程使用方法實(shí)例詳解

    這篇文章主要介紹了python多線程使用方法,結(jié)合實(shí)例形式詳細(xì)分析了Python多線程thread模塊、鎖機(jī)制相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Python編程把二叉樹打印成多行代碼

    Python編程把二叉樹打印成多行代碼

    這篇文章主要介紹了Python編程把二叉樹打印成多行代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python sklearn CountVectorizer使用詳解

    Python sklearn CountVectorizer使用詳解

    這篇文章主要介紹了Python_sklearn_CountVectorizer使用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Python使用matplotlib 畫矩形的三種方式分析

    Python使用matplotlib 畫矩形的三種方式分析

    這篇文章主要介紹了Python使用matplotlib 畫矩形的三種方式,結(jié)合實(shí)例形式分析了Python基于matplotlib繪制矩形的具體實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • Python實(shí)現(xiàn)的本地文件搜索功能示例【測(cè)試可用】

    Python實(shí)現(xiàn)的本地文件搜索功能示例【測(cè)試可用】

    這篇文章主要介紹了Python實(shí)現(xiàn)的本地文件搜索功能,涉及Python針對(duì)文件與目錄的遍歷、判斷、編碼轉(zhuǎn)換、查找等相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • python如何利用matplotlib繪制并列雙柱狀圖并標(biāo)注數(shù)值

    python如何利用matplotlib繪制并列雙柱狀圖并標(biāo)注數(shù)值

    Python之中最好的圖表庫(kù)叫matplotlib,matplotlib,顧名思義就是提供了一整套和matlab相似的API,它的文檔相當(dāng)完備,下面這篇文章主要給大家介紹了關(guān)于python如何利用matplotlib繪制并列雙柱狀圖并標(biāo)注數(shù)值的相關(guān)資料,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

常德市| 科技| 什邡市| 天柱县| 七台河市| 湾仔区| 郸城县| 石渠县| 洪洞县| 昆明市| 报价| 加查县| 德江县| 沙雅县| 淮北市| 巴林右旗| 淄博市| 小金县| 方山县| 大理市| 永善县| 比如县| 龙游县| 石柱| 山阴县| 高阳县| 孟村| 耿马| 禄丰县| 包头市| 庆城县| 德阳市| 临海市| 城口县| 孟州市| 湖州市| 鄂州市| 松潘县| 桦南县| 西安市| 彩票|