我们随便打开一个音乐,发现网址上正好有"id=???"这样的格式,我们只要用正则表达式来提取ID,再在把ID填到上面的网址中就可以了,代码:

import re

import urllib.request

import tkinter.messagebox as box

# 设置下载函数

def urldownload():

url = lefturl.get() # 这里是我UI的输入框,不想用UI的可以直接input

try:

# 解析歌曲id

urlid = re.findall('id=(.*)', url)[0]

# 获取下载网页

durl = 'http://music.163.com/song/med...' % urlid

# 下载歌曲

urllib.request.urlretrieve(durl, '绝对路径\名称.mp3')

# 提示下载完毕

box.showinfo(title='提示', message='音乐已下载完毕!\n已保存至download文件夹!')

except:

box.showerror(title='错误', message='下载链接错误!')

搜索并下载

想要得到下载链接和名称,我们首先得得到网页的源代码:

# 搜索函数

def searchdownload(name):

# 从网站的Requests Header中获取

url = 'https://music.hwkxk.cn/?kw=%s...' % name

html = requests.get(url=url).text

print(html)

可是运行完后,输出的是乱码,这是怎么回事?

这时候,我们可以先把网页内容转成单字节编码,再转成UTF-8,修改如下:

import requests

# 搜索函数

def searchdownload(name):

# 从网站的Requests Header中获取

url = 'https://music.hwkxk.cn/?kw=%s...' % name

html = requests.get(url=url).text

html = html.encode('ISO-8859-1')

html = html.decode('UTF-8')

print(html)

这时候,就没有乱码了。

接下来,就来爬取歌曲名称和下载链接:
外汇代理http://www.fx61.com/ib.html

我们看到,这个歌曲的a标签的class名是“btn btn-xs btn-success”,但是这只是一个歌曲的class,我们要找到"所有歌曲的class"。

我们看到右边的"styles",发现这个class才是"所有a标签的class"。

现在来码代码:

import bs4

import requests

# 搜索函数

def searchdownload(name):

# 从网站的Requests Header中获取

url = 'https://music.hwkxk.cn/?kw=%s...' % name

html = requests.get(url=url).text

html = html.encode('ISO-8859-1')

html = html.decode('UTF-8')

# 解析网页

soup = bs4.BeautifulSoup(html, "lxml")

# 查找目标

link_0 = soup.select('.btn-success')

print(link_0)

运行函数后,Python返回了一个列表:

[无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损, 无损]

1

这正是我们想要的,我们现在打印列表的第一个:

print(link_0[0])

1

输出:

无损

1

再仔细观察,发现"download"是歌曲的名称,"href"是歌曲下载的链接。只要在"link_0[0]“的后面加上”.get(‘href’)[0]"就可以了,名称也是同理,要是没有就返回None。

# 查找目标

try:

link_0 = soup.select('.btn-success')[0].get('href')[0]

name_0 = soup.select('.btn-success')[0].get('download')

except:

link_0 = None

name_0 = None

try:

link_1 = soup.select('.btn-success')[1].get('href')[0]

name_1 = soup.select('.btn-success')[1].get('download')

except:

link_1 = None

name_1 = None

try:

link_2 = soup.select('.btn-success')[2].get('href')[0]

name_2 = soup.select('.btn-success')[2].get('download')

except:

link_2 = None

name_2 = None

try:

link_3 = soup.select('.btn-success')[3].get('href')[0]

name_3 = soup.select('.btn-success')[3].get('download')

except:

link_3 = None

name_3 = None

try:

link_4 = soup.select('.btn-success')[4].get('href')[0]

name_4 = soup.select('.btn-success')[4].get('download')

except:

link_4 = None

name_4 = None

最后再存到字典里,返回参数:

link_data = {

"0_0":link_0,

"0_1":name_0,

"1_0":link_1,

"1_1":name_1,

"2_0":link_2,

"2_1":name_2,

"3_0":link_3,

"3_1":name_3,

"4_0":link_4,

"4_1":name_4

}

return link_data

有了下载链接和名称,下载大家应该都会了吧,只要用urllib.request.urlretrieve()就可以了。


zhuanzhudeyipi
65 声望2 粉丝