抖音上超好聽的神曲音樂,Python教你一次性下載

不知道何時開始,中國出現了南抖音、北快手的互文格局(東市買駿馬,西市買鞍韉…)。剛纔提到了,以前比較喜歡刷抖音,對於我這種佛系程序猿,看網上這些整容妹子基本一個樣。喜歡抖音主要是兩個初衷,學作菜聽音樂。朋友以前常說,人家抖音看妹子看的樂呵呵,你看人家作菜也能津津有味,一我的在那兒傻笑…民以食爲天,我看到色香味俱全的菜,作的那麼好吃的樂呵樂呵還不行麼。html

抖音捧紅了不少人,也讓不少本不怎麼讓你們熟知的歌曲、BGM,通過翻唱、混剪與視頻搭配,從而傳播大街小巷。什麼「若不是你,忽然闖進我內心…」亦或者「也許將來遙遠在光年以外,我願守候未知裏爲你等待…」,成了你們閒時在嘴邊哼唱的調調。那麼,有沒有想過將這些好聽的剪輯批量下載下來呢?python

Python 連接抖音

python下載抖音內容的帖子網上有一些,但都比較麻煩,須要經過adb鏈接安卓手機後,模擬操做。我這麼懶,這種事兒玩不來…那麼,該如何獲取抖音內容呢?網上搜了下大概有兩種方式,一個是瀏覽器插件快抖,另一個是我今天要說的抖音網頁版。其實這二者差異不是很大,都是先將抖音內容下載至服務器後,經過開發簡單網站配置域名後,讓你們訪問。讓咱們來看看抖音網頁版nginx

哎喲吼,竟然看到了昨天爬蟲的「喬奶奶」…固然今天的重點不是視頻,而是下載它全站全部的音樂瀏覽器

爬蟲實現分析

  • 熱歌榜內容

你們先開看看這個抖音熱歌榜歌曲,每頁20首歌曲,一個55頁。但細不細心你們都能發現,不少歌曲存在重複的問題。因此,等下爬蟲的時候,咱們須要先準備一個music_list,用來識別這首歌曲是否已經下載過了…bash

  • 網頁解析

網頁比較簡單,一個div中包裹了一個ul>li*20,咱們是否是該這樣獲取:服務器

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

若是你說是,那麼必定沒有好好看我前天整理的文章經過哪吒豆瓣影評,帶你分析python爬蟲快速入門:www.jianshu.com/p/ae38f7607…,我在文章中專門提到了一個小技巧,經過使用attr的屬性進行快速解析,那麼最快速的獲取方式是:app

soup.findAll('a', attrs={'onclick': True})複製代碼

咱們只須要獲取全部的a標籤,切這些標籤中包含onclick這個屬性便可。python爬蟲

  • 巧用eval

咱們解析到的內容經過attr[‘onclick’],能夠獲得他的屬性open1(‘夜’,’p9-dy.byteimg.com/obj/61a2000…),如何能快速獲取歌曲名字和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:今天一個朋友說我寫代碼沒註釋,我這是現身說法的告訴你,如何能寫出讓別人壓根看不懂的代碼,就是不寫註釋啊,哈哈!其實,代碼我都在文章中一點一點的講解了,因此沒有寫,但秉承着懼怕大佬們取關的心態,我仍是把註釋加上吧…網站

代碼實現

整體來講實現比較簡單,所有代碼以下:

# -*- coding: utf-8 -*-
# @Author : 王翔
# @JianShu : 清風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():
        """ 獲取代碼執行目錄,並在目錄下建立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):
            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()複製代碼

來讓咱們看看效果吧:

網站是經過nginx負載均衡搭建的,有一些連接已經失效了。最終下載了不重複的592首抖音音樂

一樣的,你們喜歡能夠按照這種方法,嘗試下載一下網站的抖音視頻。

本文做者華爲雲 | 清風Python


點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索