摘要:對(duì)于這次的爬蟲來說,由于網(wǎng)易云音樂以及音樂網(wǎng)頁中大部分元素都是使用渲染生成的,因此選擇使用來完成這次的腳本??梢园l(fā)現(xiàn)網(wǎng)易云音樂的手機(jī)版歌單地址是?,F(xiàn)在已經(jīng)支持網(wǎng)易云音樂與音樂歌單的互相同步。
本文主要介紹selenium在爬蟲腳本的實(shí)際應(yīng)用。適合剛接觸python,沒使用過selenium的童鞋。(如果你是老司機(jī)路過的話,幫忙點(diǎn)個(gè)star吧)
項(xiàng)目地址https://github.com/Denon/sync...
selenium介紹selenium官網(wǎng). 直接引用官網(wǎng)的話
Selenium automates browsers. That"s it! What you do with that power is entirely up to you. Primarily, it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) also be automated as well.
簡單翻譯下
selenium是一個(gè)自動(dòng)化的瀏覽器, 主要使用來做web應(yīng)用的自動(dòng)化測(cè)試。
個(gè)人認(rèn)為用selenium主要的好處是: 可以解析js渲染的頁面。對(duì)于這次的爬蟲來說, 由于網(wǎng)易云音樂以及qq音樂網(wǎng)頁中大部分元素都是使用js渲染生成的, 因此選擇使用selenium來完成這次的腳本。
環(huán)境準(zhǔn)備python 2.7
selenium
phantomjs / Chromium
selenium 運(yùn)行需要額外的瀏覽器支持. 其中phantomjs可以在這里下載, Chromium可以在這里下載。 前期debug階段建議使用 Chromium 。
詳細(xì)的包依賴請(qǐng)查看github項(xiàng)目
初始化selenium
從網(wǎng)易云音樂歌單網(wǎng)頁中獲取歌曲列表
登錄qq音樂
搜索音樂
添加到qq音樂的歌單中
初始化seleniumfrom selenium import webdriver # 這里是使用PhantomJs, 如果使用chromium則使用webdriver.Chrome(), # 并替換對(duì)應(yīng)的驅(qū)動(dòng)路徑即可 phantomjs_driver = phantomjs_driver_path opts = Options() opts.add_argument("user-agent={}".format(headers["User-Agent"])) browser = webdriver.PhantomJS(phantomjs_driver)從網(wǎng)易云音樂中獲取音樂
對(duì)于一般爬蟲來說, 如果能用手機(jī)端網(wǎng)頁爬取那就無腦選網(wǎng)頁端爬取??梢园l(fā)現(xiàn)網(wǎng)易云音樂的手機(jī)版歌單地址是: http://music.163.com/m/playli... 。 這個(gè)地址么一看就知道, 后面那串id就是歌單id。chrome瀏覽器打開調(diào)試工具, 可以看到所有的歌曲都在...里面。 那么直接用requests + beautifulsoup 爬取元素就好。 這里就不深入討論了。 具體的代碼請(qǐng)參考項(xiàng)目
登錄qq音樂一般來說,爬蟲做登錄有兩種選擇。一種是抓包,分析登錄請(qǐng)求體,直接模擬登錄,這種穩(wěn)定性較好,只要解析出請(qǐng)求體后,登錄一般都能成功。一種是模擬正常登錄操作,在輸入框中輸入賬號(hào)密碼,然后點(diǎn)擊登錄按鈕來登錄,這種穩(wěn)定性較差,有可能會(huì)有各種意外的情況,比如驗(yàn)證碼之類的。這里當(dāng)然要使用第二種來做(不然就跑題了)。
首先打開qq音樂網(wǎng)站, 發(fā)現(xiàn)qq登錄的按鈕在
這里介紹selenium第一個(gè)函數(shù)find_element_by_xpath,這個(gè)函數(shù)就是根據(jù)element的xpath來獲取元素的。
browser.find_element_by_xpath("/html/body/div[1]/div/div[2]/span/a[2]").click()
點(diǎn)擊完后, 頁面應(yīng)該會(huì)彈出一個(gè)登錄框, 不過默認(rèn)應(yīng)該是掃碼登錄, 這個(gè)時(shí)候就要點(diǎn)擊下“帳號(hào)密碼登錄”來切換??梢园l(fā)現(xiàn), 這個(gè)切換按鈕的id是switcher_plogin. 那么使用selenium的 find_element_by_id 函數(shù):
browser.find_element_by_id("switcher_plogin").click()
按理來說這段代碼應(yīng)該能運(yùn)行成功,但是如無意外的話,我們只能獲得一個(gè)報(bào)錯(cuò)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"switcher_plogin"}
這是什么情況???
細(xì)心點(diǎn)觀察可以發(fā)現(xiàn),這個(gè)彈出來的登錄框是在一個(gè)iframe里面。這個(gè)時(shí)候需要使用到另外一個(gè)函數(shù)switch_to.frame,
# 切換iframe browser.switch_to.frame("frame_tips") browser.find_element_by_id("switcher_plogin").click() # 輸入賬號(hào)密碼, 用到send_keys函數(shù) user_input = browser.find_element_by_id("u") user_input.send_keys("qq_account") pwd_input = self.browser.find_element_by_id("p") pwd_input.send_keys("qq_password") # 最后要切換回來 browser.switch_to.default_content()
可以發(fā)現(xiàn)ok了,然后賬號(hào)密碼等輸入框直接用上面介紹過的函數(shù)直接獲取就行。
搜索歌曲在瀏覽器中打開qq音樂實(shí)際搜索一下,發(fā)現(xiàn)搜索的url是 https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E6%B5%AE%E5%A4%B8,可以看到搜索的關(guān)鍵詞在 w 這個(gè)參數(shù)里面,并且中文字是被url encode過的。那么這里使用python內(nèi)置的urllib2包即可
from urllib2 import quote url_sw = quote(search_word.encode("utf8"))
添加到歌單由于python2坑爹的編碼問題, 一般把字符存儲(chǔ)成unicode, 在需要使用的時(shí)候再轉(zhuǎn)換對(duì)應(yīng)編碼比較合適。
人工添加歌單的操作實(shí)際分為三步:
鼠標(biāo)移動(dòng)到歌曲上
點(diǎn)擊 + 號(hào)
點(diǎn)擊對(duì)應(yīng)的歌單
觀察html元素可以發(fā)現(xiàn),搜索出來的歌曲都在
all_song = browser.find_elements_by_class_name("songlist__list")
點(diǎn)擊完以后,可以看到歌單的html元素都在里面。
all_playlist = browser.find_elements_by_class_name("operate_menu__item")
而其中每個(gè)歌單是以data-dirid這個(gè)屬性來區(qū)分的,這里介紹另外一個(gè)元素選擇函數(shù)find_element_by_css_selector
browser.find_element_by_css_selector("a[data-dirid="{}"]").click()
那么就這樣結(jié)束了么?
當(dāng)然不是! 實(shí)際運(yùn)行中發(fā)現(xiàn),這里面大部分元素都是js渲染生成的,直接使用selenium函數(shù)去獲取這些元素,很大可能會(huì)報(bào)錯(cuò)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
碰到這種情況,最好的解決辦法是,用selenium直接執(zhí)行js腳本來調(diào)用元素,selenium執(zhí)行js腳本的函數(shù)為execute_script
browser.execute_script("document.getElementsByClassName("songlist__list")[0].firstElementChild.getElementsByClassName("list_menu__add")[0].click()"
而js代碼是可以直接在瀏覽器上debug的,一般現(xiàn)在瀏覽器上執(zhí)行成功在復(fù)制回來。
其他一些輔助方法在實(shí)際操作中,雖然使用的方法是正確的,但會(huì)出現(xiàn)很多意外的情況導(dǎo)致本次操作是失敗的,這時(shí)候就需要來一次重試來解決問題(如果一次重試解決不了問題,那就來兩次)。這里使用一個(gè)裝飾器來寫
def retry(retry_times=0, exc_class=Exception, notice_message=None, print_exc=False): """retry_times: 重試次數(shù) exc_class: 捕捉的異常 notice_message: 提示信息 print_exc: 是否打印錯(cuò)誤信息 """ def wrapper(f): @functools.wraps(f) def inner_wrapper(*args, **kwargs): current = 0 while True: try: return f(*args, **kwargs) except exc_class as e: if print_exc: traceback.print_exc() if current >= retry_times: raise RetryException() if notice_message: print notice_message current += 1 return inner_wrapper return wrapper總結(jié)
介紹了selenium獲取元素的各種用法,更多的請(qǐng)參考文檔
解決使用selenium可能會(huì)碰到的一些坑。
最后在安利一次github項(xiàng)目, https://github.com/Denon/sync...。歡迎點(diǎn)贊以及提issue?,F(xiàn)在已經(jīng)支持網(wǎng)易云音樂與qq音樂歌單的互相同步。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/38639.html
摘要:基于等開發(fā)一款移動(dòng)端音樂,界面參考了安卓版的網(wǎng)易云音樂布局適配常見移動(dòng)端。圖標(biāo)使用阿里巴巴圖標(biāo)庫,中間的唱片旋轉(zhuǎn)動(dòng)畫使用了實(shí)現(xiàn)。搜索功能實(shí)現(xiàn)功能搜索歌手歌單歌曲熱門搜索數(shù)據(jù)節(jié)流上拉刷新保存搜索記錄。 基于 Vue(2.5) + vuex + vue-router + vue-axios +better-scroll + Scss + ES6 等開發(fā)一款移動(dòng)端音樂 WebApp,UI ...
摘要:,在聽音樂的時(shí)候忽然想聽騰格爾的鋼鐵之翼隱形的翅膀,在網(wǎng)易云上卻找不到,就很氣。于是想到了做一個(gè),音樂搜索的功能,把所有想聽的歌,能夠一次性在酷狗網(wǎng)易云蝦米等平臺(tái)上找找完。本項(xiàng)目非常適合新手練習(xí)熟悉全家桶,歡迎哦。 React-music React Music WebApp,在聽音樂的時(shí)候忽然想聽騰格爾的鋼鐵之翼(隱形的翅膀),在網(wǎng)易云上卻找不到,就很氣。于是想到了做一個(gè),音樂搜索的...
摘要:通常這種加密都是通過加密的,所以首先要找到這個(gè)有加密算法的。追蹤函數(shù),發(fā)現(xiàn)它指向一個(gè)叫的函數(shù),仔細(xì)研究許久后大概知道加密算法經(jīng)兩次加密獲得,模式為,偏移量為。 前言 某寶評(píng)論區(qū)已經(jīng)成功爬取了,jd的也是差不多的方法,說實(shí)話也沒什么好玩的,我是看上它們分析簡單,又沒加密才拿來試手的。如果真的要看些有趣的評(píng)論的話,我會(huì)選擇網(wǎng)易云音樂,里面匯聚了哲學(xué)家,小說家,story-teller,皮皮...
摘要:引言馬上情人節(jié)就要來了,是否需要一首歌來撫慰你,受傷或躁動(dòng)的心靈。來吧,今天教你用行代碼搞定熱門歌單。爬取的效果如下總結(jié)本文旨在安撫你因情人節(jié)受傷的小心靈,同時(shí)帶你入個(gè)爬蟲的門,感受下的強(qiáng)大。 0. 引言 馬上314情人節(jié)就要來了,是否需要一首歌來撫慰你,受傷或躁動(dòng)的心靈。來吧,今天教你用15行代碼搞定熱門歌單。學(xué)起來并聽起來吧。 本文使用的是Selenium模塊,它是一個(gè)自動(dòng)化測(cè)試工...
閱讀 1792·2021-10-18 13:34
閱讀 3981·2021-09-08 10:42
閱讀 1611·2021-09-02 09:56
閱讀 1661·2019-08-30 15:54
閱讀 3198·2019-08-29 18:44
閱讀 3352·2019-08-26 18:37
閱讀 2285·2019-08-26 12:13
閱讀 525·2019-08-26 10:20