python 抽獎 配音樂_抖音上超好聽的神曲音樂,Python教你一次性下載

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

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

Python 鏈接抖音

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

843f8bb0e3244b39eca1d16ed2ba5d05.png

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

爬蟲實現分析

熱歌榜內容

a2c7fbe4f2a5b7ea2fd72245472aee13.png

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

網頁解析

943096dec170d5fb1b981117c2f7ee0c.png

網頁比較簡單,一個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(‘夜’,’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', '')

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()

來讓我們看看效果吧:

65b46f575c9410af2b50bf4280af8818.png

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

863d372dc6cdbb4a1674688beeba70c3.png

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

本文作者華為云 | 清風Python

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534625.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534625.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534625.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql批量寫入100萬數據_Mysql數據庫實踐操作之————批量插入數據(100萬級別的數據)-阿里云開發者社區...

第一種方法:使用insert into 插入從Redis每次獲取100條數據,根據條件去插入到Mysql數據庫中:條件:如果當前隊列中的值大于1000條,則會自動的條用該方法,該方法每次獲取從隊列的頭部每次獲取100掉數據插入到…

mysql多客戶端數據不同步_一種多終端設備上的數據同步方法

一種多終端設備上的數據同步方法【技術領域】[0001] 屬于移動通信技術領域,特別是涉及基于離網環境下多種移動終端設備之間的數 據同步的方法。 技術背景[0002] 90年代未,數據同步始于有線連接,如MAC機作為數據中心,與終端設備(iP…

oem監控mysql_OEM12c 安裝配置MySQL Plug-in用來監控MySQL

Plug-in--注冊信息[roottest agent]# /oem/emcli setup -urlhttps://omsdb.localdomain:7301/em -usernamesysmanOracle Enterprise Manager 12c 3.Copyright (c) 1996, 2013 Oracle Corporation and/or its affiliates. All rights reserved.The configuration directory &quo…

怎么利用迭代器寫入mysql_range()是什么?為什么不生產迭代器?

本篇文章給大家帶來的內容是關于range()是什么?為什么不生產迭代器?有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。迭代器是 23 種設計模式中最常用的一種(之一),在 Python 中隨處可見它的身影&#x…

java 流式_Java開發筆記(七十二)Java8新增的流式處理

通過前面幾篇文章的學習,大家應能掌握幾種容器類型的常見用法,對于簡單的增刪改和遍歷操作,各容器實例都提供了相應的處理方法,對于實際開發中頻繁使用的清單List,還能利用Arrays工具的asList方法給清單對象做初始化賦…

java保留二位小數_java使double保留兩位小數的多方法 java保留兩位小數

復制代碼代碼如下:mport java.text.DecimalFormat;DecimalFormat df new DecimalFormat("######0.00");double d1 3.23456double d2 0.0;double d3 2.0;df.format(d1);df.format(d2);df.format(d3);3個結果分別為:復制代碼代碼如下:3.230.002.00java保留兩位…

linux java jar打包_【Java】Java程序打包成jar包在Linux上運行

當需要把在Windows上開發的Java程序用在Linux上運行時,就需要吧該Java程序打包成jar包上傳到Linux上去運行。1.Java程序用MyEclipse打包成可運行的jar包(1)在MyEclipse中選中需要打包的項目,點擊右鍵,選擇:Export... 如下圖所示&a…

java匿名對象 回收_Java 匿名對象

我們知道一般實例化一個對象的格式,如下:Car car new Car();其中,變量名 car 就是 new Car() 這個對象的名字。car 是引用類型的變量,它的值存放的是對象的引用(或地址),通過 car 這個變量我們就可以間接使用對象。那…

java int 正則表達式_java正則表達式

Java正則表達式正則表達式定義了字符串的模式。正則表達式可以用來搜索、編輯或處理文本。正則表達式并不僅限于某一種語言,但是在每種語言中有細微的差別。Java正則表達式和Perl的是最為相似的。java.util.regex包主要包括以下三個類:Pattern類&#xf…

mysql.h 動態編譯命令_Linux環境編譯動態庫和靜態庫總結

對Linux環境動態庫和靜態庫的一些基礎知識做一些總結,首先總結靜態庫的編譯步驟。1 先基于.cpp或者.c文件生成對應的.o文件2將幾個.o文件 使用ar -cr命令 生成libname.a文件libname.a 為靜態庫, name 為靜態庫的名字,可以根據模塊功能命名。舉…

netbeans java中文_Ubuntu?下jdk安裝中文字體?java?解決netbeans?方塊字?中文亂碼

安裝環境Ubuntu 11.04、javajdk1.6.0_27首先找到你需要的字體,比如我就是從windows系統里拷出來的,C:\WINDOWS\Fonts這里有很多字體,我只拷貝了simsun.ttc(中文 宋體,從xp系統拷貝的,win7 下沒有這個文件)安裝java后&a…

python 教學_「Python基礎」一次就裝好Python手把手裝到好

一、前言:安裝Python有兩個主要的方法,視情況而定我兩個都會用:(1)安裝 AnacondaAnaconda像一個懶人包,安裝它等于把Python安裝好連同把Python大部分的套件也下載好了,不只如此連通較常用的Python IDE一同幫你裝到好。…

java求二維數組每行的最大值_用JAVA輸入一個二維數組a[3][4]的元素值,求輸出其元素最大值...

展開全部這個簡單啊,把所有元素遍歷一邊62616964757a686964616fe58685e5aeb931333335343963代碼:import java.util.Scanner;public class Help2 {public static void main(String[] args) {Scanner inputnew Scanner(System.in);System.out.print("…

java redis 面試題_Java開發人員怎么面試 常見Redis面試題有哪些

Java開發人員怎么面試?常見Redis面試題有哪些?Redis是目前各大企業都在使用的人們技術,也是企業選拔人才時考核的一個難題。有很多同學只是簡單了解Redis的應用,但對于為什么要用Redis以及企業面試中有關Redis的問題卻答不上來。接…

java方法重載實事例_零基礎java入門教程函數重載function實例化格式案例

java函數的重載,說白了就是函數塊函數名一樣,但函數類型和參數類型和參數列表個數不同重載之和參數列表有關系,與返回值無關java函數重載函數重載鋪墊如下圖函數重載鋪墊上圖功能顯示,功能一致所以功能一致所以用的功能函數名一致…

java 類 屬性數量_跟我學java編程—Java類的屬性與成員變量

在定義類時,經常需要抽象出它的屬性,并定義在類的主體中。下面就來介紹與屬性相關的內容。常量屬性在類中定義的屬性有常量屬性和成員屬性之分。常量屬性用final關鍵字修飾,常量只能賦值一次,在程序中不能修改它的值。一般來說&am…

java獲取界面輸入數字_通過JAVA設計 GUI 界面的計算器程序,用戶可以通過鼠標依次輸入參加計算的數值,進行加、減、乘、...

通過JAVA設計 GUI 界面的計算器程序,用戶可以通過鼠標依次輸入參加計算的數值,進行加、減、乘、2016-08-22 0 0 0 4.0分其他1積分下載如何獲取積分?通過JAVA設計 GUI 界面的計算器程序,用戶可以通過鼠標依次輸入參加計算的數值&am…

java自定義錯誤碼類_如何編寫和應用Java的自定義異常類

11.7.1編寫自定義異常類的模式編寫自定義異常類實際上是繼承一個API標準異常類,用新定義的異常處理信息覆蓋原有信息的過程。常用的編寫自定義異常類的模式如下:public class CustomException extends Exception {//或者繼承任何標準異常類public Custom…

java對mysql查詢_如何利用java對mysql數據庫進行增刪改查

代碼如下:增:Test//數據插入public void demo1() {Connection connnull;Statement stmtnull;try {//注冊驅動Class.forName("com.mysql.jdbc.Driver");//創建連接connDriverManager.getConnection("jdbc:mysql://localhost:3306/name&quo…

util.java_TelnetUtil.java

package com.ailk.ess.webapp2.servermng.net;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import org.apache.commons.net.telnet.TelnetClient;public class TelnetUtil {//telnet客戶端對象VT220/VT52Telnet…