这个星期我的个人项目——(能导入各个平台歌单的)音乐播放器已经开始啦。所以先理清思路:
- 使用selenium进行模拟登录,即登录QQ号时同时能获得网易云和QQ音乐时可以获取两个账号的歌单
- 使用Python创建GUI界面(初期使用简洁的界面,后期再进行美化和功能增加)
- 将Python的GUI界面与第一步得到的歌单融合
- 解决音乐在播放器上播放的问题(目前想到的是两种方法:1.爬取源mp3文件,此方式较为困难并且可能涉及到版权问题暂时不适合。2. 得到播放的链接,进行在线播放)
期间可能会遇到各种问题或者说我的思路有问题的地方会进行改进,当然同时也不吝赐教。
一、selenium模拟登陆
首先是安装并且配置selenium的环境,网上都有教程这里就不赘述了。
接着进行网页的分析,打开网易云界面,我们首先要实现模拟登陆的功能。
查看此处的代码结构:
点击后弹出新的框:
此处因为需要点击QQ登录因此利用css选择器使用下列代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from time import sleep
class getMusic():
#chrome_options=Options()
#设置为无界面模式
#chrome_options.add_argument('--headless')
userid='***' #这里填上QQ号
password='***'#这里填上对应的密码
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get("https://music.163.com/")
#login = browser.find_element_by_link_text('登录')
#login.click()
browser.implicitly_wait(10)
browser.find_element_by_css_selector(".m-tophead.f-pr.j-tflag > a").click() #点击登录
#css 选择器中如果一个 tag 的 class 包含空格,要用.号代替空格
browser.find_element_by_css_selector(".lyct.lyct-1 > div > div.u-alt > ul > li:nth-child(2) > a").click() #点击QQ登录
运行代码,进入下列界面:
我们要先对选项卡进行切换
music_handle = browser.current_window_handle
print(music_handle) # 输出当前窗口句柄
handles = browser.window_handles # 获取当前全部窗口句柄集合
print(handles)
#切换到QQ登陆页面
for handle in handles:
if handle != browser.current_window_handle:
print('switch to qq login window')
browser.switch_to.window(handle)
browser.implicitly_wait(10)
##QQlogin = browser.find_element_by_link_text('QQ登录')
#QQlogin.click()
#music_handle = browser.current_window_handle
browser.implicitly_wait(10)
sleep(2)
接着我们发现QQ登录窗口含有iframe:
因此先切换此窗口:
browser.switch_to.frame('ptlogin_iframe')
再点击帐号密码登录,出现文本框将账号密码输入后进行登录。
browser.find_element_by_link_text('帐号密码登录').click()
userid_ele=browser.find_element_by_name('u')
#password_ele=browser.find_element_by_id('pwdArea')
password_ele=browser.find_element_by_name('p')
userid_ele.send_keys(userid)
password_ele.send_keys(password)
browser.find_element_by_id('login_button').click()
切换回原窗口:
browser.switch_to.window(music_handle)
完成登录:
二、初步获得歌单信息
首先进入我的音乐:
代码:
browser.find_element_by_xpath('//*[@id="g-topbar"]/div[1]/div/ul/li[2]/span/a/em').click()
browser.implicitly_wait(10)
sleep(2)
接下来提取歌单的名称:
经过检查代码发现,这里也是个iframe:
browser.switch_to.frame('contentFrame')
提取名称:
list=[]
#list=browser.find_element_by_xpath('//*[@id="g_mymusic"]/div/div[1]/div/div[1]/ul/li[3]')
#list.click()
i=1
while True:
try:
list=browser.find_element_by_xpath('//*[@id="g_mymusic"]/div/div[1]/div/div[1]/ul/li[{}]'.format(i))
print(list.text)
i=i+1
except:
print('over')
break;
输出结果:
(未完待续,如以上有疑问,不吝赐教)