python最简单的方法爬取唱吧歌曲

本文介绍了如何使用Python的requests和BeautifulSoup库爬取唱吧用户主页的歌曲信息,通过解析HTML找到歌曲列表和歌曲ID,进而下载MP3文件。尽管当前方法存在限制,仅能爬取部分数据,但文章提供了进一步优化的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一个python爬虫–爬取唱吧歌曲

介绍:

  1. 最近刚开始学python做网页爬虫,试着写了一个简单的爬虫项目,用最简单的requests和Beautifulsoup实现。
  2. 唱吧支持导出歌曲,但需要money,网页版在线听只能点一首听一首,所以想通过爬虫将歌曲音频下载到本地
  3. 目标:尽可能多的爬取我的主页中的歌曲,下载保存到本地

实现步骤:

  1. 唱吧网页版,直接搜索用户名,来到用户主页,接下来我们就爬去该页的歌曲。
    在这里插入图片描述

    import requests
    from bs4 import BeautifulSoup
    import time
    
    url = 'http://changba.com/u/58505259'
    
    user_agent = 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36'
    
    res = requests.get(url, user_agent)
    soup = BeautifulSoup(res.text, 'html.parser')
    
  2. 分析网页

    1. F12 打开源代码检查,在elements标签中先找到一条记录

    2. 可以看到很容易找到了,并且下面很多并列的 li 标签保存正是下面的其他歌曲
      在这里插入图片描述

    3. 先找到他们的最小级共同父标签,接着查找所有的 li 标签

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7bvoqFAU-1605283375299)(/Users/freewong/Library/Application Support/typora-user-images/image-20201113232943167.png)]

    4. 遍历每个 list 标签,获取歌曲信息:获取到歌曲播放页的url 和 歌曲名

      work_list = soup.find('div', class_='userPage-tab-content userPage-tab-active-content')
      song_lists = work_list.find_all('li')
      for song in song_lists:
          # 找到歌曲播放页面的url
          song_url = song.find('a')['href']
          song_url = 'http://changba.com' + song_url
          song_name = song.find('a').text[7:-29]
      
    5. 继续爬取播放页的url

      在这里插入图片描述

      图中audio标签后面跟的url其实就是歌曲的源文件链接,就是要得到的东西,但测试发现并不能直接爬到它

      观察其组成,发现是固定的url + 歌曲的id + ‘.mp3’ 组成,因此选择获取歌曲的 id 再组出url

    6. 获取歌曲id

      # 跳转到歌曲播放页面
      res_song = requests.get(song_url, user_agent)
      soup_song = BeautifulSoup(res_song.text, 'html.parser')
      # 找到歌曲的id
      try:
          data_id = soup_song.find('body')['data-workid']
      except Exception as e:
          print('下载失败', e)
          continue
      
    7. 组出歌曲音频文件的url,再去爬去该url的二进制数据,直接保存到本地文件即可

      res_source_song = requests.get(source_url_song, user_agent)
              if res_source_song.status_code == 200:
                  with open('./song/lxt' + song_name + '.mp3', 'wb') as song_f:
                      song_f.write(res_source_song.content)
                  print(song_name + ' 下载成功')
                  time.sleep(1)
              else:
                  print('下载失败')
      

结果展示

在这里插入图片描述

总结:

以上是我最简单的方法爬取唱吧歌曲的过程,目前只能爬取到有限的数据,具有以下两点明显的缺陷:
1. 只能爬取到首页默认显示的20首歌曲
2. 不是所有的歌曲源文件的url 都是由 固定的url + 歌曲的id + '.mp3’组成
下篇文章介绍了如何解决这两个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值