前言
經過上一篇爬取學校官網之後,覺得不過癮,開始動起了網易雲音樂的注意,爲了更好的入門爬蟲,於是開始了我的小項目,做一個播放器,大概是這樣子的:
界面比較簡陋,不過有 搜索 功能和 播放 功能,用戶雙擊歌曲就可以播放,這個功能還不夠完善,但是滿足了我的預想,如果各位觀衆姥爺有興趣,可以繼續完善。
環境
使用語言:python3.6
開發工具:PyChram
第三方庫:
- requests (強大的爬蟲庫)
- BeautifulSoup (用於處理爬取的網頁信息)
- PIL (圖象處理,本項目用於顯示驗證碼圖片)
- pygame(用來播放音樂)
- tkinter(可視化編程)
- selenium(網頁調試工具,反爬蟲人員的噩夢)
- 下載方法
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/
至此,查找功能就完成啦,還是比較簡單的,有什麼問題可以留言提問哦。
播放功能請看下一篇,祝大家敲碼愉快哦~