羅 可
(邵陽(yáng)學(xué)院圖書(shū)館,邵陽(yáng) 422000)
人們?cè)诩依锫?tīng)音樂(lè)不外乎兩種方式:一種通過(guò)電腦打開(kāi)音樂(lè)網(wǎng)站,再通過(guò)音箱來(lái)播放;另一種是通過(guò)藍(lán)牙設(shè)備連接手機(jī)來(lái)播放?,F(xiàn)今,人們更偏向于追求簡(jiǎn)單、方便、智能的播放方式,通過(guò)搜尋或者事先把歌曲下載才能播放音樂(lè)的傳統(tǒng)方式無(wú)法滿足用戶需求的便利性、簡(jiǎn)單性。自2014 年亞馬遜公司上市了一款名叫“Echo”的智能音箱之后,許多科技龍頭企業(yè)都緊隨其后,紛紛推出天貓精靈、小愛(ài)音箱等智能音箱,使人們的聽(tīng)覺(jué)習(xí)慣發(fā)生了根本性的變化。
當(dāng)前,許多學(xué)者都在使用各種技術(shù)來(lái)研究點(diǎn)歌系統(tǒng)。王琴將C#技術(shù)與SQL Server 技術(shù)相結(jié)合,開(kāi)發(fā)了一套以C/S 為核心的KTV 點(diǎn)歌系統(tǒng)。豆利以Delphi 和SQL Server 為開(kāi)發(fā)工具,利用ADD 技術(shù)對(duì)KTV 音樂(lè)點(diǎn)歌管理進(jìn)行了研究。陳 國(guó) 鋒結(jié)合MySQL 與PHP 技術(shù),利 用Dream weaver 進(jìn)行網(wǎng)頁(yè)的優(yōu)化,開(kāi)發(fā)出基于PHP的在線音樂(lè)點(diǎn)歌系統(tǒng)。在互聯(lián)網(wǎng)流媒體格式音樂(lè)和爬蟲(chóng)技術(shù)興起的大背景下,本文提出了一種基于Python爬蟲(chóng)技術(shù)的云點(diǎn)歌系統(tǒng)。
網(wǎng)絡(luò)爬蟲(chóng)可以被稱(chēng)作網(wǎng)絡(luò)蜘蛛、螞蟻、自動(dòng)索引程序,或者FOAF 軟件中的網(wǎng)絡(luò)追逐者,是一種能夠自動(dòng)瀏覽全球信息網(wǎng)絡(luò)的網(wǎng)絡(luò)機(jī)器人,已在因特網(wǎng)搜索引擎或其它相似的站點(diǎn)上廣泛使用。通過(guò)在網(wǎng)頁(yè)上的爬行將所有內(nèi)容都收集起來(lái),然后再由搜索引擎進(jìn)行進(jìn)一步的處理,這樣就可以讓使用者快速地找到自己想要的信息。網(wǎng)絡(luò)爬行的實(shí)質(zhì)就是模仿用戶在網(wǎng)頁(yè)上打開(kāi)的頁(yè)面,從而獲得用戶所需要的信息。
1.1.1 網(wǎng)絡(luò)爬蟲(chóng)的構(gòu)成及其工作原理
網(wǎng)絡(luò)爬蟲(chóng)框架結(jié)構(gòu)包括三部分:解析器、控制器和索引庫(kù),其中解析器是網(wǎng)絡(luò)爬蟲(chóng)的核心,它負(fù)責(zé)對(duì)網(wǎng)頁(yè)的下載、處理,處理JS腳本、HTML標(biāo)簽、CSS代碼、空格符等內(nèi)容。
網(wǎng)絡(luò)爬蟲(chóng)工作過(guò)程如下:首先把網(wǎng)址放到爬蟲(chóng)器里面;其次,把所有網(wǎng)址的程序代碼下載下來(lái),因?yàn)椴⒎侨慷际撬枰臄?shù)據(jù),因此需要進(jìn)一步篩選html 的元素,把所需結(jié)果加載到列表中,再把所有結(jié)果顯示出來(lái)。
1.1.2 網(wǎng)絡(luò)爬蟲(chóng)搜索策略
網(wǎng)絡(luò)爬蟲(chóng)策略可以分為深度優(yōu)先策略、寬度優(yōu)先策略、聚焦搜索策略三種。目前常見(jiàn)的網(wǎng)頁(yè)搜索策略為寬度優(yōu)先和聚焦搜索策略。
(1)網(wǎng)絡(luò)爬蟲(chóng)的寬度優(yōu)先策略。從圖的某一節(jié)點(diǎn)開(kāi)始探尋,探索該節(jié)點(diǎn)所有相鄰且未尋訪過(guò)的節(jié)點(diǎn),根據(jù)探索過(guò)的節(jié)點(diǎn)繼續(xù)進(jìn)行先廣后深的搜尋。如同樹(shù)形結(jié)構(gòu),即把同一深度的節(jié)點(diǎn)走訪完,再繼續(xù)向下一個(gè)深度搜尋,直到找到目的節(jié)點(diǎn)或遍尋全部節(jié)點(diǎn)。
要抓取一個(gè)網(wǎng)頁(yè)、分析一個(gè)網(wǎng)頁(yè),是一件很容易的事情。那么對(duì)于搜尋引擎來(lái)說(shuō),要獲取的資源是網(wǎng)絡(luò)上的大量網(wǎng)頁(yè),如何抓取就是一個(gè)策略問(wèn)題。重要的網(wǎng)頁(yè)通常離種子比較近,比如當(dāng)我們進(jìn)入一個(gè)新聞?wù)军c(diǎn)時(shí),通常會(huì)發(fā)現(xiàn)最熱的消息;而當(dāng)我們繼續(xù)深入時(shí),你所能看見(jiàn)的頁(yè)面就變得不那么重要了?;ヂ?lián)網(wǎng)的真實(shí)深度可以達(dá)到17 層,但到達(dá)某個(gè)網(wǎng)頁(yè)總存在一條很短的路徑,廣度優(yōu)先瀏覽將會(huì)在最短時(shí)間內(nèi)訪問(wèn)到該頁(yè)面。廣度優(yōu)先有助于多個(gè)爬行器之間的協(xié)作,而這種協(xié)作往往是先抓住站點(diǎn)內(nèi)部的鏈路,并且具有很強(qiáng)的封閉性。
(2)網(wǎng)絡(luò)爬蟲(chóng)的聚焦搜索策略。不同于深度優(yōu)先和寬度優(yōu)先,聚焦搜索策略采用了“匹配優(yōu)先原則”的思想,利用特定的匹配算法,主動(dòng)地選取與需求主題有關(guān)的數(shù)據(jù)文檔,并限定優(yōu)先級(jí),進(jìn)而為后續(xù)的數(shù)據(jù)采集等工作做引導(dǎo)。按照“匹配優(yōu)先原則”的方式訪問(wèn),可以快速有效地獲取更多與主題有關(guān)的網(wǎng)頁(yè)。聚焦爬蟲(chóng)會(huì)為其下載的網(wǎng)頁(yè)打分,然后按分?jǐn)?shù)順序?qū)⑵浼尤氲揭粋€(gè)隊(duì)列中。接下來(lái)的最佳搜索將會(huì)在彈出隊(duì)列中的首頁(yè)上進(jìn)行分析,這樣可以確保爬行器能夠?qū)ψ钣锌赡鼙绘溄拥骄W(wǎng)頁(yè)的網(wǎng)頁(yè)進(jìn)行排序。這個(gè)策略認(rèn)為,頁(yè)面擁有許多的屬性,可以認(rèn)為類(lèi)似屬性的頁(yè)面其更新頻率也是類(lèi)似的。如果要計(jì)算某個(gè)分類(lèi)頁(yè)面的更新頻率,只需要對(duì)這一類(lèi)網(wǎng)頁(yè)抽樣,以他們的更新周期作為整個(gè)類(lèi)別的更新周期。
Python 具備簡(jiǎn)單、易用、功能強(qiáng)大、跨平臺(tái)、高開(kāi)發(fā)效率、開(kāi)源、移植性好、支持大量第三方資源庫(kù)等優(yōu)點(diǎn),目前已被廣泛地用于科學(xué)統(tǒng)計(jì)、人工智能開(kāi)發(fā)、網(wǎng)絡(luò)爬蟲(chóng)等領(lǐng)域。Beautiful Soup 是Python 的一個(gè)第三方庫(kù),它的任務(wù)是從網(wǎng)頁(yè)中獲取數(shù)據(jù),它能夠?yàn)橛脩籼峁┲T如瀏覽、查找、修改分析樹(shù)等簡(jiǎn)單的Python功能。作為一個(gè)工具包,它可以為用戶分析文件所需的資料,因其簡(jiǎn)單易于操作,編寫(xiě)一個(gè)完整的應(yīng)用程式并不需要太多的代碼。Beautiful Soup 可以把輸入的文件格式轉(zhuǎn)化為Unicode 編碼,而輸出的文件則會(huì)被轉(zhuǎn)化成UTF-8 編碼。除非該文件未指定編碼方式,否則你不必去思考如何進(jìn)行編碼,只需簡(jiǎn)單地解釋最初的編碼方法。Beautiful Soup 不但為Python標(biāo)準(zhǔn)庫(kù)提供HTML解析器,而且也為某些第三方提供解析工具,比如xml HTML、lxml XML、html5lib 等。Beautiful Soup 的 解 析 器 對(duì)比如表1所示。
表1 Beautiful Soup解析器對(duì)比
云點(diǎn)歌系統(tǒng)主要由三部分組成:主程序模塊,爬蟲(chóng)模塊和語(yǔ)音識(shí)別模塊。主程序模塊負(fù)責(zé)視頻格式轉(zhuǎn)換和音頻播放輸出;爬蟲(chóng)模塊負(fù)責(zé)根據(jù)語(yǔ)音識(shí)別的文字信息實(shí)時(shí)搜索音樂(lè)平臺(tái)的視頻資源,獲取相關(guān)資源信息反饋給主程序;語(yǔ)音識(shí)別模塊負(fù)責(zé)實(shí)時(shí)監(jiān)聽(tīng)外部指令,例如“開(kāi)始點(diǎn)歌”、“我要切歌”等關(guān)鍵詞語(yǔ),將指令回傳給爬蟲(chóng)程序進(jìn)行網(wǎng)絡(luò)搜索。
圖1 云點(diǎn)歌系統(tǒng)架構(gòu)流程圖
2.2.1 點(diǎn)歌功能
用戶要點(diǎn)歌時(shí),只需說(shuō)出“開(kāi)始點(diǎn)歌”四個(gè)字,系統(tǒng)就進(jìn)入用戶點(diǎn)歌進(jìn)程,然后彈出“請(qǐng)點(diǎn)歌”的語(yǔ)音,等待用戶說(shuō)出自己喜歡的歌曲,系統(tǒng)會(huì)根據(jù)歌曲名,通過(guò)爬蟲(chóng)程序到音樂(lè)平臺(tái)獲取網(wǎng)址回傳,處理好后會(huì)有語(yǔ)音提示“發(fā)現(xiàn)歌曲”,再過(guò)幾秒就可以聽(tīng)到音樂(lè)。
2.2.2 切歌功能
歌曲在播放過(guò)程中,用戶只需講出“我要切歌”,就可以中止正在進(jìn)行播放的歌曲,回到點(diǎn)歌的進(jìn)程中。
2.3.1 主程序模塊
系統(tǒng)的初始運(yùn)行是由主程序模塊啟動(dòng)的,主程序模塊包含主線程、播放線程和切歌線程三個(gè)線程,如圖2所示。
圖2 主模塊線程流程圖
主線程會(huì)先執(zhí)行爬蟲(chóng)程序,然后進(jìn)行語(yǔ)音控制;播放線程根據(jù)網(wǎng)絡(luò)資源地址播放音樂(lè);切歌線程負(fù)責(zé)實(shí)時(shí)監(jiān)聽(tīng)切歌指令、執(zhí)行中止播放操作,切歌線程一開(kāi)始要等待2秒,因?yàn)椴シ啪€程要進(jìn)行網(wǎng)址轉(zhuǎn)換的過(guò)程大約需要2 至3 秒,這樣歌曲播放的時(shí)候才能做切歌的操作。
2.3.2 語(yǔ)音控制模塊
執(zhí)行此程序時(shí),程序?qū)崟r(shí)監(jiān)聽(tīng)外部語(yǔ)音信息,如果獲取到用戶說(shuō)出的關(guān)鍵詞“我要切歌”,音樂(lè)播放程序就會(huì)執(zhí)行中斷歌曲,或者在歌曲結(jié)束時(shí)隨便講一句話也可以將語(yǔ)音控制程序退出,如圖3所示。由于外部環(huán)境噪聲可能造成聲音干擾,為了提高語(yǔ)音的辨識(shí)度,語(yǔ)音程序需連續(xù)識(shí)別兩至三次切歌指令,才可以切歌。
圖3 語(yǔ)音控制流程圖
2.4.1 獲取歌曲ID號(hào)
首先從音樂(lè)平臺(tái)搜索頁(yè)面開(kāi)始,使用的是chrome 瀏覽器,并設(shè)置打開(kāi)瀏覽器開(kāi)發(fā)模式,可以查看相關(guān)頁(yè)面的加載信息。在XHR 里面的內(nèi)容中可以找到JSON 格式的歌曲詳細(xì)信息,其中包含了所需的歌曲ID,然后調(diào)用BeautifulSoup 的庫(kù)函數(shù)解析抓取功能,拿到返回的JSON進(jìn)行解析,這樣就可以得到想要的所有數(shù)據(jù)。在很多動(dòng)態(tài)裝載站點(diǎn)中,將JSON 數(shù)據(jù)封裝成response,然后由爬行器調(diào)用loads函數(shù)將返回的JSON 數(shù)據(jù)轉(zhuǎn)化成python 的dictionary 數(shù)據(jù),這樣可以更好地進(jìn)行數(shù)據(jù)分析。有了歌曲的ID 號(hào),可以方便以后的播放源地址進(jìn)行拼接。
2.4.2 獲取音源鏈接地址
根據(jù)歌曲ID 號(hào)找到播放音樂(lè)的網(wǎng)頁(yè),利用requests 庫(kù)的post 方式發(fā)送一個(gè)請(qǐng)求,對(duì)頁(yè)面的文字進(jìn)行分析,然后尋找包含mp4 的視頻源地址,再把結(jié)果返回到主程序上進(jìn)行播放。
本文是以Python 的爬蟲(chóng)技術(shù)為基礎(chǔ),完成了一款云音樂(lè)點(diǎn)歌系統(tǒng)的架構(gòu)設(shè)計(jì)。利用python 第三方庫(kù)爬取歌曲的源鏈接,只需說(shuō)出想聽(tīng)的歌曲名,就可以免費(fèi)聽(tīng)到音樂(lè)平臺(tái)的歌曲。這種智能化聽(tīng)歌方式,給人們的生活增添更多歡樂(lè)。