第一个python爬虫–爬取唱吧歌曲
介绍:
- 最近刚开始学python做网页爬虫,试着写了一个简单的爬虫项目,用最简单的requests和Beautifulsoup实现。
- 唱吧支持导出歌曲,但需要money,网页版在线听只能点一首听一首,所以想通过爬虫将歌曲音频下载到本地
- 目标:尽可能多的爬取我的主页中的歌曲,下载保存到本地
实现步骤:
-
唱吧网页版,直接搜索用户名,来到用户主页,接下来我们就爬去该页的歌曲。
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')
-
分析网页
-
F12 打开源代码检查,在elements标签中先找到一条记录
-
先找到他们的最小级共同父标签,接着查找所有的 li 标签
-
遍历每个 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]
-
继续爬取播放页的url
图中audio标签后面跟的url其实就是歌曲的源文件链接,就是要得到的东西,但测试发现并不能直接爬到它
观察其组成,发现是固定的url + 歌曲的id + ‘.mp3’ 组成,因此选择获取歌曲的 id 再组出url
-
获取歌曲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
-
组出歌曲音频文件的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’组成
下篇文章介绍了如何解决这两个问题。