使用爬虫实现音乐下载
需要用到以下几点内容
- requests请求
- 文件操作
- 一点点正则表达式
首先,分析我们要爬取的网站,这里用到的是 好听轻音乐网,
- 第一步,选择任意一首歌点击加号,添加到列表。
2.第二步,多添加几首,打开开发者工具,播放下一首,会发现,network中多了一个5的资源包
3. 鼠标右键点击这个资源包,copy->copy link dress, 在新窗口中打开,发现这个就是那个音乐。
我这得到的是这个url地址,http://f2.htqyy.com/play7/55/mp3/5, 再切换另一首歌曲,得到http://f2.htqyy.com/play7/261/mp3/5。发现规律没有,http://f2.htqyy.com/play7/{ }/mp3/5 黑色背景部分为变动部分,其余不变,下面的任务就是找出每首歌对应的数字。
4.在首页,点击热播榜更多(这里举例)
发现这里有很多很多页,如果想把这几页都下载下来怎么办,打开开发者工具,点击第二页,发现network里多了一个资源包
鼠标右键点击这个资源包,copy->copy link dress, 在新窗口中打开,点击红色圈中的部分,然后点击歌名,可以看到 每首歌对应的数字 sid=‘4’例如水边的阿狄丽娜对应的是http://f2.htqyy.com/play7/4/mp3/5。得到了每首歌的url。
5. 得到每一页的url ,打开第二页的url为
http://www.htqyy.com/top/musicList/hot?pageIndex=1&pageSize=20
打开第一页的url为,
http://www.htqyy.com/top/musicList/hot?pageIndex=0&pageSize=20
得到通式:http://www.htqyy.com/top/musicList/hot?pageIndex={ }&pageSize=20
黑色部分为页码从0开始
通过以上分析,得知如果想下载音乐的话必须先找到其对应的url,然后再进行二进制文件的写操作
代码如下:
import re # python 的正则库
import requests # python 的requests库
songId = [] # 用来储存每首歌对应的数字
songName = [] # 用来储存每首歌的名字
# 这里先下载5页的歌曲
for n in range(0, 5):
# 字符串的格式化 n 代替 {}
url = 'http://www.htqyy.com/top/musicList/hot?pageIndex={}&pageSize=20'.format(n)
print(url, end='\n')
# 模拟浏览器请求,拿到html代码
html = requests.get(url)
# 用正则表达式捕获 数字, ()内为捕获的内容 .*? 为任何内容
resultId = re.findall('sid="(.*?)">', html.text)
# 用正则表达式捕获 歌名
resultName = re.findall('<a href=".*?" target="play" title="(.*?)" sid=".*?">', html.text)
# 存进数组
songId.extend(resultId)
songName.extend(resultName)
print(songId)
print(songName)
for m in range(0, len(songId)):
# 字符串的格式化 m 代替 {}
songUrl = 'http://f2.htqyy.com/play7/{}/mp3/5'.format(songId[m])
print(songUrl, end='\n')
print('正在下载第{}首。。。'.format(m+1))
# 得到返回资源的内容
response = requests.get(songUrl).content
# 以二进制的形式写入文件中
f = open('E:\\music\\{}.mp3'.format(songName[m]), 'wb')
f.write(response)
f.close()
有什莫疑问,咱们可以一起探讨,敬请留言