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

介绍:

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

实现步骤:

  1. 唱吧网页版,直接搜索用户名,来到用户主页,接下来我们就爬去该页的歌曲。
    python最简单的方法爬取唱吧歌曲-编程知识网

    import requests
    from bs4 import BeautifulSoup
    import timeurl = '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 标签保存正是下面的其他歌曲
      python最简单的方法爬取唱吧歌曲-编程知识网

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

      python最简单的方法爬取唱吧歌曲-编程知识网

    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:# 找到歌曲播放页面的urlsong_url = song.find('a')['href']song_url = 'http://changba.com' + song_urlsong_name = song.find('a').text[7:-29]
      
    5. 继续爬取播放页的url

      python最简单的方法爬取唱吧歌曲-编程知识网

      图中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('下载失败')
      

结果展示

python最简单的方法爬取唱吧歌曲-编程知识网

总结:

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