本文是分享小程序,不是教程,若要真的自己实现,还需要去分析网页,而由于分析网页的过程比较复杂,这里不再赘述
该小程序涉及到requests库,beatifulsoup库,json库,以及文件储存,详细请参考代码
import requests #导入requests库,用于发送get请求
from bs4 import BeautifulSoup #从bs4中导入BeautifulSoup库
import json #导入json
import re
url_main = 'http://music.taihe.com/top/dayhot' #千千音乐热歌榜地址
req = requests.get(url_main)
soup = BeautifulSoup( req.text, 'html.parser')#进行网站解析
span = soup.find_all( 'span', 'music-icon-hook')#获取网站span并且class为music-icon-hook的标签
song_id = [] #一个列表,用于存取音乐id
for s in span:
data = s.get('data-musicicon')#获取每个标签的data-musicicon属性
json_song = json.loads(data) #转换成字典
song_id .append(json_song['id'])#获取音乐id
song_id = set(song_id)#将获取到的id去重复,即转化成集合
#遍历id
for song_id_one in song_id:
url_json = 'http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&callback=jQuery172039336038036257137_1558266486065&songid={}&from=web&_=1558266489478'
#分析网页得到的音乐数据的json地址的公共部分,不同部分用{}代替
js = requests.get (url_json.replace( '{}', song_id_one ))
#分别取请求每个id的json
jsonData = json.loads( js.text[42:-2] )#获取有效的json部分,并转化成字典形式
song_fileName = '{}.mp3'.replace('{}', jsonData['songinfo']['title'])#获取歌名
print('正在下载 {}'.replace( '{}', song_fileName))#提示信息
song_url = jsonData['bitrate']['file_link']#获取每首音乐的url
req_music = requests.get ( song_url )#请求url
#将返回的音乐转换成二进制储存
with open( song_fileName,'wb' ) as f:
f.write ( req_music.content )