import requests # 用于获取网页内容的模块 |
from bs4 import BeautifulSoup # 用于解析网页源代码的模块 |
import easygui as t |
import tkinter as tk |
from tkinter import messagebox |
header = { # 伪造浏览器头部,不然获取不到网易云音乐的页面源代码。 |
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36' , |
} |
# 这是网易云音乐热歌榜的链接(其实是嵌套在网页里面含有歌曲数据的页面框架的真实链接) |
link = "https://music.163.com/discover/toplist?id=3778678" |
# 通过 requests 模块的 get 方法获取网页数据 |
r = requests.get(link, headers = header) |
# 获取网页内容 |
html = r.content |
# 通过 BeautifulSoup 模块解析网页,具体请参考官方文档。 |
soup = BeautifulSoup(html, "html.parser" ) |
# 通过分析网页源代码发现排行榜中的歌曲信息全部放在类名称为 f-hide 的 ul 中, |
# 于是根据特殊的类名称查找相应 ul,然后找到里面的全部 a 标签, |
# 限制数量为200,即排行榜的前 200 首歌。 |
songs = soup.find( "ul" , class_ = "f-hide" ).select( "a" , limit = 200 ) |
root = tk.Tk() |
root.withdraw() |
namelist = [] |
linklist = [] |
for s in songs: # 遍历输出数组 songs 中的内容 |
song_id = s[ 'href' ][ 9 :] # 只截取歌曲链接中的 ID 部分,因为网页中链接的形式为“/song?id=496870798”,从 = 号之后的就是歌曲的 ID 号。 |
name = s.text # 获取 a 标签的文本内容,即歌曲的名称。 |
namelist.append(name) |
song_down_link = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3" |
linklist.append(song_down_link) |
|
song_name = t.choicebox( '选择下载的歌曲' , 'Music Download' ,choices = namelist) |
for i in range ( len (namelist)): |
if namelist[i] = = song_name: |
song_down_link = linklist[i] |
break |
|
response = requests.get(song_down_link, headers = header).content |
|
with open (song_name + ".mp3" , 'ab+' ) as f: |
f.write(response) |
|
messagebox.showinfo( "提示" , "下载完成" ) |