使用 Python 從 Genius 刮取歌詞的指南
已發表: 2019-08-08什麼是說唱天才?
最初於 2009 年開始的 Rap-Genius 現在已經發展成為一家名為Genius的獨特的音樂知識共享媒體公司,每月為超過一億人提供服務。 在本博客中,我們將通過分步指南學習如何使用 Python在網絡上抓取歌詞。
大多數喜歡音樂的互聯網用戶必須熟悉Genius。 這是一個快速發展的網站,分享歌曲背後的內容——藝術家在寫下歌曲時的想法等等。 甚至像 Ariana Grande 和 Kendrick Lamar 這樣的知名藝術家也與 Genius 合作,讓世界更深入地了解他們的藝術。
如果有人想抓取歌詞,無論他們的目的是什麼,Genius 都是可以訪問的網站。 他們的數據庫包含超過 2500 萬首歌曲、專輯、藝術家以及註釋,使其成為世界上最大的歌詞數據庫。
為什麼 One 要從 Genius 中抓取數據?
Genius 已經發展成為一個音樂社區,貢獻者、音樂家甚至編輯齊心協力解構歌曲。 正因為如此,它們已成為世界上最大的音樂歌詞庫。 Genius 還與音樂流媒體公司合作,以增加他們的用戶群。
Genius 是從網站上抓取和抓取音樂歌詞和其他音樂行業相關數據的地方。 因為它不僅會給你一個龐大的歌詞庫,而且你還可以訪問用戶評論、用戶情緒。 想像一下,您可以根據從 Genius! 中提取的數據預測當前在新用戶中熱門的類型。
如何使用 Python 從 Genius 網站抓取歌曲歌詞?
在抓取網頁時,很少有語言支持不同類型的網頁抓取項目。 其中,Python 是最容易學習的,並且對於不同類型的項目也很方便。 除了 Python,您還需要一些第三方 Python 包以及文本編輯器。 無論您要抓取哪個網站,您都可以按照此頁面上的說明進行操作,因為設置是相同的。 完成並設置系統後,您就可以開始了。
代碼在哪裡?
所以我們討論了很多關於歌詞、Genius 和基本設置的內容。 在我向您展示如何運行它以及代碼是如何工作的之前,讓我們先看一下使用 python 抓取歌詞的代碼。
[代碼語言=“python”]
#!/usr/bin/python
#- * - 編碼:utf – 8 – * –
導入 urllib.request
導入 urllib.parse
導入 urllib.error
從 bs4 導入 BeautifulSoup
導入 ssl
導入json
導入 ast
導入操作系統
from urllib.request 導入請求,urlopen
# 用於忽略 SSL 證書錯誤
ctx = ssl.create_default_context()
ctx.check_hostname = 假
ctx.verify_mode = ssl.CERT_NONE
# 用戶輸入
url = input('輸入天才歌曲歌詞Url-')
# 讓網站相信你正在使用 Mozilla 瀏覽器訪問它
req = Request(url, headers = { 'User-Agent' : 'Mozilla/5.0' })
網頁 = urlopen(req).read()
# 創建html頁面的BeautifulSoup對象,方便提取數據。
湯= BeautifulSoup(網頁,'html.parser')
html = soup.prettify('utf-8')
song_json = {}
song_json[“歌詞”] = [];
song_json[“評論”] = [];
#提取歌曲的標題
對於 soup.findAll('title') 中的標題:
song_json[“標題”] = title.text.strip()
# 提取歌曲的發行日期
對於soup.findAll('span',attrs = {'class':'metadata_unit-info metadata_unit-info–text_only'})中的span:
song_json[“發布日期”] = span.text.strip()
# 提取歌曲的評論
對於soup.findAll('div',attrs = {'class':'rich_text_formatting'})中的div:
評論 = div.text.strip().split(“n”)
評論中的評論:
如果評論!=””:
song_json[“評論”].append(評論);

