在開始之前,做一點小小的說明哈:
- 我只是一個python爬蟲愛好者,如果本文有侵權,請聯系我洗掉!
- 本文需要有簡單的python爬蟲基礎,主要用到兩個爬蟲模塊(都是常規的)
- requests模塊
- selenium模塊
- 建議使用谷歌瀏覽器,方便進行抓包和資料獲取,
-
很多人學習python,不知道從何學起,
很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手,
很多已經做案例的人,卻不知道如何去學習更加高深的知識,
那么針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!??¤
QQ群:623406465 
?
Part1 進行網頁分析
首先打開網易云的網頁版網易云
然后搜索歌曲,這里我就搜索一首錦零的“空山新雨后”
?
這時我們來觀察網頁的url,可以發現s=后面就是我們搜索的關鍵字
?
當我們換一首歌,會發現也是這樣的,正好驗證了我們的想法
?
所以下一步讓我們點進去一首歌,然后進行播放,看看能否直接獲取音樂檔案的url,如果能,那么直接對url進行requests.get訪問,我們就能拿到.mp3檔案了
點進第一首“空山新雨后”,我們可以看到有一個“生成外鏈播放器”
?
看到這個,我心中一陣激動,仿佛就要大功告成;于是我滿懷開心的點了一下,結果,,,
?
好吧,不過我們不能放棄,來我們分析一下網頁
但當我們定位到兩個最有可能出現外鏈的地方時,發現什么都沒有
?

?
不過作為“規格嚴格,功夫到家”的傳承者,我不能放棄啊,于是我又打開了抓包工具
按照常規套路,我們定位到XHR
?
點擊播放后,出現了一大堆東西,我們要做的就是找到其中的content-type為audio一類的包
功夫不負有心人,在尋找了一(億)會兒后,我找到了
?

?
于是我又滿懷開心的復制了這個包對應的Request-URL
粘貼后訪問這個url,結果非常滿意,這就是我一直在找的url
?
現在我把那個url貼出來
https://m10.music.126.net/20200715163315/a075d787d191f6729a517527d6064f59/ymusic/0552/0f0e/530f/28d03e94478dcc3e0479de4b61d224e9.mp3
Part2 撰寫爬蟲程式
接下來就超級簡單了
下面的代碼是最常規的操作,應該有爬蟲基礎的都能看懂;如果有不懂的,注釋都在上面
#匯入requests包 import requests #進行UA偽裝 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36' } #指定url url = 'https://m10.music.126.net/20200715163315/a075d787d191f6729a517527d6064f59/ymusic/0552/0f0e/530f/28d03e94478dcc3e0479de4b61d224e9.mp3' #呼叫requests.get方法對url進行訪問,和持久化存盤資料 audio_content = requests.get(url=url,headers=headers).content #存入本地 with open('空山新雨后.mp3','wb') as f : f.write(audio_content) print("空山新雨后爬取成功!!!")
Part3 更高級的
看到這里,你可能會想,為啥根本沒用selenium模塊呢?能不能直接爬取任何一首我想要的歌,而不用每首都去費心費力的找一個url呢?當然可以噠!
其實網易云在線播放每首歌曲時,都有一個外鏈地址,這是不會變的,跟每首歌的唯一一個id系結在一起,每首歌audio檔案的url如下:
url = 'http://music.163.com/song/media/outer/url?id=' + 歌曲的id值 + '.mp3'
id值的獲取也很簡單,當我們點進每首歌時,上方會出現對應的網址,那里有id值,如下圖:
?
所以只需把上面程式中的url改成新的url即可
如果還想要更好的體驗效果,實作在程式里直接搜索歌曲,拿到id值,就需要用到selenium模塊
為什么用selenium而不用xpath或bs4?
因為搜索頁面的資料是動態加載出來的,如果直接對搜索頁面的網頁進行資料決議,就拿不到任何資料;以我目前的技術,就只能想到使用萬能的selenium模塊,下面大概說明一下步驟:
- 進行selenium無可視化界面設定
from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu')
- 導包
import requests import re from selenium import webdriver from time import sleep
- 指定歌曲,得到對應搜索頁面的url
name = input('請輸入歌名:') url_1 = 'https://music.163.com/#/search/m/?s=' + name + '&type=1'
- 獲取搜索頁面的html檔案
#初始化browser物件 browser = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options) #訪問該url browser.get(url=url_1) #由于網頁中有iframe框架,進行切換 browser.switch_to.frame('g_iframe') #等待0.5秒 sleep(0.5) #抓取到頁面資訊 page_text = browser.execute_script("return document.documentElement.outerHTML") #退出瀏覽器 browser.quit()
- 用正則模塊re匹配html檔案中的id值、歌名和歌手
ex1 = '<a.*?id="([0-9]*?)"' ex2 = '<b.*?title="(.*?)"><span >' ex3 = '><div.*?><a.*?href="https://www.cnblogs.com/sn8888/p/.*?">(.*?)</a></div></div>' id_list = re.findall(ex1,page_text,re.M)[::2] song_list = re.findall(ex2,page_text,re.M) singer_list = re.findall(ex3,page_text,re.M)
- 將id值、歌名和歌手封裝成一個個元組,寫入一個串列中,再進行列印
li = list(zip(song_list,singer_list,id_list)) for i in range(len(li)): print(str(i+1) + '.' + str(li[i]),end='\n')
- 對滿意的id值可得到一個url,再用上面的程式對該url進行requests.get方法訪問即可
Part4 小結
終究是我才疏學淺,這個找外鏈進行爬取的方法也存在很多不足,比如不能在線播放的歌曲是無法下載的,
不過寫這樣一個小程式練練手,對自己能力的提高確是有極大幫助的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/187620.html
標籤:Python
