Selenium实现付费音乐批量下载

栏目: 编程工具 · 发布时间: 6年前

内容简介:废话每年回家都要帮我爸下些音乐,这对我来说都是轻车熟路!可当我打开网易云点击下载按钮的时候,可惜已物是人非啦!

必备环境

废话

每年回家都要帮我爸下些音乐,这对我来说都是轻车熟路!可当我打开网易云点击下载按钮的时候,可惜已物是人非啦!

Selenium实现付费音乐批量下载

开个 VIP 其实也不贵,临时用用也就¥15!但 IT 男的尊严必须要有,于是开始徜徉于搜索引擎中

Selenium实现付费音乐批量下载

最后在知乎中,搜索到一个网址 VIP付费音乐解析

Selenium实现付费音乐批量下载

P.S. 再次感谢提供该服务的作者!如果你下载的音乐数量不多,直接这里搜索下载,下载后修改文件名即可!并且在这个网址中点击 播放列表 - 点击同步 ,可以同步网易云的歌单!之后批量下载即是下载这些网易云的歌单!但是下载某个歌单中的几百首歌,手动下载就不现实了!在 点击同步 中需要输入你的网易云 UID,这 UID 的获取方式如下:第一步打开网易云随便选中一首歌,右键 复制链接
Selenium实现付费音乐批量下载

然后随便找个地方粘贴这个链接,例如 https://music.163.com/song?id=25727803&userid=275613591 最后这串数字就是 UID!

程序运行环境

第一步安装一个 python3 ,这个简单吧!贴上我的版本 python3.65 ,安装时注意勾选 Add in path

第二步下载 FFmpeg ,这是用来解析视频和音频的,作为 you-get 的辅助工具, 下载点这里 ,下载后解压添加环境变量即可

第三步安装 you-get ,这是个下载视频音频的神器,有兴趣可以深入研究!之后我打算写个下载任意视频的工具,嘿嘿这是后话了!安装方式很简单 pip install you-get

环境配置就这样,还是非常轻松的,下面会解释下代码

源码

完整代码

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time, os
# import threding

def get_music_name_link():
    main_handle = browser.current_window_handle
    fp = open('E:\\Project_PY\\file\\musiclink.txt','wb')
    fp2 = open('E:\\Project_PY\\file\\musicname.txt','wb')
    try:
        for i in list(range(2,400)):
            browser.switch_to_window(main_handle)
            txt = browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]' % i).text + '\n'
            fp2.write(bytes(txt,encoding='utf-8'))
            location = browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]' % i)
            ActionChains(browser).move_to_element(location).perform()
            browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]/span[5]/div/span[2]' % i).click()
            time.sleep(2)
            all_handles = browser.window_handles
            browser.switch_to_window(all_handles[-1]) # lastest
            url_link = browser.current_url + '\n'
            fp.write(bytes(url_link,encoding='utf-8'))
            browser.close()
    except Exception as e:
        print('get_music_name_link meet some problem! {}'.format(e))
        fp.close()
        fp2.close()

def download_music(list_name):
    with open('E:\\Project_PY\\file\\musicname.txt','r',encoding='utf-8') as fp1:
            music_name = fp1.readlines()
    len1 = len(music_name)
    fp2 = open('E:\\Project_PY\\file\\musicname_format.txt','w',encoding='utf-8')
    for i in range(3,len1,4):
        music_name_format = music_name[i].strip() + '\n'
        fp2.write(music_name_format)
    fp2.close()

    with open('E:\\Project_PY\\file\\musiclink.txt','r',encoding='utf-8') as fp1: 
        with open('E:\\Project_PY\\file\\musicname_format.txt','r',encoding='utf-8') as fp2: 
            for music_link,music_name in zip(fp1.readlines(),fp2.readlines()):
                you_get_link = 'you-get "{}" -o "E:\\Project_PY\\file\\music\\{}" -O "{}"'.format(music_link.strip(),list_name,music_name.strip())
                you_get_link = you_get_link.strip()
                # print(you_get_link)
                os.system(you_get_link)

url = 'http://music.zhuolin.wang/'
uid = input('please input your uid:')
options = webdriver.FirefoxOptions()
options.add_argument('--headless')
browser = webdriver.Firefox(firefox_options=options)
browser.implicitly_wait(8)
browser.get(url)
# browser.maximize_window()
browser.set_window_size(1000,100000)
browser.find_element_by_xpath('/html/body/div[3]/div/div[1]/div/span[3]').click()
# scroll = browser.find_element_by_xpath('//*[@id="mCSB_1_dragger_vertical"]')
# ActionChains(browser).drag_and_drop_by_offset(scroll,0,100).perform()
# time.sleep(2)
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1]) # lastest
time.sleep(1)
browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div[1]/div/span/div[2]/span').click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1]) # lastest
time.sleep(1)
browser.find_element_by_xpath('/html/body/div[6]/div[2]/input').send_keys(uid)
browser.find_element_by_xpath('/html/body/div[6]/div[3]/a[1]').click()
# t1 = threading.Thread(target=get_music_name)
# t2 = threading.Thread(target=get_music_link)
# t3 = threading.Thread(target=download_music)

for i in list(range(3,100)):
    try:
        print('downloading song_list{}! please waiting....'.format(i))
        browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div[1]/div/div[%d]/img' % i).click()
        dir_name = browser.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div[1]/div/div[%d]/p' % i).text
        time.sleep(1)
        get_music_name_link()
        download_music(dir_name)
        browser.find_element_by_xpath('/html/body/div[3]/div/div[1]/div/span[3]').click()
        time.sleep(1)
        all_handles = browser.window_handles
        browser.switch_to_window(all_handles[-1]) # lastest
        time.sleep(5)
    except Exception as e:
        print('get_song_list meet some problem! {}'.format(e))
browser.quit()

核心代码解释

总共有三个函数:

函数一 get_music_name_link ,主要是获取音乐名称以及音乐的下载链接

函数二 download_music ,获取歌单名称,然后拼接下载链接和音乐名,调用 you-get 开始下载到对应目录

函数三 main ,主要是利用 UID 获取歌单,以及批量下载歌单中的曲目

需要注意的几个点:

1.使用了 sleep(1) 休眠一秒,如果网络较慢需要将所有的 sleep 休眠时间加长

2.所有的路径需要自己根据本机修改

3.如果要修改代码一定要注意 switch_to_window 来切换窗口

4.73行的 for i in list(range(3,100)) 是用来选择下载的歌单,歌单从 1 开始计数

Selenium实现付费音乐批量下载

程序演示

输入网易云的 UID!

Selenium实现付费音乐批量下载

然后静静的等待即可...此过程中会有部分音乐的播放声音,不喜欢可以开静音下

Selenium实现付费音乐批量下载

当所有的链接解析完成后就会调用 you-get 下载,此过程会自动创建与歌单名相同的文件夹

Selenium实现付费音乐批量下载

下载完成后

Selenium实现付费音乐批量下载

Selenium实现付费音乐批量下载

Selenium实现付费音乐批量下载

END


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spring in Action

Spring in Action

Craig Walls / Manning Publications / 2011-6-29 / USD 49.99

Spring in Action, Third Edition has been completely revised to reflect the latest features, tools, practices Spring offers to java developers. It begins by introducing the core concepts of Spring and......一起来看看 《Spring in Action》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码