天天看點

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

5月和朋友聊天,決定開設一個公衆号,以部落格的方式每天記載Python知識和有趣的内容。之後經過前期準備與摸索終于在5月31号,首次在公衆号嘗試發文,而今已過兩月時間。

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

剛開始每天下班就期待着開始自己所謂的創作,而現在每晚發愁該寫些什麼來滿足大家的口味;起初媳婦兒大力支援我學習,如今因為寫公衆号沒時間陪家人,時而會引發沖突。細數兩個月更新56篇的文章,用一位簡書朋友的評論高産似母豬,哈哈….

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

由于做公衆号的初衷,是整理學習内容,而非多數人那樣的想将自媒體作為副業,是以沒有找過大号求推薦,也沒有主動向其他公衆号推薦文章。起初讓朋友幫忙發個朋友圈擴散下,之後就是每天清晨轉發下自己的文章,偶爾将文章轉載至公司内網部落格。大家都說東西再好不宣傳也沒人知道,但兩個月下來收獲了800粉絲,還是讓我很感動。不知道還能這樣每周五篇的堅持更新多久,因為自從開了公衆号,每天都是2、3點睡覺,兩個月下來嚴重缺乏睡眠,而且經常熬夜最近胃病又犯了。但對比之前每天回來刷刷抖音、看小說、做做飯的日子充實多了。隻希望能得到家人和朋友們更多的支援,謝謝大家。

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

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

抖音捧紅了很多人,也讓很多本不怎麼讓大家熟知的歌曲、BGM,經過翻唱、混剪與視訊搭配,進而傳播大街小巷。什麼“若不是你,突然闖進我心裡…”亦或者“也許未來遙遠在光年之外,我願守候未知裡為你等待…”,成了大家閑時在嘴邊哼唱的調調。那麼,有沒有想過将這些好聽的剪輯批量下載下傳下來呢?

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

python下載下傳抖音内容的文章網上有一些,但都比較麻煩,需要通過adb連接配接安卓手機後,模拟操作。我這麼懶,這種事兒玩不來…那麼,該如何擷取抖音内容呢?網上搜了下大概有兩種方式,一個是浏覽器插件快抖,另外一個是我今天要說的抖音網頁版。其實這兩者差别不是很大,都是先将抖音内容下載下傳至伺服器後,通過開發簡單網站配置域名後,讓大家通路。讓我們來看看抖音網頁版:

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

哎喲吼,居然看到了昨天爬蟲的“喬奶奶”…當然今天的重點不是視訊,而是下載下傳它全站所有的音樂!

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

熱歌榜内容

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

大家先開看看這個抖音熱歌榜歌曲,每頁20首歌曲,一個55頁。但細不細心大家都能發現,很多歌曲存在重複的問題。是以,等下爬蟲的時候,我們需要先準備一個music_list,用來識别這首歌曲是否已經下載下傳過了…網頁解析

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

網頁比較簡單,一個div中包裹了一個ul>li*20,我們是不是該這樣擷取:soup.find('div',{"class":"pull-left"}).find('ul').findAll('a')

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

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

我們隻需要擷取所有的a标簽,切這些标簽中包含onclick這個屬性即可。巧用eval

我們解析到的内容通過attr[‘onclick’],可以得到他的屬性open1(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:今天一個朋友說我寫代碼沒注釋,我這是現身說法的告訴你,如何能寫出讓别人壓根看不懂的代碼,就是不寫注釋啊,哈哈!其實,代碼我都在文章中一點一點的講解了,是以沒有寫,但秉承着害怕大佬們取關的心态,我還是把注釋加上吧…

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

總體來說實作比較簡單,全部代碼如下:# -*- 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()

來讓我們看看效果吧:

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

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

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

同樣的,大家喜歡可以按照這種方法,嘗試下載下傳一下網站的抖音視訊。

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳

如果大家喜歡,【清風Python】公衆号回複抖音音樂即可擷取百度雲下載下傳連結。

如果覺得不錯,希望能動動手指轉發給你身邊的朋友們。♥

---------------

本文轉自作者:王翔|清風Python

python爬取音樂下載下傳_Python爬取全抖音好聽背景音樂,一次性下載下傳