经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python爬虫入门教程17:酷某音乐网站的爬取
来源:cnblogs  作者:有趣的Python  时间:2021/2/18 15:43:24  对本文有异议

前言??

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

前文内容??

Python爬虫入门教程01:豆瓣Top电影爬取

Python爬虫入门教程02:小说爬取

Python爬虫入门教程03:二手房数据爬取

Python爬虫入门教程04:招聘信息爬取

Python爬虫入门教程05:B站视频弹幕的爬取

Python爬虫入门教程06:爬取数据后的词云图制作

Python爬虫入门教程07:腾讯视频弹幕爬取

Python爬虫入门教程08:爬取csdn文章保存成PDF

Python爬虫入门教程09:多线程爬取表情包图片

Python爬虫入门教程10:彼岸壁纸爬取

Python爬虫入门教程11:新版王者荣耀皮肤图片的爬取

Python爬虫入门教程12:英雄联盟皮肤图片的爬取

Python爬虫入门教程13:高质量电脑桌面壁纸爬取

Python爬虫入门教程14:有声书音频爬取

Python爬虫入门教程15:音乐网站数据的爬取

Python爬取入门教程16:音频素材网站的爬取

PS:如有需要 Python学习资料 以及 解答 的小伙伴可以加点击下方链接自行获取
python免费学习资料以及群交流解答点击即可加入

基本开发环境??

  • Python 3.6
  • Pycharm

相关模块的使用??

  1. import os
  2. import requests
  3. import parsel
  4. import re

安装Python并添加到环境变量,pip安装需要的相关模块即可。

一、??确定需求

爬取所有榜单上面的音乐
在这里插入图片描述

二、??网页数据分析

1、先找音乐的URL地址

点击播放,开发者工具里面就会有出现一个音乐播放地址。
在这里插入图片描述
在这里插入图片描述
2、找寻音乐url地址的来源。

  1. https://webfs.yun.kugou.com/202102051451/598a943870c34115e8c290507183a2c9/G188/M06/18/09/_A0DAF34pOiABslMADSv-ykkq2s784.mp3

这样的音乐URL根本就不知道有什么规律,所以可以在开发者工具里面搜索来源。
在这里插入图片描述
两个url地址都是可以用的 ,因为有一个备用的url地址。
在这里插入图片描述
这些就是数据包的请求参数。一个链接是看不出来变化参数的。所以需要在对比一个音乐地址。
在这里插入图片描述
通过对比可以看到 hash,album_id 主要是这两个参数的变化,最后的那个参数是时间戳。也可以把它当作恒定不变的也可以。

3、找寻 hash,album_id 请求参数的来源

其实这两个参数在列表页面的网页源代码里面就有的
在这里插入图片描述
在这里插入图片描述
里面的音乐名字是需要转码的,不过我们只需要 hash 和 album_id 这两个参数就可以了,也不需要在这获取音乐名字。不过还是说一下吧。

遇到 \u591c\u591c\u591c\u6f2b\u957f如何转码

  1. 字符串.encode('utf-8').decode('unicode_escape')

既然知道了 hash 和 album_id 这两个参数 在网页的源代码里面就有,那现在只需要获取每个类目的url地址就可以爬取所有的榜单的音乐了。

直接请求网页就可以获取所有类目的url地址了
在这里插入图片描述

三、??代码实现

获取所有类目url地址以及标题

  1. def get_type_url(html_url):
  2. response = get_response(html_url)
  3. selector = parsel.Selector(response.text)
  4. lis = selector.css('.pc_temp_side ul li')
  5. for li in lis:
  6. # 获取类目标题
  7. type_title = li.css('a::attr(title)').get()
  8. # 获取类目url
  9. type_url = li.css('a::attr(href)').get()
  10. print(f'正在爬取{type_title}', type_url)

获取请求参数 hash 以及 album_id

  1. def get_music_info(type_url):
  2. response = get_response(type_url)
  3. result = re.findall('global\.features = \[(.*?)\]', response.text)[0].encode('utf-8').decode('unicode_escape')
  4. hash_num = re.findall('"Hash":"(.*?)"', result)
  5. album_id = re.findall('"album_id":(\d+),"', result)
  6. music_info = zip(hash_num, album_id)
  7. for index in music_info:
  8. music_hash = index[0]
  9. music_id = index[1]

获取音乐url 以及 音乐名

  1. def get_music_url(music_hash, album_id):
  2. page_url = 'https://wwwapi.kugou.com/yy/index.php'
  3. params = {
  4. 'r': 'play/getdata',
  5. 'hash': music_hash,
  6. 'dfid': '3ve7aQ2XyGmN0yE3uv3WcaHs',
  7. 'mid': 'ac3836df72c523f46a85d8a5fd90fe59',
  8. 'platid': '4',
  9. 'album_id': album_id,
  10. '_': '1612508120385',
  11. }
  12. headers = {
  13. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
  14. }
  15. response = requests.get(url=page_url, params=params, headers=headers)
  16. json_data = response.json()
  17. music_name = json_data['data']['audio_name']
  18. music_url = json_data['data']['play_url']

保存数据到本地

  1. def save(music_name, music_url):
  2. path = 'music\\'
  3. if not os.path.exists(path):
  4. os.mkdir(path)
  5. music_content = get_response(music_url).content
  6. with open(path + music_name + '.mp3', mode='wb') as f:
  7. f.write(music_content)
  8. print('正在保存:', music_name)

在这里插入图片描述
在这里插入图片描述

原文链接:http://www.cnblogs.com/Qqun821460695/p/14378348.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号