在開始之前,做一點小小的說明哈:
首先打開網易云的網頁版網易云
然后搜索歌曲,這里我就搜索一首錦零的“空山新雨后”
這時我們來觀察網頁的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
接下來就超級簡單了
下面的代碼是最常規的操作,應該有爬蟲基礎的都能看懂;如果有不懂的,注釋都在上面
#導入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'}#指定urlurl = '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("空山新雨后爬取成功!!!")
看到這里,你可能會想,為啥根本沒用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模塊,下面大概說明一下步驟:
from selenium.webdriver.chrome.options import Optionschrome_options = Options()chrome_options.add_argument('--headless')chrome_options.add_argument('--disable-gpu')
import requestsimport refrom selenium import webdriverfrom time import sleep
name = input('請輸入歌名:')url_1 = 'https://music.163.com/#/search/m/?s=' + name + '&type=1'
#初始化browser對象browser = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options)#訪問該urlbrowser.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()
ex1 = ''ex3 = 'class="td w1">(.*?)
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态