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处理圆角图片、圆形图片的例子
Apr 25 Python
浅谈Python 的枚举 Enum
Jun 12 Python
Numpy之random函数使用学习
Jan 29 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
python编写俄罗斯方块
Mar 13 Python
python ssh 执行shell命令的示例
Sep 29 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 Python
Python快速实现一键抠图功能的全过程
Jun 29 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
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
php日期操作技巧小结
2016/06/25 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
Python中对列表排序实例
2015/01/04 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
我的求职计划书
2014/01/10 职场文书
小学教师培训方案
2014/06/09 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
欢迎词范文
2015/01/27 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
高中班长竞选稿
2015/11/20 职场文书
高考升学宴主持词
2019/06/21 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS