社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

马哥Linux运维 • 4 年前 • 914 次点击  

前言

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

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

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

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

思路:

  • 音乐从哪里来?---网站的服务器里

  • 怎么从网址里得到音乐?---向网站发起网络请求

  • 删选音乐文件

  • 下载音乐文件

具体实现

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

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

安装方法

pip install requests

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

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

安装方法

pip install lxml

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

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

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

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

5.解析数据

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

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

id_list = html.xpath('//a[contains(@href,"song?")]')  # 所有歌曲id集合
  1. 下载歌曲
base_url = 'http://music.163.com/song/media/outer/url?id=' # 下载音乐网址前缀
# 下载音乐url = 网址前缀 + 音乐id
for data in id_list:
    href = data.xpath('./@href')[0]
    music_id = href.split('=')[1# 音乐id
    music_url = base_url + music_id # 下载音乐url
    music_name = data.xpath('./text()')[0# 下载音乐名称
    music = requests.get(url = music_url)
    # 将下载的音乐以文件形式保存下来
    with open('./music/%s.mp3' % music_name, 'wb'as file:
         file.write(music.content)
         print('下载成功' % music_name)

遇到的坑

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

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

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

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

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

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

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

music.163.com/song/media/…

总结

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

文章转自:Python


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/110007
 
914 次点击