爬取網易雲熱門音樂歌單

需求分析

每當歌荒時,總想找那些播放量比較高的歌單聽,畢竟這麼多人選擇的歌單歌曲質量總會有保證.

爬取目標

本文將提取網易雲音樂 播放量在1000萬 以上的歌單名稱,播放量和鏈接地址.

準備工作

保證電腦安裝了 python3.6 和已經安裝好了 selenium 庫.沒安裝的可通過 在終端輸入 pip install selenium 進行安裝.

爬取分析

打開歌單的 url:http://music.163.com/#/discover/playlist.用 Chrome 的開發者工具 (F12) 分析.
頁面詳情
發現歌單信息在<ul class='m-cvrlst f-cb' id='m-pl-container'>下的 <li>標籤中.
因此我們可以通過以下代碼獲取歌單信息:

from selenium import webdrive
url = http://music.163.com/#/discover/playlist
browser = webdrive.Chrome()
brows.get(url)
data = browser.find_element_by_id('m-pl-container').find_elements_by_tag_name('li')

但是我們會發現無法獲取歌單信息,原因是注意看圖片最前面發現有個 <iframe> 標籤,因此導致我們無法定位,故需要在獲取數據前加一行代碼定位browser.switch_to.frame('contentFrame'),這樣我們就可以獲取數據了.關於selenium定位的問題可以訪問 https://blog.csdn.net/huilan_same/article/details/52200586 更詳細的瞭解.

獲取歌單詳細信息

頁面詳情
通過上圖我們發現歌單名和地址在<a title="| 粵語 | 宇宙粒子與每個人的愛情" href="/playlist?id=2220301639" class="msk"></a>中,播放量在<span class="nb">14萬</span>中.接下來我們來獲取首頁的歌單信息.

抓取首頁

from selenium import webdriver
import csv
browser = webdr.Chrome()
csv_file = open('playlist.csv', 'w', newline='', encoding='utf-8') #注意此處必須得加 encoding='utf-8,不然遇到歌單名包含特殊字符會報錯
writer = csv.writer(csv_file)
writer.writerow(['標題', '播放數', '鏈接'])
url = 'http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0'
browser.get(url)
browser.switch_to.frame('contentFrame')
data = browser.find_element_by_id('m-pl-container').find_elements_by_tag_name('li')
for i in range(len(data)):
    nb = data[i].find_element_by_class_name('nb').text
    if '萬' in nb and int(nb.split('萬')[0]) > 1000:
        msk = data[i].find_element_by_css_selector('a.msk')
        writer.writerow([msk.get_attribute('title'), nb, msk.get_attribute('href')])
csv_file.close()

獲取所有頁面

頁面數據
通過分析我們發現每一頁的地址只是 offset 發生了偏移,即每一頁加 35,有人可能會想到用改變 offset 的方法來獲得所有頁面數據,我試過,會報錯,無法找到頁面,不知道是我方法不對還是怎麼滴,有興趣的可以試一下

這裏我們採取另一種方法來獲取所有頁面數據.

觀察最後一行有個文本是下一頁,而且 class='zbtn znxt',前面顯示頁面數據的class='zpgi'.一次我們可以通過class='zbtn znxt'來獲取所有數據信息.

注意:使用webdrive.Chrome()會打開瀏覽器,每跳一個頁面就會打開瀏覽器一次.我們可以將其換成chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
,它把網站加載到內存並執行頁面上的JavaScript,但是它不會向用戶展示網頁的圖形界面.

完整代碼

from selenium import webdriver
import csv
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
csv_file = open('playlist.csv', 'w', newline='', encoding='utf-8')
writer = csv.writer(csv_file)
writer.writerow(['標題', '播放數', '鏈接'])
url = 'http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0'
while url != 'javascript:void(0)':
    browser.get(url)
    browser.switch_to.frame('contentFrame')
    data = browser.find_element_by_id('m-pl-container').find_elements_by_tag_name('li')
    for i in range(len(data)):
        nb = data[i].find_element_by_class_name('nb').text
        if '萬' in nb and int(nb.split('萬')[0]) > 1000:
            msk = data[i].find_element_by_css_selector('a.msk')
            writer.writerow([msk.get_attribute('title'), nb, msk.get_attribute('href')])
    url = browser.find_element_by_css_selector('a.zbtn.znxt').get_attribute('href')
csv_file.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章