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.mzph.cn/news/534625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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…

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

当需要把在Windows上开发的Java程序用在Linux上运行时,就需要吧该Java程序打包成jar包上传到Linux上去运行。1.Java程序用MyEclipse打包成可运行的jar包(1)在MyEclipse中选中需要打包的项目,点击右键,选择:Export... 如下图所示&a…

mysql.h 动态编译命令_Linux环境编译动态库和静态库总结

对Linux环境动态库和静态库的一些基础知识做一些总结,首先总结静态库的编译步骤。1 先基于.cpp或者.c文件生成对应的.o文件2将几个.o文件 使用ar -cr命令 生成libname.a文件libname.a 为静态库, name 为静态库的名字,可以根据模块功能命名。举…

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方法重载实事例_零基础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…

mysql对称连接什么意思_对称加密与非对称加密的区别是什么

区别:1、对称加密中加密和解密使用的秘钥是同一个;非对称加密中采用两个密钥,一般使用公钥进行加密,私钥进行解密。2、对称加密解密的速度比较快,非对称加密和解密花费的时间长、速度相对较慢。3、对称加密的安全性相对…

php 支付签名验证失败,choosewxpay fail解决,微信支付签名验证错误解决

require_once("config.php"); //这个文件原来写过的博客有http://jipq1016.com/display.php?id9//统一下单$openid$_POST[openid];$arr[appid]$appid; //商户appid$arr[mch_id]$mch_id; //微信支付…

趣学java,编程趣学习app

编程趣学习在这里会有多种编程语言是可以去学习的Java或者是c,入门级的海鸥就是更加有难度的都是可以选择一个自己可以去学习的课程,跟着讲师一同开始及逆行语言基础知识的学习后面大家就是根据自己的的课后作业完成,去自己调试新的程序。编程…

aix升级新安装oracle,安装Oracle 11gR2 AIX 5.3 升级到TL11的一些小记录

Dep-app 需要locdevices.usbif.08025002.rtersct.compat.basic.sp打5300-11-00-0943时需要devices.usbif.08025002.rte 5.3.11.0 重启可以 或 删除 devices.usbif.08025002.rte 5.3.7.7打5300-11-04-1015时需要bos.sysmgt.sysbr 5.3.11.0 5.3.11.3bos.sysmgt.sysbr 需要bos…

jmeter无法释放oracle连接,jmeter 连接ORACLE数据库错误及解决方法

问题一:Response message: java.sql.SQLException:Cannot load JDBC driver class ‘oracle.jdbc.driver.OracleDriver‘未引入ojdbc14.jar包所致,2种解决方案,最好重启一下:1.在测试计划页面中,点击浏览,选…

oracle11g ora 12518,servlet执行update报错ORA-12518

ORA-12518: TNS:listener could not hand off client connection这种错误一般是在测试数据库并发性的,多个用户的,后台用servleORA-12518: TNS:listener could not hand off client connection这种错误一般是在测试数据库并发性的,多个用户的…

linux怎么添加头文件目录下,linux下编写c++,include的那些头文件在什么地方?

炎炎设计C/C程序在linux下被编译和连接时,GCC/G会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径。自己指定的路径就不说了,这里说明一下系统自动搜索的路径。【1】include头文件路径除了默认的/usr/include, /usr/local…

linux内核调度 0号进程,Linux内核源代码情景分析---第四章 进程与进程调度

4.1 进程四要素什么是进程?1:有一段代码段供其执行,这代码段不一定是进程所专用,可以与其他进程公用。2:每个进程有其专用的系统空间的堆栈(栈)【这个栈是进程起码的“私有财产”】3:在内核中,要…

redhat linux 系统管理,红帽系统管理一 (RH124)

红帽系统管理一 (RH124)时间:2018-04-24 14:06:52第 1 部分 — 红帽企业 Linux 管理员所需掌握的核心系统管理任务本课程涉及使用红帽 企业 Linux 7。红帽系统管理一 (RH124) 专为之前没有 Linux 系统管理经验的 IT 专业人员设计。本课程侧重讲解 Linux 系统的核心管…

linux命令行聊天,Linux 下使用talk 进行聊天

Linux中talk命令参数程序用于Internet上两个用户之间进行“交谈”:通过键盘输入“说话”,通过看终端屏幕“聆听”。Linux中talk命令参数程序的使用很简单,只要知道交谈对象的地址,就可以邀请对方交谈。格式:talk usert…

在linux中which命令,Linux 中 which 命令怎么用?

在Linux中which命令的作用是在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果,其用法为“which [文件...]”,其参数有“-n”、“-p”、“-w”和“-V”。Linux which命令用于查找文件。which指令会在环境变量…

c语言怎样用格式化文件存储,如何用格式化的方式读写文件

对格式会来说,C语言的格式读写文件是很有要求的,在前面我们已经讲解了如何去进行字符的输入输出,但事实真相,数据的类型是很丰富的,而且大家已经熟悉了用printf和scanf函数进行格式化的输入输出,他们是向终…