Python小工具:批量下载网易云音乐歌单/专辑中的歌词

Posted by 橙叶 on Sun, Nov 11, 2018

最近想把网易云音乐中的英语听力下载到播放器中,方便随时听。但是只下载音频的话就少了些什么,最好连听力的歌词也下载进去。于是乎写了个小工具,可以批量下载歌单或者专辑中的音乐的歌词,可以省很多时间。

netease-lyric.py

  1. #coding=utf-8  
  2. import requests  
  3. from bs4 import BeautifulSoup  
  4. import json  
  5. import re,os  
  6. from spider import *  
  7. def get_html(url):  
  8.     headers = {  
  9.         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',  
  10.         'Referer':'http://music.163.com',  
  11.         'Host':'music.163.com'  
  12.     }  
  13.     try:  
  14.         response = requests.get(url,headers=headers)  
  15.         html = response.text  
  16.         return html  
  17.     except:  
  18.         print('request error')  
  19.         pass  
  20.   
  21. def get_lyric(song_id):  
  22.     url = 'http://music.163.com/api/song/lyric?' + 'id=' + str(song_id) + '&lv=1&kv=1&tv=-1'  
  23.     html = get_html(url)  
  24.     json_obj = json.loads(html)  
  25.     print(json_obj)  
  26.     lyric = json_obj['lrc']['lyric']  
  27.     return lyric  
  28.   
  29. def get_details(song_id):  
  30.     url = 'http://music.163.com/api/song/detail/?' + 'id=' + str(song_id) + '&ids=%5B' + str(song_id) + '%5D'  
  31.     html = get_html(url)  
  32.     print(html)  
  33.     json_obj = json.loads(html)  
  34.     song_name = json_obj['songs'][0]['name']  
  35.     song_artist = json_obj['songs'][0]['artists'][0]['name']  
  36.     return song_name,song_artist  
  37.   
  38. def output_file(song_id):  
  39.     song_name,song_artist = get_details(song_id)  
  40.     lyric = get_lyric(song_id)  
  41.     file_name = song_name + ' - ' + song_artist + '.lrc'  
  42.     #替换歌曲名中的斜杠  
  43.     file_name = file_name.replace('/','/')  
  44.     file = open(file_name,"w+",encoding="utf-8")  
  45.     file.writelines(lyric)  
  46.     file.close()  
  47.   
  48. url = "https://music.163.com/album?id=2817001"  
  49. id_list = get_songlist(url)  
  50. print(id_list)  
  51.   
  52. for iterm in id_list:  
  53.     output_file(iterm)  

抓取歌单中的歌曲信息,获得id spider.py

  1. #coding=utf-8  
  2. import requests  
  3. from bs4 import BeautifulSoup  
  4. import json  
  5. import re,os  
  6. def get_html(url):  
  7.     headers = {  
  8.         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',  
  9.         'Referer':'http://music.163.com',  
  10.         'Host':'music.163.com'  
  11.     }  
  12.     try:  
  13.         response = requests.get(url,headers=headers)  
  14.         html = response.text  
  15.         return html  
  16.     except:  
  17.         print('request error')  
  18.         pass  
  19.   
  20. def get_songlist(list_url):  
  21.     html = get_html(list_url)  
  22.     #print(html)  
  23.     soup = BeautifulSoup(html,'lxml')  
  24.     #print(soup.ul)  
  25.     pattern = re.compile(r'<a href.*?</a>')  
  26.     result = pattern.findall(str(soup.ul))  
  27.     list = []  
  28.     for iterm in result:  
  29.         print(iterm)  
  30.         song_id_group = re.finditer(r"\d+",iterm)  
  31.         song_name_group = re.finditer(r">.*?</a>",iterm)  
  32.         for song_id,song_name in zip(song_id_group,song_name_group):  
  33.             #print(song_id.group())  
  34.             list.append(song_id.group())  
  35.         #    print(song_name.group()[1:-4])  
  36.     return list  

效果:



comments powered by Disqus