python Selenium实现付费音乐批量下载的实现方法


Posted in Python onJanuary 24, 2019

必备环境

废话

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

python Selenium实现付费音乐批量下载的实现方法

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

python Selenium实现付费音乐批量下载的实现方法

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

python Selenium实现付费音乐批量下载的实现方法

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

python 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 开始计数

python Selenium实现付费音乐批量下载的实现方法

程序演示

输入网易云的 UID!

python Selenium实现付费音乐批量下载的实现方法

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

python Selenium实现付费音乐批量下载的实现方法

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

python Selenium实现付费音乐批量下载的实现方法

下载完成后

python Selenium实现付费音乐批量下载的实现方法

python Selenium实现付费音乐批量下载的实现方法

python Selenium实现付费音乐批量下载的实现方法

P.S.如果要下载所有歌单,就不需要修改代码,直接输入网易云的 UID 运行即可!如果要下载某个具体的歌单只需要改动73行的这个循环for i in list(range(3,100)),所以说程序还是比较简单的,缺点可能就是没时间写 UI,而且也不太会 pyqt 之类的,只会点 MFC!所以将就用吧,功能还是很齐全的!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python sys.path详细介绍
Oct 17 Python
Python实现备份文件实例
Sep 16 Python
python 网络编程常用代码段
Aug 28 Python
Window环境下Scrapy开发环境搭建
Nov 18 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
用Python写一个自动木马程序
Sep 17 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
python中数据库like模糊查询方式
Mar 02 Python
Python实现敏感词过滤的4种方法
Sep 12 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
Python入门之使用pandas分析excel数据
May 12 Python
在python下读取并展示raw格式的图片实例
Jan 24 #Python
Python字典的核心底层原理讲解
Jan 24 #Python
使用PIL(Python-Imaging)反转图像的颜色方法
Jan 24 #Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 #Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 #Python
Python对象与引用的介绍
Jan 24 #Python
selenium+python自动化测试之多窗口切换
Jan 23 #Python
You might like
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
JScript的条件编译
2007/05/29 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
vue3.0 上手体验
2020/09/21 Javascript
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
python如何保证输入键入数字的方法
2019/08/23 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
python装饰器使用实例详解
2019/12/14 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
大学生文员专业个人求职信范文
2014/01/05 职场文书
青年教师培训方案
2014/02/06 职场文书
cf收人广告词大全
2014/03/14 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
政协调研汇报材料
2014/08/15 职场文书
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL