此文首發於公眾號「Python知識圈」,歡迎直接去公眾號看
“ 閱讀文字大概需要 3 分鐘
半個月前和媳婦一起去梅賽德斯-賓士文化中心聽了一場 Angela 張韶涵的演唱會,主要是我媳婦是她的粉絲,從小都喜歡她的歌,還憑藉她的歌拿到過校園十大歌手比賽的前三名。漸漸的,我也成了她倆的歌迷,哈哈。演唱會開場第一首歌就用了很震撼的「吶喊」,前奏還加了重金屬的元素,加上 Angela 清亮的高音,讓整首歌聽起來更加熱血沸騰。本想跟著一起「吶喊」,無奈自己歌詞記不住。所以想著用 Python 爬蟲寫一個網易雲音樂的系列。先從基礎的爬取歌手的姓名的歌手 id ,之後根據 id 再爬蟲歌手名下的歌曲歌詞和歌曲評論。
今天就先帶大家爬取網易雲音樂下的歌手資訊並把資料儲存下來。
爬取結果
環境
語言:Python
工具:Pycharm
導包
BeautifulSoup:用來解析原始碼,提取需要的元素。
selenium:因為歌手資訊不在頁面原始碼裡,用 selenium 自動化測試庫直接獲取除錯頁面的 Elements 元素資訊。
csv:資料以 csv 形式儲存下來。
程式結構
程式由三部分組成:
get_singer():獲取歌手資訊。
get_data():資料結構轉化,方便儲存。
save2csv():儲存資料。
程式碼解析
因頁面原始碼中沒有我們需要的資料,用 requests 無法獲取,這些元素在 Elements 可以看到,故我們用 selenium 自動化測試庫來獲取頁面。requests 庫和 selenium 庫的區別詳見上次發的文章
這篇文章帶你輕鬆入門 python 爬蟲
。
我用的是 Chrome 瀏覽器,需要把 chromedriver 放在 Python 安裝目錄下。具體方法上面那篇文章也講得很詳細了。
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 5)
# 設定等待時間
複製程式碼
提取歌手資訊
子框架的問題需注意下,我們需要的元素資訊不在主框架裡,需要切換到子框架 g_iframe 裡再操作。用 BeautifulSoup 解析元素並用選擇器提取出我們需要的資訊,最後以 zip 資料對應關係返回資料。
格式轉換
把上面返回的資料轉換為方便儲存的資料,就是把列表裡的資料轉換為由一個個的字典組成。為了方便檢視,我把它列印出來了。
程式碼如下
資料儲存
用 with open(…) as f 儲存資料,這種其實是一種簡化寫法,簡化前寫法如下
try:
f = open(`xxx.csv`, `r`)
print(f.read())
finally:
if f:
f.close()
複製程式碼
但由於檔案讀寫時都可能產生 IOError,為了保證無論是否出錯都能正確地關閉檔案,我們用 try … finally 來實現。
Python 簡化了改寫法,即用 with open(…) as … ,建議之後檔案讀寫都用該寫法。
還有個引數需注意,open() 裡面 r 或者 a 引數,這有什麼含義呢?
主要的引數如下:
r:以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。
w:開啟一個檔案只用於寫入。如果該檔案已存在則將其覆蓋。如果該檔案不存在,建立新檔案。
a:開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
上面我用的是 a,因為我儲存資料時會不斷的迴圈追加資料,如果用的是 w,那麼每次追加資料會覆蓋上一次儲存的資料。
最後執行 main 函式,我只想獲取熱門歌手的資訊,所以我把 url 中 initial 寫死為 -1,當然你也可以獲取全部的歌手資訊,網頁中是按照英文字母 A -Z排列的,對應的 initial 的值分別是 65 – 90,你可以像下面 idlist 一樣寫成列表,也用一個迴圈就可以了。
好了,今天的爬蟲專案很簡單,十幾秒的時間已經儲存了歌手姓名和歌手 id,歌手 id 資料用於下次爬蟲對應歌手歌曲的歌詞做準備的。自己趕緊動手試試吧。
公眾號回覆「歌手」獲取原始碼和爬取結果。
此文章對你有點幫忙的話希望大家能多給點支援,該關注關注,該點贊點贊,該轉發轉發,有什麼問題歡迎在後臺聯系我,也可以在公眾號後臺加入技術交流群,群裡有大神,可以一起交流學習。
推薦閱讀
這篇文章帶你輕鬆入門 python 爬蟲
讓程式碼和邁克傑克遜一起跳舞
公眾號「Python知識圈」
長按二維碼關注我們
本公眾號專注:
1.python 技術分享
2.python 爬蟲分享
3.資料、工具共享
歡迎關注我們,一起成長!