随着之前版權大戰的落幕,網易雲音樂坐擁最忠實的一批用戶,但是卻在版權上缺失了一大塊,帶給用戶很不好的使用體驗。于是很多人紛紛轉戰QQ音樂等其他競品。
本來我也就是偶爾聽個響,對于聽歌沒有太大的需求,再一方面也是情懷,所以沒有積極擁抱QQ音樂。但是實在架不住每次在網易雲音樂要聽啥歌沒有啥,潛移默化地也就轉移到了QQ音樂上。
到了QQ音樂一看,诶嘿,這不行啊,我辛辛苦苦積攢的家底兒都沒了嘛這不是?就光秃秃的“我喜歡”,還大小沒幾首歌。這讓習慣了網易雲日推的我怎麼能習慣啊……
好了,以上都是前情提要。
實際上這篇文章的寫作動機就是要把網易雲音樂的歌單導入到QQ音樂中去。
本身QQ音樂提供了一個導入網易雲音樂歌單的小公舉,啊不,咳咳,是小工具。但是奈何出于不可名狀的原因,這個工具常年出于抽風狀态。其具體症狀見下圖:
于是乎,官方是靠不住的了。
大力水手曾經曰過:“靠山山倒,靠人人跑。隻有靠自己,最好。”自己動手,豐衣足食,現在這個社會誰還沒點兒技術了嗎?
選擇的方法好吧我承認,我沒有技術……
那好家夥,直接用我們社會主義勞動人民的老朋友requests來獲取頁面信息,返回來的倒也說不上是亂碼,但就是沒有咱們真正需要的内容——歌曲名稱。
行吧,那我配置一下User-Agent。我去還是不行?
咋還出來了一個SSLError?這啥?
上網一查,還得手動關閉SSL證書驗證。行叭,走你~
啊不對,不登錄好像看不到完整的歌單?那就先登錄吧。登錄完好像還得在請求頭裡面加上用cookie來保持認證身份?……
不就是這麼一個頁面,要啥技術啊,看我暴力破拆。
開工首先在頁面上點擊鼠标右鍵,選中“檢查”這一項;或者不點擊鼠标,直接按下快捷鍵Ctrl Shift I。會彈出Chrome浏覽器的控制台。此時找到其中的元素<table class="m-table ">,這個元素裡邊包含的就是我們想要的歌單了。
在這個标簽内部又分為兩大部分:<thead>和<tbody>。通過移動鼠标觀察頁面變化,可以發現<tbody>中的内容是主體。
再然後,輕易可以發現<tbody>中的每個子條目都對應于歌單中的一首歌:
抓住這個點就是一頓分析(瘋狂查找),一直找到最小的對應于歌曲名字的标簽:
行了,現在差不多可以開始編程了。
咱也不用假模假樣再去用requests一頓爬了,直接copy-paste搞腚,呸,搞定。
鼠标選中,右鍵點擊,依次選擇:
然後新建一個HTML文件,粘貼,保存,哈哈,數據爬下來啦~
請叫我人工全智能手動爬蟲工程師。
接下來再利用vscode的HTML格式化插件,把一行的HTML格式化一下,大概就長這樣了:
文件有了,那接下來就好辦了。
Python先把文件打開,把文件内容給讀取進來:
with open("test.html", "r", encoding="utf-8") as f:
content = f.read()
此處f.read()返回一個由文本内容組成的字符串,我們使用BeautifulSoup來進行解析:
from bs4 import BeautifulSoup
response = BeautifulSoup(content,'lxml')
仔細考察節點内容,會發現每首歌的名字都在一個特殊的标簽<b>中,并且隻在歌名處使用了這個标簽,因此我們可以直接調用find_all()方法來獲取相應節點:
results = response.find_all("b")
由于歌曲名字是以标簽<b>的屬性title形式存在的,因此我們可以通過節點直接獲取相應的屬性值:
for result in results:
print(result['title'])
# 笑紅塵 - (電影《東方不敗之風雲再起》主題曲)
# 愛你在心口難開
# 得意的笑
# 寂寞在唱歌
# ...
最後,我們将得到的歌曲名字統一保存為一個名為“SongList.txt”的文本文件,導出歌單的工作就大功告成了。
with open("SongList.txt", "w ", encoding="utf-8") as f:
f.writelines([result["title"] for result in results])
此時結果都擠成一堆,所以我們還需要為每一個歌名末尾手動添加一個換行符,最終程序如下:
from bs4 import BeautifulSoup
with open("test.html", "r", encoding="utf-8") as f:
content = f.read()
response = BeautifulSoup(content,'lxml')
results = response.find_all("b")
with open("SongList.txt", "w ", encoding="utf-8") as f:
f.writelines([result["title"] "\n" for result in results])
别看文章寫了這麼多,其實代碼非常之簡短(畢竟真正有難度的部分已經由資深人工全智能爬蟲工程師代勞了),歌單導出已經搞腚了。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!