1、前言
最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊!
本文主要参考 python编写GUI版网易云音乐爬虫 后改写,有兴趣的可以看看文章的GUI,了解更多知识~
2、Python + 爬虫
首先,说一下准备工作:
- Python:需要基本的python语法基础
- requests:专业用于请求处理,requests库学习文档中文版
- lxml:其实可以用pythonth自带的正则表达式库re,但是为了更加简单入门,用 lxml 中的 etree 进行网页数据定位爬取。
- re:python正则表达式处理
- json:python的json处理库
如果大家对上面的库还比不懂,可以看看我的之前文章 《Python爬虫实践入门篇》
然后,说一下我们现在已经知道下载链接是这样的:
1 | http://music.163.com/song/media/outer/url?id=' |
id
就是歌曲的id!
所以,现在我们爬虫主要的工作就是找到这个id,当然为了更好的保存,也要找到这个歌名啦!
那现在就是要找到我们需要爬虫的网站链接啦!我分析了一下,大概是下面三种:
1 | #歌曲清单 |
如果你已经只是想下载一首歌,比如静茹-勇气:https://music.163.com/#/song?id=254485
,那你直接就用浏览器打开 http://music.163.com/song/media/outer/url?id=254485
就可以了,没必要爬虫啊!
好啦!感觉重点都说完了,提取和解析就是用 lxml,不懂的就看我之前的文章啊 《Python爬虫实践入门篇》
3、下载歌词
如果还要下载歌词,那也很简单,通过接口,有歌曲的id就可以:
1 | url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id) |
返回的json数据大概长这样:
1 | { |
剩下的也没有什么好说的啦!
4、坑点与进阶
表面上很简单,但是需要注意的是,网易返回的链接,数据是js动态加载,也就是爬虫得到的网页数据和浏览器得到的dom内容和结构不一样!
坑
其中,搜索列表爬虫回来的内容,完全得不到歌曲id!!!解决
解决方法也是有的!- python模拟浏览器
使用selenium+phantomjs无界面浏览器,这两者的结合其实就是直接操作浏览器,可以获取JavaScript渲染后的页面数据。
缺点:
由于是无界面浏览器,采用此方案效率极低,如果大批量抓取不推荐。
对于异步请求并且数据在源码中并不存在的,同时也就无法抓取到的数据。- 搜索的歌曲变成歌单
比如想下载全部的某一歌手的全部音乐,用手机云音乐搜索,然后全部保存到新建一个歌单,这样就可以啦!
- python模拟浏览器
进阶
如果想使用了解更多网易云音乐js的加密解密过程,可以看看这个 Python 爬虫如何获取 JS 生成的 URL 和网页内容? - 路人甲的回答 - 知乎
总结
用python,就一定要简单,我认为复杂的东西,还是尽量少做,能取巧就取巧,所以本文没有使用selenium+phantomjs实践,如果想了解更多selenium+phantomjs
内容,可以参考文末引用链接。
注:本文只是技术交流,请不要商业用途~ 如有违反,本人一概不负责。
全部代码
又是非常简单的100行代码完事!!!
GitHub: WebCrawlerExample/163_NeteaseMusic.py at master · iHTCboy/WebCrawlerExample
1 |
|
参考
- 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](https://iHTCboy.com),如若转载,请注来源