利用Python爬虫爬取网站音乐遇到的坑

开发 后端
下面,我以爬取某易云音乐为例,介绍一下我时如何学习python爬虫的。

 前言

最近我想在网站上下载几首音乐放到我的u盘里听,但是上网上一找,各大音乐网站下载歌曲(尤其是好听的歌曲)都需要vip。

[[388310]]

对于像我这样的穷人来说,肯定是不会花几十块钱去下载几首音乐啦,而且作为程序员,充钱去下载音乐那也是不可能的,于是我花了一天时间,上网找了各种资料来学习一下怎样才能不花钱白嫖到网站上的音乐。

当然,方法还是有很多种的,最后我还是选择了一种最简单,最方便的一种方法: python爬虫。下面,我就跟大家分享一下我在用python爬虫时遇到的坑。

下面,我以爬取某易云音乐为例,介绍一下我时如何学习python爬虫的:

思路:

  •  音乐从哪里来?---网站的服务器里
  •  怎么从网址里得到音乐?---向网站发起网络请求
  •  删选音乐文件
  •  下载音乐文件

具体实现

1.引入发送网络请求的第三方库

  1. import requests # 发送网络请求的第三方库 

安装方法

  1. pip install requests 

2.引入数据解析第三方库 

  1. from lxml import etree # 数据解析第三方库 

安装方法 

  1. pip install lxml 

3.某易云音乐网站列表url为'https://music.163.com/#/discover/toplist?id=3778678' 

  1. url = 'https://music.163.com/#/discover/toplist?id=3778678' 

4.发送请求获取页面数据 

  1. response = requests.get(urlurl=url) # 请求页面数据 

5.解析数据 

  1. html=etree.HTML(response.text) # 解析页面数据 

6.获取所有歌曲标签集合( a标签 ) 

  1. id_list = html.xpath('//a[contains(@href,"song?")]')  # 所有歌曲id集合 

7.下载歌曲 

  1. base_url = 'http://music.163.com/song/media/outer/url?id=' # 下载音乐网址前缀  
  2. # 下载音乐url = 网址前缀 + 音乐id  
  3. for data in id_list:  
  4.     href = data.xpath('./@href')[0]  
  5.     music_id = href.split('=')[1] # 音乐id  
  6.     music_url = base_url + music_id # 下载音乐url  
  7.     music_name = data.xpath('./text()')[0] # 下载音乐名称  
  8.     music = requests.get(url = music_url 
  9.     # 将下载的音乐以文件形式保存下来  
  10.     with open('./music/%s.mp3' % music_name, 'wb') as file:  
  11.          file.write(music.content)  
  12.          print('<%s>下载成功' % music_name) 

遇到的坑

以上的方法我是从一个视频里学到的,那个视频是半年前出的,可能当时这种方法还好使,但是今天我在用这种方法下载音乐文件的时候突然就报错了。

首先,编辑器报错找不到 music_name 和 music_id ,我仔细一看,获取的id_list集合里(也就是标签集合里)的id根本不是id,是代码,估计在这里音乐网站也做了相应的反扒机制。

其次,我自己在网站里找到了一首音乐获取了它的id并把id赋值给music_id,结果当用外链下载音乐时报错460,显示网络拥挤,估计下载音乐的网址也不好使了。 

  1. base_url = 'http://music.163.com/song/media/outer/url?id='  
  2. music_id = '1804320463.mp3'  
  3. music_url = base_url + music_id  
  4. music = requests.get(url=music_url 
  5. print(music.text) 

{"msg":"网络太拥挤,请稍候再试!","code":-460,"message":"网络太拥挤,请稍候再试!"}

最后,我打印出music_url,点击进去,还是可以听歌和下载的,不知道这是为什么了 

  1. base_url = 'http://music.163.com/song/media/outer/url?id='  
  2. music_id = '1804320463.mp3'  
  3. music_url = base_url + music_id  
  4. music = requests.get(url=music_url 
  5. print(music_url) 

music.163.com/song/media/…

总结

现在的网站技术更新太快,很多网站都有了高级反爬机制,毕竟嘛,有些东西还是不能随随便便就给你的,我写这篇文章主要是跟大家分享一下我学习python爬虫时的一些经验,同时,我也想请教各位大神,像遇到了我这种问题了,我应该怎么办才能将这个网站的音乐文件爬到我的本地电脑里,还请各大神指点一二。 

 

责任编辑:庞桂玉 来源: 马哥Linux运维
相关推荐

2016-12-07 11:18:58

Python爬虫网站

2021-01-24 16:40:00

Python爬取网站编程语言

2016-12-08 16:47:06

2017-12-14 21:45:39

2017-05-24 15:07:19

Python爬虫爬取

2021-06-06 19:53:05

爬虫处理字体反爬

2016-11-07 15:23:37

Python

2017-09-19 15:17:09

PythonBeautifulso爬取网站

2018-01-11 10:20:04

Python爬虫豆瓣音乐

2020-08-06 08:43:49

Python爬虫数据

2014-03-11 11:21:23

2021-06-02 22:18:11

Python关键词微博

2018-03-22 11:38:18

2021-06-28 18:57:15

CSS网页爬虫

2021-04-16 08:02:05

Python下载音乐Python基础

2021-09-03 09:26:15

Python爬虫百度百科

2017-11-20 09:46:08

python爬虫Scrapy

2018-06-25 15:15:11

编程语言Python爬虫

2020-10-26 15:09:35

Python爬虫网页数据

2023-08-30 08:43:42

asyncioaiohttp
点赞
收藏

51CTO技术栈公众号