吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3288|回复: 18
收起左侧

[Python 原创] 【Python】某云歌单下载

  [复制链接]
lijt16 发表于 2020-1-12 16:03
本帖最后由 lijt16 于 2020-1-12 16:05 编辑

原先开了几个月的黑胶,新年过期了,发现很多之前下的本地歌曲也无法播放,有点无语,故想把自己的歌单上的歌下下来上传到音乐云盘上。

在论坛了找了几个,包括网易云音乐歌曲批量下载,免VIP【支持歌单,排名榜】【Python】某易云音乐歌曲批量下载,免VIP
,可惜失效了,就自己参考了些代码写了个:

import warnings
import os,requests
from selenium import webdriver
warnings.filterwarnings("ignore")

class DownMusic():
        """
        下载网易云音乐歌单
        用selenium+PhantomJS配合
        在https://phantomjs.org/download.html下载phantomjs
        在webdriver.PhantomJS()括号里填入PhantomJS.exe绝对路径
        或将PhantomJS.exe放到python安装目录下
        若python3下的selenium默认版本安装,会报警告,忽略不管可继续下载
        若失败,一种方案是卸载selenium,重新安装指定版本2.48.0;另一种方案自行搜索解决
        """

        def __init__(self, playid):
                self.url = 'https://music.163.com/#/playlist?id=' + playid

        def is_filename(self, uchar):
                """
                排除文件名不可用的字符\/:*?"<>|
                注意都是在英文输入法下的,若是中文输入法下的例如?“等是可以用来生成文件名的
                以及不间断空白符 :\xa0 
                :param uchar:
                :return:
                """
                if uchar == u'\u005c' or  uchar == u'\u002f' or uchar == u'\u003a' or uchar == u'\u002a' or uchar == u'\u003f' \
            or uchar == u'\u007c' or  uchar == u'\u003c' or uchar == u'\u003e' or uchar == u'\u0022' or uchar == u'\xa0':
                        return False
                else:
                        return True

        def format_str(self, content):
                """
                将字符串content中的字符逐个判断
                :param content: <str>输入文本
                :return: <str>输出可作为文件和文件夹名的字符串
                """
                content_str = ''
                for i in content:
                        if self.is_filename(i):
                                content_str = content_str+i
                return content_str

        def download(self):
                headers = {'User-Agent':'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',}
                driver = webdriver.PhantomJS() #括号内填入PhantomJS.exe绝对路径,或将PhantomJS.exe单独放到python安装目录下
                driver.get(self.url)
                driver.implicitly_wait(10) #隐式等待10s
                driver.switch_to.frame('g_iframe') #跳转到id为g_iframe的iframe框架下
                list_name = driver.find_element_by_class_name('f-ff2').text #歌单名称
                print('-'*10, '歌单: ', list_name, '-'*10)

                list_path = os.getcwd()+ '/' + self.format_str(list_name) #以歌单名创建新文件夹
                if os.path.exists(list_path):
                        pass
                else:
                        os.mkdir(list_path)

                ids = driver.find_elements_by_xpath('//a[starts-with(@href,"/song?id=")]')
                names = driver.find_elements_by_xpath('//a[starts-with(@href,"/song?id=")]/b')

                for i in range(0, len(ids)):
                        id = ids[i].get_attribute('href').replace('https://music.163.com/song?id=','')
                        name = self.format_str(names[i].get_attribute('title').strip().replace('/',''))
                        print('第%d首下载中... Id:'%(i+1), id, 'Name:', name)
                        link = 'http://music.163.com/song/media/outer/url?id=' + id + '.mp3' #网易云下载外链地址
                        song = list_path + '/' + name + '.mp3'

                        # 若歌曲存在且能正常播放(此处判断为大于100kb)则不再下载
                        if os.path.exists(song) and (os.path.getsize(song)) >= 102400:
                                pass
                        else:
                                try:
                                        with open(song, 'wb') as f:
                                                f.write(requests.get(link, headers=headers).content)
                                        if (os.path.getsize(song)) < 102400: #网易云上显示但是无法在线听的音乐
                                                os.remove(song)
                                except:
                                        print('第%d首下载失败!'%(i+1))

                driver.switch_to.default_content()#返回主文档

