前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理,
小伙伴說想聽周杰倫的音樂,有什么網站是可以免費聽的,然后他發現咪咕音樂可以免費聽周杰倫的歌曲,既然可以免費聽,那豈不是可以爬了~
基本開發環境
- Python 3.6
- Pycharm
import requests
import parsel
相關模塊 pip 安裝即可
目標網站分析
點擊播放按鈕,會自動跳轉到音樂播放頁面
播放界面有一個下載按鈕,點擊下載,
是需要登陸賬號
- 打開開發者工具
- 選擇network
- 點擊立即下載
會有一個下載的資料介面,post請求的資料介面,里面回傳的資料有攜帶音頻真實地址,
復制url地址,是會自動下載檔案到本地的
既然是post請求,只需要看data引數的變化,看它需要傳遞哪些引數
多查看幾首歌曲的下載氫氣,就可以發現 copyrightId 就是每首音樂的ID值,只需要獲取每首歌曲的ID值,就可以下載音樂了,
所以回傳到周杰倫的音樂串列頁
可以發現音樂串列頁是靜態網站,獲取可以直接通過requests請求網站決議網站資料,可以獲取音樂的ID值以及標題,
現在就是剩下最后一個問題了,那就是翻頁,多頁獲取,
對于翻頁爬取,只需要點擊下一頁,查看url地址的變化,找到其對應的變化規律即可,
page就是對應的頁碼,所以翻頁爬取也搞定了,接下來就是寫代碼就好了
1、請求網頁獲取音樂的ID值以及標題
cookie 我就不帶了,你可以自己登陸咪咕音樂之后復制開發者工具里面的
ef get_mp3_info(url):
headers = {
'cookie': '',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
selector = parsel.Selector(response.text)
lis = selector.css('#J_PageSonglist > div.songlist-body > div')
for li in lis:
page_url = li.css('.song-name-txt::attr(href)').get()
mp3_id = page_url.split('/')[-1]
title = li.css('.song-name-txt::attr(title)').get()
2、post請求獲取音樂下載地址
這里 headers 引數可以不用寫這么多,為了方便就直接復制粘貼了,因為是post請求,有一些引數是必要帶的,不然得到想要的回傳結果,
def get_mp3_url(mp3_id, title):
url = 'https://music.migu.cn/v3/api/order/download'
headers = {
'authority': 'music.migu.cn',
'method': 'POST',
'path': '/v3/api/order/download',
'scheme': 'https',
'accept': '*/*',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',
'content-length': '42',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'cookie': '',
'origin': 'https://music.migu.cn',
'pragma': 'no-cache',
'referer': 'https://music.migu.cn/v3/music/order/download/60054701923',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
'x-requested-with': 'XMLHttpRequest',
}
data = https://www.cnblogs.com/hhh188764/archive/2020/11/18/{
'copyrightId': '{}'.format(mp3_id),
'payType': '01',
'type': '1'
}
response = requests.post(url=url, data=https://www.cnblogs.com/hhh188764/archive/2020/11/18/data, headers=headers)
html_data = https://www.cnblogs.com/hhh188764/archive/2020/11/18/response.json()
mp3_url = html_data['downUrl']
3、保存音樂至本地
保存代碼還是比較簡單,也是常用的 with open
def download(download_url, title):
response = requests.get(url=download_url)
path = '音樂\\' + title + '.mp3'
with open(path, mode='wb') as f:
f.write(response.content)
具體實作效果
有一部分的音樂仍然還是需要付費的,所以當你post請求付費音樂的時間,是沒有下載地址的,可以寫一個判斷
總結
代碼可以優化,這只是最簡易版本的爬蟲代碼,下載速度并不是很快,可以使用多執行緒爬取,速度更佳,可以自己去動手優化,
爬蟲不難,主要是在于分析網站,除非涉及嚴重加密的網站,比如字體加密,JS資料加密,這些基本大部分網站,只需要花點心思分析網站的資料,就可以爬取了,
字體加密的網站其實也不難,主要是爬取的程序有點繁雜,加油吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/224490.html
標籤:其他
下一篇:C/C++宏替換詳解
