import os
from urllib import request
from bs4 import BeautifulSoup
import re
import requests
import time
def getFileSize(filePath):
fsize = os.path.getsize(filePath)
fsize = fsize/float(1024 * 1024)
return round(fsize,2) # MB 两位小数
class Music(object):
def __init__(self, baseurl, path):
head = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
baseurl = baseurl.replace("#/", "")
self.baseurl = baseurl
self.headers = head
self.path = path
def main(self):
html = self.askurl()
bs4 = self.analysis(html)
id = self.matching(bs4)
self.save(id)
def askurl(self):
req = request.Request(url=self.baseurl, headers=self.headers)
response = request.urlopen(req)
html = response.read().decode("utf-8")
return html
def analysis(self, html):
soup = BeautifulSoup(html, "html.parser")
bs4 = soup.find_all("li")
bs4 = str(bs4)
return bs4
def matching(self, bs4):
rule = re.compile(r'href="/song\?id=(\d*?)"', re.S)
id = re.findall(rule, bs4)
return id
def save(self, id):
count = 0
for i in id:
url = "https://music.163.com/song?id=" + i
req = request.Request(url=url, headers=self.headers)
response = request.urlopen(req)
html = response.read().decode("utf-8")
soup = BeautifulSoup(html, "html.parser")
bs4 = soup.find_all("title")
bs4 = str(bs4)
rule = re.compile(r'<title>(.*?) - (.*?) - 单曲 - 网易云音乐</title>', re.S)
name_list = re.findall(rule, bs4)
name = name_list[0]
songname = str(name[0]).replace(r"/", "-")
songname = songname.replace(r"|", "-")
songname = songname.replace(r"?", "-")
songname = songname.replace(r"?", "-")
singername = name[1].replace(r"/", "-")
count += 1
print( str(count) + "...正在下载..." + songname + "...by " + singername + "...")
saveurl = "http://music.163.com/song/media/outer/url?id=" + i
content = requests.get(url=saveurl, headers=self.headers).content
filename = self.path + singername +'_' + str(count) + '_' + songname + ".mp3"
if not os.path.exists(filename):
f = open(filename, "wb")
f.write(content)
print( ' '+ filename + "......下载完毕")
f.close()
filesize = getFileSize(filename)
if filesize < 1.0: #对于需要会员需要下载的歌曲,下载后只有几十kb,无法播放
newFilename = filename+'_'+str(filesize)+'MB_可能无效.mp3'
if not os.path.exists(newFilename):
os.rename(filename,newFilename)
print( ' '+ "该文件太小,可能无效,已经备注......")
else:
print(' 该文件已经存在,不用下载...')
return
if __name__ == "__main__":
artisturl = r'https://music.163.com/#/artist?id=14400' # 歌手主页的网址
path1 = r"F:\python_code\歌曲\_" # 本地路径
artist_demo = Music(artisturl,path1)
artist_demo.main()
print("\n全部下载完毕...\n")
Python实践7:类、函数定义及批量下载资料
于 2022-10-13 17:34:18 首次发布