Python爬⾍-⽹易云⾳乐⾃动化爬取下载
⽂章⽬录
前⾔
上⼀篇简述了如何使⽤ Python 爬⾍⾃动爬取CSDN博客排⾏榜数据并⾃动整理成Excel⽂件,这篇⽂章来看看如何⾃动化爬取⽹易云⾳乐的歌曲。
爬取分析
来看看⽹易云⾳乐官⽹:
使⽤以下脚本打印歌单信息:
#encoding=utf8
import requests
from bs4 import BeautifulSoup
quest
headers ={
'Referer':'music.163/',
'Host':'music.163',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
}
play_url ='music.163/playlist?id=5041773022'
s = requests.session()
(play_url,headers = headers).content
s = BeautifulSoup(response,'lxml')
main = s.find('ul',{'class':'f-hide'})
for music in main.find_all('a'):
print('{} : {}'., music['href']))
爬取后得到歌曲名称和歌曲href:
music.163/song/media/outer/url?id=317151.mp3
所以我们爬取的地址进⾏拼接后得到完整的mp3地址过程为:
musicUrl='music.163/song/media/outer/url'+music['href'][5:]+'.mp3'
得到完整的MP3地址后可以通过python中的 urlretrieve ⽅法下载歌曲。
完整代码
#encoding=utf8
import requests
from bs4 import BeautifulSoup
quest
headers ={
'Referer':'music.163/',
'Host':'music.163',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
}
# 歌单的url地址
play_url ='music.163/playlist?id=5041773022'
# 获取页⾯内容
s = requests.session()
(play_url,headers = headers).content
#使⽤bs4匹配出对应的歌曲名称和地址
s = BeautifulSoup(response,'lxml')
main = s.find('ul',{'class':'f-hide'})
lists=[]
for music in main.find_all('a'):
list=[]
# print('{} : {}'., music['href']))
musicUrl='music.163/song/media/outer/url'+music['href'][5:]+'.mp3'
# 单⾸歌曲的名字和地址放在list列表中
list.append(musicName)
list.append(musicUrl)
# 全部歌曲信息放在lists列表中
lists.append(list)
print(lists)
# 下载列表中的全部歌曲,并以歌曲名命名下载后的⽂件,⽂件位置为当前⽂件夹
for i in lists:
url=i[1]
name=i[0]
try:
print('正在下载',name)
html播放音乐代码print('下载成功')
except:
print('下载失败')
爬取效果
在Pycharm执⾏以上脚本:
查看项⽬⼯程⽂件夹music下已成功爬取下载的⾳乐⽂件:
双击可正常播放:
拓展代码
附上⼀位⼤佬另外的⼀种实现爬取⽹易云歌单⾳乐的代码:
#导⼊库
import requests
from fake_useragent import UserAgent
from lxml import etree
import re
#⽹易云官⽹搜索薛之谦跳转⽹页后检查  network  doc 到该⽹页的
#Request URL: music.163/artist?id=5781
#1、确定url地址(薛之谦的歌单)
url ='music.163/artist?id=5781'
#⽹易云⾳乐的外链地址
base_url ='link.hhtjim/163/'
#2、请求
headers={
"User-Agent": UserAgent().chrome
}
result = (url, headers=headers).text
# print(result)
#3、删选数据拿到列表中的歌曲id  为⼀个字典⾥⾯有每⾸个的id
dom =etree.HTML(result)
# 通过审查元素发现每⾸歌在<a href="/song?id=417859631"> 中通过xpath分析得获取所有歌曲id的xpath语句为'//a[contains(@href,"/song?")]/@href' ids = dom.xpath('//ul[@class="f-hide"]//li/a/@href')
#将数据切⽚只需要id数值
#正则表达式
for i in range(len(ids)):
ids[i]= re.sub('\D','', ids[i])
#print(ids)
for i in range(len(ids)):
#每⼀⾸歌的地址
M_url = f'music.163/song?id={ids[i]}'
response = (M_url, headers=headers)
html = etree.)
music_info = html.xpath('//title/text()')
#print(music_info)  #['我好像在哪见过你(电影《精灵王座》主题曲) - 薛之谦 - 单曲 - ⽹易云⾳乐']
music_name = music_info[0].split('-')[0]
singer = music_info[0].split('-')[1]
#print(music_name, singer)  #我好像在哪见过你(电影《精灵王座》主题曲)薛之谦
#获取歌源
music_url = base_url +str(ids[i])+'.mp3'
#print(music_url)    #打印出每⾸歌的外链⽹址
music = (music_url).content
#4、保存
with open('./music/'+music_name+'.mp3','wb')as file:
file.write(music)
print("正在下载第"+str(i+1)+"⾸:  "+music_name+singer)
执⾏效果如下: