日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python爬蟲(chóng)幫你打包下載所有抖音好聽(tīng)的背景音樂(lè),還不快收藏一起聽(tīng)歌

系統(tǒng) 2069 0

不知道什么時(shí)候開(kāi)始,中國(guó)出現(xiàn)了南抖音、北快手的互文格局(東市買(mǎi)駿馬,西市買(mǎi)鞍韉…)。剛才提到了,之前比較喜歡刷抖音,對(duì)于我這種佛系程序猿,看網(wǎng)上這些整容妹子基本一個(gè)樣。喜歡抖音主要是兩個(gè)初衷,學(xué)做菜聽(tīng)音樂(lè)。朋友之前常說(shuō),人家抖音看妹子看的樂(lè)呵呵,你看人家做菜也能津津有味,一個(gè)人在那兒傻笑…民以食為天,我看到色香味俱全的菜,做的那么好吃的樂(lè)呵樂(lè)呵還不行么。

抖音捧紅了很多人,也讓很多本不怎么讓大家熟知的歌曲、BGM,經(jīng)過(guò)翻唱、混剪與視頻搭配,從而傳播大街小巷。什么“若不是你,突然闖進(jìn)我心里…”亦或者“也許未來(lái)遙遠(yuǎn)在光年之外,我愿守候未知里為你等待…”,成了大家閑時(shí)在嘴邊哼唱的調(diào)調(diào)。那么,有沒(méi)有想過(guò)將這些好聽(tīng)的剪輯批量下載下來(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ò)開(kāi)發(fā)簡(jiǎn)單網(wǎng)站配置域名后,讓大家訪(fǎng)問(wèn)。讓我們來(lái)看看抖音網(wǎng)頁(yè)版:

Python爬蟲(chóng)幫你打包下載所有抖音好聽(tīng)的背景音樂(lè),還不快收藏一起聽(tīng)歌_第1張圖片

哎喲吼,居然看到了昨天爬蟲(chóng)的“喬奶奶”…當(dāng)然今天的重點(diǎn)不是視頻,而是下載它全站所有的音樂(lè)!

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

熱歌榜內(nèi)容

Python爬蟲(chóng)幫你打包下載所有抖音好聽(tīng)的背景音樂(lè),還不快收藏一起聽(tīng)歌_第2張圖片

大家先開(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è)解析

Python爬蟲(chóng)幫你打包下載所有抖音好聽(tīng)的背景音樂(lè),還不快收藏一起聽(tīng)歌_第3張圖片

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

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,我在文章中專(zhuān)門(mén)提到了一個(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', '') 
              
                
index_tuple[0]
'夜'
index_tuple[1]
'http://p9-dy.byteimg.com/obj/61a20007a98954b0831d'
              
            
          

ps:今天一個(gè)朋友說(shuō)我寫(xiě)代碼沒(méi)注釋?zhuān)疫@是現(xiàn)身說(shuō)法的告訴你,如何能寫(xiě)出讓別人壓根看不懂的代碼,就是不寫(xiě)注釋啊,哈哈!
其實(shí),代碼我都在文章中一點(diǎn)一點(diǎn)的講解了,所以沒(méi)有寫(xiě),但秉承著害怕大佬們?nèi)£P(guān)的心態(tài),我還是把注釋加上吧…

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

總體來(lái)說(shuō)實(shí)現(xiàn)比較簡(jiǎn)單,全部代碼如下:

            
              # -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清風(fēng)Python
# @Date     : 2019/7/31 23:25
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : DouYinMusic.py

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è)兩類(lèi))
        :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è)名稱(chēng)、下載地址
        調(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類(lèi)型
            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è)名稱(chēng)
        :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)站的抖音視頻。

The End

OK,今天的內(nèi)容就到這里,如果覺(jué)得內(nèi)容對(duì)你有所幫助,歡迎點(diǎn)擊文章右下角的“在看”。
代碼與下載好的音樂(lè),如果大家喜歡,公眾號(hào)回復(fù) 抖音音樂(lè) 即可獲取百度云下載鏈接。
期待你關(guān)注我的公眾號(hào) 清風(fēng)Python ,如果覺(jué)得不錯(cuò),希望能動(dòng)動(dòng)手指轉(zhuǎn)發(fā)給你身邊的朋友們。

作者:清風(fēng)Python


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 天镇县| 攀枝花市| 兰西县| 柘荣县| 长岭县| 新沂市| 乌恰县| 方正县| 吉安市| 乌恰县| 濉溪县| 广东省| 珠海市| 探索| 河津市| 弥勒县| 成武县| 定陶县| 托里县| 乌鲁木齐市| 同仁县| 北安市| 南昌市| 西平县| 磐石市| 永清县| 榕江县| 贡觉县| 汪清县| 当阳市| 邳州市| 康平县| 鹿泉市| 鄄城县| 南漳县| 锡林郭勒盟| 霍邱县| 广州市| 宁强县| 兴文县| 东明县|