python3爬取咪咕音乐榜信息(附源代码)
參照上一篇爬蟲小豬短租的思路https://www.cnblogs.com/aby321/p/9946831.html,繼續(xù)熟悉基礎(chǔ)爬蟲方法,本次爬取的是咪咕音樂的排名
咪咕音樂榜首頁http://music.migu.cn/v2/music/billboard/?_from=migu&page=1
注意:本程序有時候運行會報錯,此時重新運行即可,報錯原因不明了!
與小豬短租不同的是,爬取的排名信息不在每首歌曲的詳細頁面內(nèi),需要在分頁url中獲取(代碼19-25行),使用打包循環(huán)并且輸出給函數(shù)get_info()
"""
典型的分頁型網(wǎng)站——咪咕音樂榜
有時候運行會報錯,有時候正常,原因不知道
"""
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'
}
#獲取每一個歌曲的網(wǎng)址,參數(shù)是分頁url
def get_link(url):
html_data = requests.get(url, headers = headers)
soup = bs(html_data.text, 'lxml')#bs4推薦使用的的解析庫
#print(soup.prettify()) #標(biāo)準(zhǔn)化輸出url中的源代碼(有可能跟網(wǎng)頁查看中的不一致,網(wǎng)頁中有可能標(biāo)簽書寫不規(guī)范)以此為基礎(chǔ)抓取,如果抓取失敗,用此命令查看源代碼
links = soup.select('#js_songlist > div > div.song-name > span > a')#注意循環(huán)點!!!
ranks = soup.select('#js_songlist > div > div.song-number ')#因為歌曲詳情里沒有排名信息,因此需要在這部分獲取詳情信息
#print(ranks)
for rank, link in zip(ranks,links):#打包循環(huán),主要為了輸出配套的rank和link
rank = rank.get_text()
link = 'http://music.migu.cn' + link.get('href')#觀察每個歌曲的詳細網(wǎng)頁發(fā)現(xiàn),前面部分需要手動添加http://music.migu.cn
#print(rank,link)
get_info(rank,link)
#獲取每一個歌曲的詳細信息,排名、歌名、歌手和專輯名,參數(shù)url是每個歌曲的網(wǎng)址
def get_info(rank,url):
html_data = requests.get(url, headers = headers)
soup = bs(html_data.text, 'lxml')#bs4推薦使用的的解析庫
# print(soup.prettify()) #標(biāo)準(zhǔn)化輸出url中的源代碼(有可能跟網(wǎng)頁查看中的不一致,網(wǎng)頁中有可能標(biāo)簽書寫不規(guī)范)以此為基礎(chǔ)抓取,如果抓取失敗,用此命令查看源代碼
title = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.song-name > span.song-name-text')[0].string.strip()
# 用網(wǎng)頁copy過來的全部是“body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em”,但是使用這個爬不出來數(shù)據(jù)(我也不知道why),把body去掉或者用下面最簡短的方式(只使用最近的且唯一的div)
# title = soup.select('div.pho_info > h4 > em ')
# 查詢結(jié)果title格式是一維列表,需要繼續(xù)提取列表元素(一般就是[0]),列表元素是前后有標(biāo)簽需要繼續(xù)提取標(biāo)簽內(nèi)容,使用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() # 獲取標(biāo)簽的屬性值
#將詳細數(shù)據(jù)整理成字典格式
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) #構(gòu)造分頁url(不是歌曲詳情的url)
get_link(url)
time.sleep(1)
輸出結(jié)果:每次輸出data數(shù)據(jù)(字典型)字段順序是隨機的,因為本身字典型數(shù)據(jù)就沒有順序,如果想固定順序的話請使用列表
舉一反三:同類型的分頁型網(wǎng)站均可使用此爬蟲模板,例如豆瓣電影top100、時光網(wǎng)top榜之類的
ps:不知道這個榜單準(zhǔn)不準(zhǔn),反正我基本沒聽過(可能是我out了)
轉(zhuǎn)載于:https://juejin.im/post/5beeb62b518825741f62575b
總結(jié)
以上是生活随笔為你收集整理的python3爬取咪咕音乐榜信息(附源代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 资产和资本有什么区别 资产和资本的联系
- 下一篇: 绝地求生霸气中文名字