這個星期我的個人項目——(能導(dǎo)入各個平臺歌單的)音樂播放器已經(jīng)開始啦。所以先理清思路:
- 使用selenium進行模擬登錄,即登錄QQ號時同時能獲得網(wǎng)易云和QQ音樂時可以獲取兩個賬號的歌單
- 使用Python創(chuàng)建GUI界面(初期使用簡潔的界面,后期再進行美化和功能增加)
- 將Python的GUI界面與第一步得到的歌單融合
- 解決音樂在播放器上播放的問題(目前想到的是兩種方法:1.爬取源mp3文件,此方式較為困難并且可能涉及到版權(quán)問題暫時不適合。2. 得到播放的鏈接,進行在線播放)
期間可能會遇到各種問題或者說我的思路有問題的地方會進行改進,當(dāng)然同時也不吝賜教。
一、selenium模擬登陸
首先是安裝并且配置selenium的環(huán)境,網(wǎng)上都有教程這里就不贅述了。
接著進行網(wǎng)頁的分析,打開網(wǎng)易云界面,我們首先要實現(xiàn)模擬登陸的功能。

image.png
查看此處的代碼結(jié)構(gòu):

image.png
點擊后彈出新的框:

image.png
此處因為需要點擊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()
#設(shè)置為無界面模式
#chrome_options.add_argument('--headless')
userid='***' #這里填上QQ號
password='***'#這里填上對應(yīng)的密碼
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登錄
運行代碼,進入下列界面:

image.png
我們要先對選項卡進行切換
music_handle = browser.current_window_handle
print(music_handle) # 輸出當(dāng)前窗口句柄
handles = browser.window_handles # 獲取當(dāng)前全部窗口句柄集合
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)
接著我們發(fā)現(xiàn)QQ登錄窗口含有iframe:

image.png
因此先切換此窗口:
browser.switch_to.frame('ptlogin_iframe')
再點擊帳號密碼登錄,出現(xiàn)文本框?qū)①~號密碼輸入后進行登錄。

image.png

image.png
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)
完成登錄:

image.png
二、初步獲得歌單信息
首先進入我的音樂:

image.png
代碼:
browser.find_element_by_xpath('//*[@id="g-topbar"]/div[1]/div/ul/li[2]/span/a/em').click()
browser.implicitly_wait(10)
sleep(2)
接下來提取歌單的名稱:

image.png
經(jīng)過檢查代碼發(fā)現(xiàn),這里也是個iframe:

image.png
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;
輸出結(jié)果:

image.png
(未完待續(xù),如以上有疑問,不吝賜教)