爬蟲實戰(2)--爬取網易雲音樂,做一個自己的音樂播放器(上)

爬蟲實戰(2)--網易雲音樂爬取

前言

經過上一篇爬取學校官網之後,覺得不過癮,開始動起了網易雲音樂的注意,爲了更好的入門爬蟲,於是開始了我的小項目,做一個播放器,大概是這樣子的:
在這裏插入圖片描述
界面比較簡陋,不過有 搜索 功能和 播放 功能,用戶雙擊歌曲就可以播放,這個功能還不夠完善,但是滿足了我的預想,如果各位觀衆姥爺有興趣,可以繼續完善。

環境

使用語言:python3.6
開發工具:PyChram
第三方庫:

  1. requests (強大的爬蟲庫)
  2. BeautifulSoup (用於處理爬取的網頁信息)
  3. PIL (圖象處理,本項目用於顯示驗證碼圖片)
  4. pygame(用來播放音樂)
  5. tkinter(可視化編程)
  6. selenium(網頁調試工具,反爬蟲人員的噩夢)
  7. 下載方法
pip install ***

爬取歌曲列表

首先,瀏覽網易雲音樂官網,隨便搜索一首歌
在這裏插入圖片描述
我們看到上面的網址,格式爲:

https://music.163.com/#/search/m/?s=歌曲名稱&type=1

我們發現參數有兩個:

s :歌曲名稱
type :選項卡的位置,不寫默認爲第一個,也就是單曲的位置

可以自己嘗試一下,s 參數後面加歌手名或者歌曲名,都可以出想要的結果

於是,搜索這部分的代碼不難寫,我們嘗試直接抓取這個頁面:

import requests

rs = requests.session()
find_music_url = 'https://music.163.com/#/search/m/?s='+your_music+'&type=1'
html = rs.get(find_music_url)
print(html.text)

我們用常規工具 requests 嘗試抓取,發現網頁內容確實是被抓取下來,但是怎麼都找不到歌單內容

於是,分析一下發現,歌單的位置處在一個叫 iframe 的標籤裏面

<iframe name="contentFrame" id="g_iframe" class="g-iframe" scrolling="auto" frameborder="0" src="about:blank" allowfullscreen="true"></iframe>

在這裏插入圖片描述
到這裏我們知道,他的網頁內容是通過 js 加載的,單純的用 requests庫並不能抓取內容,這裏提供兩個思路:

第一個:
使用之前提到的 selenium(網頁調試工具,反爬蟲人員的噩夢)庫
簡單的說,他是模擬人操作瀏覽器,可以實現各種人爲的操作瀏覽器,包括鼠標點擊等
我們可以在js加載結束後,抓取頁面內容

第二個:
分析js代碼,然後用python實現或者用python調用它,達到我們向服務器發送相對應的參數的目的
抓取json,獲取歌單內容

這裏我採用的是第一個辦法,比較簡單快捷,之後的歌曲播放連接採用的是第二個辦法,如果想知道過程可以直接閱讀後面部分。

使用 selenium 十分簡單,代碼如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

driver = None

# 啓動瀏覽器
def open_chrome():
    # 調試器配置
    chrome_options = Options()
    chrome_options.add_argument('--disable-gpu')  # 谷歌文檔提到需要加上這個屬性來規避bug
    chrome_options.add_argument('blink-settings=imagesEnabled=false')  # 不加載圖片, 提升速度
    chrome_options.add_argument('--headless')  # 瀏覽器不提供可視化頁面.
    # 申明是谷歌瀏覽器
    global driver
    driver = webdriver.Chrome(chrome_options=chrome_options)


# 查找音樂
def find_music(your_music):
    # 訪問地址
    find_music_url = 'https://music.163.com/#/search/m/?s='+your_music+'&type=1'
    driver.get(find_music_url)
    driver.switch_to.frame('g_iframe')  # 進入iframe
    find_music_html = driver.execute_script("return document.documentElement.outerHTML")
    # print(html)
    # 規範化輸出
    soup = BeautifulSoup(find_music_html, 'lxml')
    # 查找的類名
    attrs = {
        'class': 'item',
        'class': 'f-cb',
        'class': 'h-flag'
    }
    # 查找類名爲attrs的內容
    find_music1 = soup.findAll(name="div", attrs=attrs)
    # 查找後的音樂列表
    find_ok_music = []
    '''
    對部分用 BeautifulSoup做規範化輸出,就交由大家自己處理
    find_music1 以及是抓取後的歌單內容
    我的格式爲下面所示
     # 查找內容存放
        find_my_music = {
            'a': a['href'],  # 歌曲鏈接
            'b': b[0]['title'],  # 歌曲名稱
            'c': c,  # 演唱者
            'time': music_time  # 歌曲時間
        }
    '''
    return find_ok_music


# 關閉瀏覽器
def close_chrome():
    driver.close()  # 關閉瀏覽器,回收資源

這部分代碼的註釋還是蠻多的,我相信觀衆姥爺們很容易就可以看懂。

各部分的功能都做成函數,方便後面調用。

值得注意的一點是,如果你沒有下載 chromedriver.exe 編譯器會報這個錯誤

selenium.common.exceptions.WebDriverException: 
Message: 'chromedriver' executable needs to be in PATH. 
Please see https://sites.google.com/a/chromium.org/chromedriver/home

意思是缺少 chromedriver.exe ,需要到
http://chromedriver.storage.googleapis.com/index.html
下載適合的版本,然後將下載完的壓縮包解壓,將 chromedriver.exe 文件放在你的python腳本下即可。

注意:我用的是谷歌瀏覽器,在地址欄輸入以下網址可以查看自己瀏覽器的版本。

chrome://version/

至此,查找功能就完成啦,還是比較簡單的,有什麼問題可以留言提問哦。

播放功能請看下一篇,祝大家敲碼愉快哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章