zoukankan      html  css  js  c++  java
  • 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了)

  • 相关阅读:
    apache多端口映射
    mark
    一些注册表值
    jsp URL中文处理的几种方式
    【引用】雨林木风Ghost XP SP3系统
    CentOS常用命令
    查看ie8临时文件夹
    卡塔兰数
    大数问题
    不会做的题目
  • 原文地址:https://www.cnblogs.com/aby321/p/9956949.html
Copyright © 2011-2022 走看看