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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
python3实现短网址和数字相互转换的方法
Apr 28 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
python实现朴素贝叶斯分类器
Mar 28 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
详解Python中的四种队列
May 21 Python
Python向excel中写入数据的方法
May 05 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
python导入pandas具体步骤方法
Jun 23 Python
python numpy数组复制使用实例解析
Jan 10 Python
Python中X[:,0]和X[:,1]的用法
May 10 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实现随机显示图片方法汇总
2015/05/21 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
JS实现的简单分页功能示例
2018/08/23 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
JS数组方法join()用法实例分析
2020/01/18 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
linux 下实现python多版本安装实践
2014/11/18 Python
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
python实现泊松图像融合
2018/07/26 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
优秀教师演讲稿
2014/05/06 职场文书
大学生社会实践方案
2014/05/11 职场文书
党员服务承诺书
2014/05/28 职场文书
财务会计专业自荐书
2014/06/30 职场文书
心灵捕手观后感
2015/06/02 职场文书
Python中的pprint模块
2021/11/27 Python
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB