Python爬虫之爬取某音乐平台(付费)歌曲
off999 2024-12-15 16:04 37 浏览 0 评论
无意间在某站上看到一个视频,便很有兴趣地实践了起来。本篇文章仅仅是作为个人学习笔记所著,如若有所不足之处,欢迎指正。
废话不多说,先上源代码及效果图(如若对你有帮助,请阅读完本文):
网页链接:https://music.163.com/#/playlist?id=5087806619
效果图:
源代码:
# -*- codeing=utf-8 -*-
# @Time:2021/7/22 20:47
# @Atuhor:@lwtyh
# @File:批量下载.py
# @Software:PyCharm
#导入框架(库,模块) pip install xxxx
import requests
from lxml import etree
# http://music.163.com/song/media/outer/url?id=
# 1、确定网址 真实地址在Network----Doc
url = 'https://music.163.com/playlist?id=5087806619'
base_url = 'http://music.163.com/song/media/outer/url?id='
# 2、请求(requests) 图片,视频,音频 content 字符串 text
html_str = requests.get(url).text
# print(type(html_str)) # 字符串类型
# 3、筛选数据xpath(标签语言)
# //a[contains(@href,'/song?')]/@href
result = etree.HTML(html_str) # 转换类型
# print(type(result))
song_ids = result.xpath('//a[contains(@href,"/song?")]/@href') # 歌曲id
song_names = result.xpath('//a[contains(@href,"/song?")]/text()') # 歌名
# print(song_ids)
# print(song_names) #列表
# 对列表进行解压
i = 0 # 按顺序来
for song_id,song_name in zip(song_ids,song_names):
# print(song_id)
# print(song_name)
count_id = song_id.strip('/song?id=') # 去掉/song?id=
# print(count_id)
# 过滤含有“$”符号
if ('#39; in count_id) == False:
# print(count_id)
song_url = base_url + count_id # 拼接url
# print(song_url)
i += 1
mp3 = requests.get(song_url).content
# 4、保存数据
with open('./yinyue/{}.{}.mp3'.format(i,song_name),'wb') as file:
file.write(mp3)
目的:
一张截图,请自行分析:
这是一张再熟悉不过的图片了,想要获取本页面这些音乐,方法很多,如APP内自行下载啥的,但是,本次我想利用所学到的一点皮毛进行下载。
我们都知道,对于网页上的音乐在进行下载时,经常会弹出如下页面:
好好的下载一首歌曲,非要弄得这么麻烦。甚至,有些音乐在下载了软件后,需要付费或者VIP,让人很是苦恼。更严重者,好不容易下载好了,却发现格式不对等种种情况,让人崩溃。
为此我们可以很好地通过简单的爬虫解决以上问题。
对网页进行分析:
1. 在一开始,本人给出了本网页的链接:https://music.163.com/#/playlist?id=5087806619但是细心的小伙伴会发现,在代码中所使用的的网址并非是这个:
url = 'https://music.163.com/playlist?id=5087806619'
这是因为我们所请求的网址并非是浏览器地址栏上的网址,通过这张截图,很清晰地发现我们所请求的网址是哪个了。(这是一个很重要的点,必须学会分析。)
2. 通过对每首歌曲打开,进行网页源代码分析不难发现,本网页的10首歌曲都有一个共同的特点:即https://music.163.com/#/song?id=1475436266
前面的网址为 https://music.163.com/#/song?id= 加每首歌曲的 id 好,这很简单。
3. 然而,我们永远想得过于简单了,到目前为止,我们仅仅是找到了些许规律,但是要真正下载到每一首歌曲,还遥不可及。
因为我们进行了这么久的分析,并没有找到歌曲的真正链接。
通过对这些内容的查找,我们是可以说,根本就无法找到音乐文件(MPEG、MP3、MPEG-4、MIDI、WMA、M4A等)。
那是我们到现在为止还没有请求音乐,而当我们在进行点击播放时会发现如下图所示(与上图进行比较)发现:
- 该网页的请求数量由原来的167一下增加至192,这就证明,当我们在进行播放音乐时,该网页又重新进行了对网页的请求。
- 其次,通过重新查找发现(只需查看后面新的内容)这次有了一些 .m4a 文件。
- 当点击这些文件打开时会发现,有一个新的 Request URL:,当你将该网址复制在新的网页下进行打开,会出现如下图所示(打开时浏览器会自动进行下载该音乐):
或者: 像下图所示,会出现该音频,当你浏览器跟迅雷下载器所绑定,会立马弹出迅雷界面,进行该音乐的下载。
结合上面的情况来说,我们是不是已经成功了呢?但很难过地告诉你,这个网址在短时间内打开,的确会有用,但是,它是有时间限制的,不信的话,你可以过五分钟(或许还不需要这么久)再重新打开该网址,试一下。
那么,照我这么一说,没办法了吗?当然不是,办法还是有的,不然,怎么敢在此“放肆”呢?
问题解决:
通过之前对网页进行分析,我们正一步一步地进行了解、熟悉,且到最后,我们甚至找到了歌曲的最终URL,但是可惜的是,该URL并非是一个永久的,只是一个短暂、临时的动态URL,这简直给我们泼了一盆冷水。
然而,我们无需灰心,俗话说 “ 魔高一尺,道高一丈 ”,办法还是有的。
需将这个问题解决,不得不介绍一个新的URL:
http://music.163.com/song/media/outer/url?id=
在这里,就不卖关子了,这是一个该平台(至于是什么平台,你懂得)的外部链接。在之前的分析中,我们发现了一个很重要的一点,便是这10首歌曲都是一个网址加每首歌曲的id所在的新页面。
在代码中你也会发现所使用的 base_url 便是这个链接。
base_url = 'http://music.163.com/song/media/outer/url?id='
也就是说,我们有了上面的这个网址,便可以为所欲为了。爱动手的你现在便可以立马复制上面的链接,在网页上找到一首歌曲的id号添加至网址后面进行打开(如:http://music.163.com/song/media/outer/url?id=1822734959),是不是得到了如下的界面:
是不是很熟悉呢?没错,这就是之前我们利用网页分析得到的网址所打开的网页,很可惜的是之前那网址是一个临时、动态的网址,对于我们来说进行批量下载没多大用处。所以,当我们现在有了这个新网址,就方便了很多。
好,想一想,既然我们有了这么一个神奇的网址,接下来,该干嘛了呢?好好想一下。
正片开始:
在经过了前面两大点的分析,现在我们可以游刃有余地对这十首音乐进行爬取了。
相信,很多人都知道接下来一步该干什么了吧?
每首音乐可以通过 http://music.163.com/song/media/outer/url?id= 这个网址加每首音乐的 id 进行下载,所以,我们第一步便是想办法获取每首音乐的 id 。
通过之前的这张图不难发现,每首音乐的 id 都在一个a标签内。
#导入框架(库,模块) pip install xxxx
import requests
# 1、确定网址 真实地址在Network----Doc
url = 'https://music.163.com/playlist?id=5087806619'
# 2、请求(requests) 图片,视频,音频 content 字符串 text
html_str = requests.get(url).text
print(html_str)
print(type(html_str)) # 字符串类型
便可以通过上述代码,先将该网页的源代码进行爬取下来,再进行分析。
在这里使用多加了一横打印该页代码的数据类型,不难发现所打印出来的类型为 字符串 。这便有了后续需要将该内容转换为 _Element对象 。
>>>result = etree.HTML(html_str) # 转换类型
>>>print(type(result))
class 'lxml.etree._Element'> #输出类型
作为_Element对象,可以方便地使用getparent()、remove()、xpath()等方法。
而此次爬虫,恰恰所使用的的便是 xpath() 方法。
所以,还需要导入一个新的模块,即:
from lxml import etree
通过浏览器的 XPath Helper 插件可以快速地匹配到每首音乐的 id 。
song_ids = result.xpath('//a[contains(@href,"/song?")]/@href') # 歌曲id
song_names = result.xpath('//a[contains(@href,"/song?")]/text()') # 歌名
print(song_ids)
print(song_names) #列表
而当我们打印出来时,却发现这是一个列表类型。不着急,可以借用 for 进行快速遍历:
for song_id,song_name in zip(song_ids,song_names):
print(song_id)
print(song_name)
通过打印发现,前面多了一些 /song?id= ,这时,便使用下面这行代码,进行删减:
count_id = song_id.strip('/song?id=') # 去掉/song?id=
歌名没有进行打印了,因为我们主要是获取每首音乐的 id ,然而,仔细看上图发现后面多了三个无用的,这三个必须删掉才行,不然在进行后面的 URL 拼接,肯定会报错,因为压根就找不到这样的一个网址。便有了后面的判断语句。
# 过滤含有“$”符号
if ('#39; in count_id) == False:
print(count_id)
清一色id号:
接下来便是拼接新的URL:
song_url = base_url + count_id # 拼接url
print(song_url)
在浏览器里打开上面的任意链接,即可获取该音乐的链接,并进行下载。
但是,我们最终的目的肯定不在于此,而是让爬虫自动帮我们全部下载并进行保存至文件夹。
mp3 = requests.get(song_url).content
所以,我们便进行请求网址,获取每首音乐。最后,在进行保存即可。
# 4、保存数据
with open('./yinyue/{}.{}.mp3'.format(i,song_name),'wb') as file:
file.write(mp3)
需要注意的是,源代码中本人在 for 进行遍历时,增加了一个变量 i ,这是为了我们所爬取下来的音乐保存在文件夹的顺序还是如网页中的顺序所一样,当然如若不需要可将其删除。
到现在看来,我们爬取到了这歌单中的10首音乐,那试想一下,获取其它歌单中的音乐是不是也可以用相同的方法进行获取呢?爱动手的你,快去试一试吧!实践出真知!
说在最后的话:
- 学无止境。利用写博客的方式将所学内容进行一遍温习,加深自己的印象,强化学习。
- 同时,写出来的每一篇笔记为大家作参考,也欢迎各位大佬进行指点,相互交流学习。
- 如若侵权,联系即删!
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
