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()

 

 

 1 """
 2 典型的分頁型網站——咪咕音樂榜
 3 有時候運行會報錯,有時候正常,原因不知道
 4 """
 5 import requests
 6 from bs4 import BeautifulSoup as bs
 7 import time
 8 
 9 headers = {
10     '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'
11 }
12 
13 #獲取每一個歌曲的網址,參數是分頁url
14 def get_link(url):
15     html_data = requests.get(url, headers = headers)
16     soup = bs(html_data.text, 'lxml')#bs4推薦使用的的解析庫
17     #print(soup.prettify())   #標准化輸出url中的源代碼(有可能跟網頁查看中的不一致,網頁中有可能標簽書寫不規范)以此為基礎抓取,如果抓取失敗,用此命令查看源代碼
18     links = soup.select('#js_songlist > div > div.song-name > span > a')#注意循環點!!!
19     ranks = soup.select('#js_songlist > div > div.song-number ')#因為歌曲詳情里沒有排名信息,因此需要在這部分獲取詳情信息
20     #print(ranks)
21     for rank, link in zip(ranks,links):#打包循環,主要為了輸出配套的rank和link
22         rank = rank.get_text()
23         link = 'http://music.migu.cn' + link.get('href')#觀察每個歌曲的詳細網頁發現,前面部分需要手動添加http://music.migu.cn
24         #print(rank,link)
25         get_info(rank,link)
26 
27 #獲取每一個歌曲的詳細信息,排名、歌名、歌手和專輯名,參數url是每個歌曲的網址
28 def get_info(rank,url):
29     html_data = requests.get(url, headers = headers)
30     soup = bs(html_data.text, 'lxml')#bs4推薦使用的的解析庫
31     # print(soup.prettify())   #標准化輸出url中的源代碼(有可能跟網頁查看中的不一致,網頁中有可能標簽書寫不規范)以此為基礎抓取,如果抓取失敗,用此命令查看源代碼
32     title = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.song-name > span.song-name-text')[0].string.strip()
33 
34     # 用網頁copy過來的全部是“body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em”,但是使用這個爬不出來數據(我也不知道why),把body去掉或者用下面最簡短的方式(只使用最近的且唯一的div)
35     # title = soup.select('div.pho_info > h4 > em ')
36     # 查詢結果title格式是一維列表,需要繼續提取列表元素(一般就是[0]),列表元素是前后有標簽需要繼續提取標簽內容,使用get_text()或者string
37     singer = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.song-statistic > span > a')[0].string.strip()
38     cd = soup.select('div.container.pt50 > div.song-data > div.data-cont > div.style-like > div > span > a')[0].string.strip()  # 獲取標簽的屬性值
39 
40     #將詳細數據整理成字典格式
41     data = {
42         '排名':rank,
43         '歌名':title,
44         '歌手':singer,
45         '專輯':cd
46     }
47     print(data)
48 
49 
50 #程序主入口
51 if __name__=='__main__':
52     for number in range(1,3):
53         url = 'http://music.migu.cn/v2/music/billboard/?_from=migu&page={}'.format(number)   #構造分頁url(不是歌曲詳情的url)
54         get_link(url)
55         time.sleep(1)

 輸出結果:每次輸出data數據(字典型)字段順序是隨機的,因為本身字典型數據就沒有順序,如果想固定順序的話請使用列表

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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM