天天看點

咪咕音樂HTML代碼,python3爬取咪咕音樂榜資訊(附源代碼)

參照上一篇爬蟲小豬短租的思路https://www.cnblogs.com/aby321/p/9946831.html,繼續熟悉基礎爬蟲方法,本次爬取的是咪咕音樂的排名

咪咕音樂榜首頁http://music.migu.cn/v2/music/billboard/?_from=migu&page=1

注意:本程式有時候運作會報錯,此時重新運作即可,報錯原因不明了!

與小豬短租不同的是,爬取的排名資訊不在每首歌曲的詳細頁面内,需要在分頁url中擷取(代碼19-25行),使用打包循環并且輸出給函數get_info()

"""

典型的分頁型網站——咪咕音樂榜

有時候運作會報錯,有時候正常,原因不知道

"""

import requests

from bs4 import BeautifulSoup as bs

import time

headers = {

'User-Agent':'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'

}

#擷取每一個歌曲的網址,參數是分頁url

def get_link(url):

html_data = requests.get(url, headers = headers)

soup = bs(html_data.text, 'lxml')#bs4推薦使用的的解析庫

#print(soup.prettify()) #标準化輸出url中的源代碼(有可能跟網頁檢視中的不一緻,網頁中有可能标簽書寫不規範)以此為基礎抓取,如果抓取失敗,用此指令檢視源代碼

links = soup.select('#js_songlist > div > div.song-name > span > a')#注意循環點!!!

ranks = soup.select('#js_songlist > div > div.song-number ')#因為歌曲詳情裡沒有排名資訊,是以需要在這部分擷取詳情資訊

#print(ranks)

for rank, link in zip(ranks,links):#打包循環,主要為了輸出配套的rank和link

rank = rank.get_text()

link = 'http://music.migu.cn' + link.get('href')#觀察每個歌曲的詳細網頁發現,前面部分需要手動添加http://music.migu.cn

#print(rank,link)

get_info(rank,link)

#擷取每一個歌曲的詳細資訊,排名、歌名、歌手和專輯名,參數url是每個歌曲的網址

def get_info(rank,url):

html_data = requests.get(url, headers = headers)

soup = bs(html_data.text, 'lxml')#bs4推薦使用的的解析庫

# print(soup.prettify()) #标準化輸出url中的源代碼(有可能跟網頁檢視中的不一緻,網頁中有可能标簽書寫不規範)以此為基礎抓取,如果抓取失敗,用此指令檢視源代碼

title = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.song-name > span.song-name-text')[0].string.strip()

# 用網頁copy過來的全部是“body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em”,但是使用這個爬不出來資料(我也不知道why),把body去掉或者用下面最簡短的方式(隻使用最近的且唯一的div)

# title = soup.select('div.pho_info > h4 > em ')

# 查詢結果title格式是一維清單,需要繼續提取清單元素(一般就是[0]),清單元素是前後有标簽需要繼續提取标簽内容,使用get_text()或者string

singer = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.song-statistic > span > a')[0].string.strip()

cd = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.style-like > div > span > a')[0].string.strip() # 擷取标簽的屬性值

#将詳細資料整理成字典格式

data = {

'排名':rank,

'歌名':title,

'歌手':singer,

'專輯':cd

}

print(data)

#程式主入口

if __name__=='__main__':

for number in range(1,3):

url = 'http://music.migu.cn/v2/music/billboard/?_from=migu&page={}'.format(number) #構造分頁url(不是歌曲詳情的url)

get_link(url)

time.sleep(1)

輸出結果:每次輸出data資料(字典型)字段順序是随機的,因為本身字典型資料就沒有順序,如果想固定順序的話請使用清單

咪咕音樂HTML代碼,python3爬取咪咕音樂榜資訊(附源代碼)

舉一反三:同類型的分頁型網站均可使用此爬蟲模闆,例如豆瓣電影top100、時光網top榜之類的

ps:不知道這個榜單準不準,反正我基本沒聽過(可能是我out了)