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装饰器decorator用法实例
Nov 10 Python
用Python的pandas框架操作Excel文件中的数据教程
Mar 31 Python
总结python爬虫抓站的实用技巧
Aug 09 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
Dec 12 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
Python使用Web框架Flask开发项目
Jun 01 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
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
PHP 变量的定义方法
2010/01/26 PHP
PHP无敌近乎加密方式!
2010/07/17 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
javascript生成大小写字母
2015/07/03 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
2016/07/01 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
python中Flask框架简单入门实例
2015/03/21 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
python随机模块random使用方法详解
2020/02/14 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
遇到的Mysql的面试题
2014/06/29 面试题
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
奖学金自我鉴定范文
2013/10/03 职场文书
小学语文国培感言
2014/03/04 职场文书
计算机网络专业求职信
2014/06/05 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
化验室岗位职责
2015/02/14 职场文书
卡特教练观后感
2015/06/08 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书