1、前言

最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊!

本文主要参考 python编写GUI版网易云音乐爬虫 后改写,有兴趣的可以看看文章的GUI,了解更多知识~

2、Python + 爬虫

首先,说一下准备工作:

  • Python:需要基本的python语法基础
  • requests:专业用于请求处理,requests库学习文档中文版
  • lxml:其实可以用pythonth自带的正则表达式库re,但是为了更加简单入门,用 lxml 中的 etree 进行网页数据定位爬取。
  • re:python正则表达式处理
  • json:python的json处理库

如果大家对上面的库还比不懂,可以看看我的之前文章 《Python爬虫实践入门篇》

然后,说一下我们现在已经知道下载链接是这样的:

http://music.163.com/song/media/outer/url?id='

id 就是歌曲的id!

所以,现在我们爬虫主要的工作就是找到这个id,当然为了更好的保存,也要找到这个歌名啦!

那现在就是要找到我们需要爬虫的网站链接啦!我分析了一下,大概是下面三种:

#歌曲清单
music_list = 'https://music.163.com/#/playlist?id=2412826586'
#歌手排行榜
artist_list = 'https://music.163.com/#/artist?id=8325'
#搜索列表
search_list = 'https://music.163.com/#/search/m/?order=hot&cat=全部&limit=435&offset=435&s=梁静茹'

如果你已经只是想下载一首歌,比如静茹-勇气:https://music.163.com/#/song?id=254485,那你直接就用浏览器打开 http://music.163.com/song/media/outer/url?id=254485 就可以了,没必要爬虫啊!

好啦!感觉重点都说完了,提取和解析就是用 lxml,不懂的就看我之前的文章啊 《Python爬虫实践入门篇》

3、下载歌词

如果还要下载歌词,那也很简单,通过接口,有歌曲的id就可以:

url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)

返回的json数据大概长这样:

{sgc: true,sfy: false,qfy: false,lrc:{version: 7,lyric: "[00:39.070]开了窗 等待天亮\n[00:46.160]看这城市 悄悄的 熄了光\n[00:51.850]听风的方向\n[00:55.090]这一刻 是否和我一样\n[00:58.730]孤单的飞翔\n[01:02.300]模糊了眼眶\n[01:07.760]广播里 那首歌曲\n[01:14.830]重复当时 那条街那个你\n[01:20.410]相同的桌椅\n[01:23.740]不用言语 就会有默契\n[01:27.470]这份亲密\n[01:30.560]那么熟悉\n[01:33.850]在爱里 等着你\n[01:37.480]被你疼惜 有种暖意\n[01:41.090]在梦里 全是你\n[01:43.920]不要再迟疑 把我抱紧"},klyric:{version: 0,lyric: null},tlyric:{version: 0,lyric: null},code: 200
}

剩下的也没有什么好说的啦!

4、坑点与进阶

表面上很简单,但是需要注意的是,网易返回的链接,数据是js动态加载,也就是爬虫得到的网页数据和浏览器得到的dom内容和结构不一样!


  • 其中,搜索列表爬虫回来的内容,完全得不到歌曲id!!!

  • 解决
    解决方法也是有的!

    • python模拟浏览器
      使用selenium+phantomjs无界面浏览器,这两者的结合其实就是直接操作浏览器,可以获取JavaScript渲染后的页面数据。

    缺点:

    由于是无界面浏览器,采用此方案效率极低,如果大批量抓取不推荐。
    对于异步请求并且数据在源码中并不存在的,同时也就无法抓取到的数据。

    • 搜索的歌曲变成歌单
      比如想下载全部的某一歌手的全部音乐,用手机云音乐搜索,然后全部保存到新建一个歌单,这样就可以啦!
  • 进阶
    如果想使用了解更多网易云音乐js的加密解密过程,可以看看这个 Python 爬虫如何获取 JS 生成的 URL 和网页内容? - 路人甲的回答 - 知乎

总结

用python,就一定要简单,我认为复杂的东西,还是尽量少做,能取巧就取巧,所以本文没有使用selenium+phantomjs实践,如果想了解更多selenium+phantomjs内容,可以参考文末引用链接。

注:本文只是技术交流,请不要商业用途~ 如有违反,本人一概不负责。

全部代码

又是非常简单的100行代码完事!!!

GitHub: WebCrawlerExample/163_NeteaseMusic.py at master · iHTCboy/WebCrawlerExample


import os
import re
import json
import requests
from lxml import etreedef download_songs(url=None):if url is None:url = 'https://music.163.com/#/playlist?id=2384642500'url = url.replace('/#', '').replace('https', 'http')  # 对字符串进行去空格和转协议处理# 网易云音乐外链url接口:http://music.163.com/song/media/outer/url?id=xxxxout_link = 'http://music.163.com/song/media/outer/url?id='# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36','Referer': 'https://music.163.com/','Host': 'music.163.com'}# 请求页面的源码res = requests.get(url=url, headers=headers).texttree = etree.HTML(res)# 音乐列表song_list = tree.xpath('//ul[@class="f-hide"]/li/a')# 如果是歌手页面artist_name_tree = tree.xpath('//h2[@id="artist-name"]/text()')artist_name = str(artist_name_tree[0]) if artist_name_tree else None# 如果是歌单页面:#song_list_tree = tree.xpath('//*[@id="m-playlist"]/div[1]/div/div/div[2]/div[2]/div/div[1]/table/tbody')song_list_name_tree = tree.xpath('//h2[contains(@class,"f-ff2")]/text()')song_list_name = str(song_list_name_tree[0]) if song_list_name_tree else None# 设置音乐下载的文件夹为歌手名字或歌单名folder = './' + artist_name if artist_name else './' + song_list_nameif not os.path.exists(folder):os.mkdir(folder)for i, s in enumerate(song_list):href = str(s.xpath('./@href')[0])song_id = href.split('=')[-1]src = out_link + song_id  # 拼接获取音乐真实的src资源值title = str(s.xpath('./text()')[0])  # 音乐的名字filename = title + '.mp3'filepath = folder + '/' + filenameprint('开始下载第{}首音乐:{}\n'.format(i + 1, filename))try:  # 下载音乐#下载歌词#download_lyric(title, song_id)data = requests.get(src).content  # 音乐的二进制数据with open(filepath, 'wb') as f:f.write(data)except Exception as e:print(e)print('{}首全部歌曲已经下载完毕!'.format(len(song_list)))def download_lyric(song_name, song_id):url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36','Referer': 'https://music.163.com/','Host': 'music.163.com'# 'Origin': 'https://music.163.com'}# 请求页面的源码res = requests.get(url=url, headers=headers).textjson_obj = json.loads(res)lyric = json_obj['lrc']['lyric']reg = re.compile(r'\[.*\]')lrc_text = re.sub(reg, '', lyric).strip()print(song_name, lrc_text)if __name__ == '__main__':#music_list = 'https://music.163.com/#/playlist?id=2384642500' #歌曲清单music_list = 'https://music.163.com/#/artist?id=8325' #歌手排行榜# music_list = 'https://music.163.com/#/search/m/?order=hot&cat=全部&limit=435&offset=435&s=梁静茹' #搜索列表download_songs(music_list)

参考

  • python编写GUI版网易云音乐爬虫
  • Python爬虫实践入门篇 | iHTCboy's blog
  • Python 爬虫如何获取 JS 生成的 URL 和网页内容? - 路人甲的回答 - 知乎
  • Python 爬虫获取网易云音乐歌手歌词
  • python爬虫的最佳实践(五)--selenium+PhantomJS的简单使用
  • Selenium with Python — Selenium Python Bindings 2 documentation
  • ariya/phantomjs: Scriptable Headless Browser
  • WebCrawlerExample/163_NeteaseMusic.py at master · iHTCboy/WebCrawlerExample
  • 如有疑问,欢迎在评论区一起讨论!
  • 如有不正确的地方,欢迎指导!

注:本文首发于 iHTCboy's blog,如若转载,请注来源

Python爬虫实践-网易云音乐相关推荐

  1. Python爬虫之网易云音乐下载

    Python爬虫之网易云音乐下载 目标 用Python根据网易云音乐的ID,下载音乐,保存到本地MP3格式 可以下载歌曲的范围:所有能够听的歌曲 配置基础 Python 3.5 模块 pycrypto ...

  2. python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...

    1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...

  3. 如何利用python爬虫获取网易云音乐某个歌手简介_Python 爬虫获取网易云音乐歌手信息...

    今天就先带大家爬取网易云音乐下的歌手信息并把数据保存下来. 爬取结果 环境 语言:Python 工具:Pycharm 导包 BeautifulSoup:用来解析源码,提取需要的元素. selenium ...

  4. Python爬虫获取网易云音乐 我的喜欢歌单 歌曲数据

    需求:突然奇想,获取网易云音乐 我的喜欢 歌单音乐数据 获取歌曲详情 如标题,歌手,时长,专辑等等 思路: 爬虫请求url 获取数据,找到对的链接请求就成功了一半,查看返回数据,然后保存数据(歌曲+歌 ...

  5. 源码 | Python爬虫之网易云音乐下载

    目标 偶然的一次机会听到了房东的猫的<云烟成雨>,瞬间迷上了这慵懒的嗓音和学生气的歌词,然后一直去循环听她们的歌.然后还特意去刷了动漫<我是江小白>,好期待第二季- 我多想在见 ...

  6. 爬虫入门——用python爬取网易云音乐热门歌手评论数

    本文参考Monkey_D_Newdun 的文章 https://blog.csdn.net/Monkey_D_Newdun/article/details/79318629 用爬虫获取网易云音乐热门歌 ...

  7. 手把手教你用Python网络爬虫获取网易云音乐歌曲

    前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将 ...

  8. Python爬取网易云音乐热歌榜(爬虫)

    Python爬取网易云音乐热歌榜歌曲,并下载到本地 找到要下载歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更 ...

  9. [爬虫]Python爬取网易云音乐搜索并下载歌曲!

    Python爬取网易云音乐搜索并下载歌曲! 文章目录 Python爬取网易云音乐搜索并下载歌曲! 1.准备工作 2."实地"观察 3.开始码代码! 4.搜索并下载 结束语 1.准备 ...

最新文章

  1. E431 笔记本电池问题 0190 Critical low-battery error 解决办法
  2. iphone11系统输入框的光标位置不正常
  3. Windows XP 专业版与家庭版的区别
  4. 遍历repeater中的控件的几种方式
  5. Effective C++ ——设计与声明
  6. Hdu2660 Accepted Necklace【简单dfs】
  7. [NOI2014]动物园
  8. 基于C#的安全聊天工具设计
  9. 微信开发者工具在C盘下User Data有啥用,能删掉吗?占用空间超大
  10. 中小工厂的ERP和生产管理系统
  11. 我的MIT代数拓扑笔记
  12. Axure RP 9.0 Enterprise 原型设计
  13. echarts:基于上一篇我来给大家讲讲 如果你设置了自动播放但是鼠标放上去不生效 停留时间很短 应该怎么做呢???
  14. 【STC8A8K64D4开发板】——开发板程序下载
  15. eclipse 打包springcloud 项目出错怎么解决
  16. Fire (poj 2152 树形dp)
  17. 123456G随想~
  18. 什么是SPOOLing?
  19. Safari iframe方式无法呼起微信app之问题探索
  20. 百度在40所高校办了AI俱乐部,俱乐部还百度一堆黑科技

热门文章

  1. 优秀的 Verilog/FPGA开源项目介绍(二十一)- 卷积神经网络(CNN)
  2. ngrok使用/踩坑分析-http代理
  3. 彩色喷头程序开发项目外包
  4. name = STXingkai/OT, rootname = STXingkai/OT LaTex Package fontspec Error报错解决
  5. Amazon亚马逊卖家设置World First(WF卡)收款教程!
  6. 云计算中的存储基础知识
  7. 六天八小时能否主张加班费?
  8. 京东架构师讲解京东是如何优化列表页的
  9. HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明
  10. 机器学习中的度量指标:ROC曲线,AUC值,K-S曲线