if __name__ == '__main__':
        playid = input('输入网易云歌单ID: ')
        DownMusic(playid).download()

snipaste_20200112_153458.png

我没注意是否黑胶或者付费什么的问题,总之下了一个日语歌单和一个粤语歌单,里面应该是有黑胶下载的歌曲,不过估计付费的应该不行,因为上面代码终究是根据网易云外链地址下载的。欢迎各位有其他方法的一起交流。

免费评分

参与人数 2吾爱币 +2 热心值 +1 收起 理由
h0756abc + 1 + 1 谢谢@Thanks!
husan + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kakarrot 发表于 2020-1-19 17:43
C:\Users\KAKARROT\Anaconda3\python.exe D:/OneDrive/Python/Music_163.py
输入网易云歌单ID: 902685899
Traceback (most recent call last):
  File "C:\Users\KAKARROT\Anaconda3\lib\site-packages\selenium\webdriver\common\service.py", line 76, in start
    stdin=PIPE)
  File "C:\Users\KAKARROT\Anaconda3\lib\subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "C:\Users\KAKARROT\Anaconda3\lib\subprocess.py", line 1178, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] 系统找不到指定的文件。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/OneDrive/Python/Music_163.py", line 87, in <module>
    DownMusic(playid).download()
  File "D:/OneDrive/Python/Music_163.py", line 48, in download
    driver = webdriver.PhantomJS() #括号内填入PhantomJS.exe绝对路径,或将PhantomJS.exe单独放到python安装目录下
  File "C:\Users\KAKARROT\Anaconda3\lib\site-packages\selenium\webdriver\phantomjs\webdriver.py", line 56, in __init__
    self.service.start()
  File "C:\Users\KAKARROT\Anaconda3\lib\site-packages\selenium\webdriver\common\service.py", line 83, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'phantomjs' executable needs to be in PATH. 

另外exe文件运行输入id后闪退

 楼主| lijt16 发表于 2020-1-19 18:25
kakarrot 发表于 2020-1-19 17:43
[md]```
C:%users\KAKARROT\Anaconda3\python.exe D:/OneDrive/Python/Music_163.py
输入网易云歌单ID: 9 ...

py文件运行应该是cmd输入:python Music_163.py,不是python.exe。然后运行需要下载PhantomJS.exe,放在python安装目录,或者在代码第48行说明处直接填入exe文件的绝对路径。最后这个闪退,我也不太清楚为啥,我明明没问题,你们都闪退。
易认真就输啦 发表于 2020-1-12 16:29
阿丝玲 发表于 2020-1-12 17:55
学渣表示,有成品没
 楼主| lijt16 发表于 2020-1-13 16:43
本帖最后由 lijt16 于 2020-1-19 20:44 编辑





有朋友反映闪退,我估计是不是phantomjs.exe的缘故,因为打包是无法将其打包进去的,然后我修改代码将其改为代码所在路径,重新上传,将两个文件放在同一文件夹下运行163.exe即可。
重新上传地址:https://www.lanzouj.com/i8rnfwf

 楼主| lijt16 发表于 2020-1-13 17:13
阿丝玲 发表于 2020-1-12 17:55
学渣表示,有成品没

https://www.lanzouj.com/i8n4mxa

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
阿丝玲 + 1 + 1 谢谢可爱的楼主

查看全部评分

h0756abc 发表于 2020-1-18 12:35
lijt16 发表于 2020-1-13 17:13
https://www.lanzouj.com/i8n4mxa

输入ID之后闪退?  啥情况
 楼主| lijt16 发表于 2020-1-18 12:58
h0756abc 发表于 2020-1-18 12:35
输入ID之后闪退?  啥情况

win10 64 ,目前使用正常
h0756abc 发表于 2020-1-18 17:57
lijt16 发表于 2020-1-18 12:58
win10 64 ,目前使用正常

我也是啊   我也是WIN10  64
 楼主| lijt16 发表于 2020-1-18 19:27
h0756abc 发表于 2020-1-18 17:57
我也是啊   我也是WIN10  64

那我也不清楚
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-15 17:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表