#提取歌曲的歌詞
對於soup.findAll('div',attrs = {'class':'lyrics'})中的div:
song_json[“歌詞”].append(div.text.strip().split(“n”));
#保存以文件名創建的json為title + .json
使用 open(song_json[“Title”] + '.json', 'w') 作為輸出文件:
json.dump(song_json, outfile, indent = 4, ensure_ascii = False)
# 將html內容保存為html文件,名稱為title + .html
使用 open(song_json[“Title”] + '.html', 'wb') 作為文件:
文件.write(html)
print('———-數據提取完成。檢查json文件。———-')
[/代碼]
要運行上面給出的代碼,您需要做的就是將其保存在擴展名為 .py 的文件中。 因此,您可以將其保存到名為 songLyricsExtractor.py 的文件中,然後從終端運行命令:
[代碼語言=“python”]
python songLyricsExtractor.py
[/代碼]
運行時,系統會提示您輸入 URL。 這可以是 Genius 網站中任何歌曲的鏈接。 您可以將此鏈接用於 Lana Del Rey 的尋找美國。 我們從 Genius 中抓取了這首歌的歌詞,以向您展示代碼是如何工作的,稍後將在博客中介紹。
代碼說明
在我們開始運行代碼並了解它為您提供了什麼之前,讓我們嘗試了解代碼本身。 像往常一樣,我們使用的是 BS4(或 Beautiful Soup),這是一個通過n HTML 頁面進行解析的庫。
一開始,我們獲取網頁並將其轉換為 Beautiful Soup 對象,我們可以從中獲取具有特定屬性的 div、span、標題和其他標籤。 我們使用這些技術來抓取歌詞、評論、網頁標題以及歌曲實際發布的日期。 一旦我們抓取了這些數據,我們將它保存在一個 JSON 文件中,並帶有頁面的 name-title+.json 擴展名。 我們還將 HTML 文件保存為 page+.html 擴展名的名稱標題。 這樣做是為了可以分析 HTML 頁面,並且將來可以找到更多數據點。
行動守則的一個例子
在運行代碼並為其提供 Genius 上的歌曲鏈接時,您將獲得一個類似於下面給出的 JSON。 下面是 Lana Del Rey 為尋找美國而獲得的 JSON。 我們只展示了一個 JSON,因為它們的大小非常大,但您也可以針對自己喜歡的歌曲運行它。
[代碼語言=“python”]
{
“歌詞”:[
[
“[第 1 節]”,
“去舊金山旅行”,
“我們所有的朋友都說我們會跳舞”,
“沒用,所以我去了弗雷斯諾”,
“這是一個風景優美的車道”,
“停在公園裡看孩子們”,
“我們過去只在天黑後才為他們擔心”,
“”,
“[合唱]”,
“我仍在尋找我自己版本的美國”,
“一個沒有槍的人,旗幟可以自由飄揚”,
“天上沒有炸彈,只有你我碰撞時的煙火”,
“這只是我心中的一個夢想”,
“這只是我心中的一個夢想”,
“這只是我心中的一個夢想”,
“”,
“[第 2 節]”,
“我飛回紐約市”,
“錯過了哈德遜河線”,
“坐火車到普萊西德湖”,
“那是另一個地點和時間,在哪裡”,
“我過去常常去開車兜風,聽藍調”,
“很多事情在我做之前我會三思而後行,不”,
“”,
“[合唱]”,
“我仍在尋找我自己版本的美國”,
“一個沒有槍的人,旗幟可以自由飄揚”,
“天上沒有炸彈,只有你我碰撞時的煙火”,
“這只是我心中的一個夢想”,
“這只是我心中的一個夢想”,
“這只是我心中的一個夢想”,
“這只是我心中的一個夢想”
]
],
“註釋”: [
[
“尋找美國”是拉娜於 2019 年 8 月 5 日寫的一首關於美國大規模槍擊事件的歌曲,一旦她回到洛杉磯,這首歌的信息依賴於拉娜夢想為美國人民創造更好的境地,這是她的主題之前曾在“Coachella – Woodstock in My Mind”和“When The World Wars We Kept Dancing”等曲目中演唱過。 Del Rey 於 2019 年 8 月 9 日通過流媒體平台將這首歌作為單曲發行。”,
“這首歌的標題可能是對 Simon & Garfunkel 的《美國》的引用:”,
“他們都來尋找美國”,
“Del Rey 帶著她的 Instagram 與朋友兼製片人 Jack Antonoff 分享了她在錄音室唱歌的視頻。”
],
[
“Del Rey 通過 Instagram 分享了這首歌,並添加了:”,
“大家好,今天早上和我的兄弟從蒙特西托早早回來,請傑克·安東諾夫進城,因為我心裡有一首歌想寫。 現在我知道我不是政治家,我也不想因為有意見而原諒我——但鑑於過去幾天發生的所有大規模槍擊事件和背靠背槍擊事件真的影響了我在細胞層面上,我只是想發布我們的工程師勞拉 20 分鐘前拍攝的這段視頻。 我希望你喜歡它。 我正在為今天早上錄製的副歌唱愛。 我將把它稱為“尋找美國”。”
]
],
“標題”:“Lana Del Rey - 尋找美國歌詞 | 天才歌詞”,
“發布日期”:“2019 年 8 月 9 日”
}
[/代碼]
該解決方案的可擴展性如何?
雖然我們提供的解決方案是針對一首歌曲,但您可以在 Genius 上創建一個歌曲歌詞頁面鏈接列表,然後使用 Python 迭代地運行列表中的代碼以用於網絡抓取歌詞。 您還可以為包含歌詞的 Genius 頁面找到正則表達式匹配,然後一次從 Genius 爬取多個頁面,這樣您的代碼本身就可以識別包含歌詞的頁面。
然而,這些類型的 DIY 解決方案非常適合正在結交的愛好者或有一次性需求的人。 如果您的需求更具商業性,並且您遇到網絡抓取問題,您需要以下功能:
- 特定格式的數據傳輸
- 定期刷新數據
- 沒有維護和基礎設施成本
那麼你應該選擇像 PromptCloud 這樣的網絡抓取服務提供商。 我們在 PromptCloud 的團隊以向世界各地的業務團隊提供企業級網絡抓取解決方案而自豪,使他們能夠在其業務工作流程中使用數據,並做出數據驅動的決策。
