python音乐爬虫_Python爬虫实践 —— 4.好听音乐网轻音乐资源下载
第三章的requests库阶段性demo,爬取好听音乐网的榜上歌曲。
此网站没有js混淆,音乐资源链接有规律,适合爬虫新手上手。
首先观察首页和音乐榜的url链接关系,我们先手动模拟下载,chrome f12获取response,可探查到url规律如下:
1.
热播榜url为:
新曲榜url为:
由此可知hot、new、recommend、latest、gedan分别为各榜二级网址
2.再分析hot榜单内页码网址规律
可得url规律为:{index}榜第 i 页网址为 http://www.htqyy.com/top/musicList/{index}?pageIndex=(i-1)&pageSize=20
3.接着找下载链接规律
在试听界面点击试听按钮,f12刷新 network media会获得media音频response,statu code显示为206,说明歌曲get请求已缓存到disk,验证url规律为http://f2.htqyy.com/play7/sid/mp3/12,试听和下载url的关联关系,其中sid,也就是歌曲名为主键,所以我们从音乐榜页码页获得的sid可以传入下载地址中,拼接获得下载地址,/mp3/12为固定字符串
其后我在运行爬虫的时候发现部分资源会401,找到对应的sid页面,f12排查,发现下载地址并不唯一,按mp3和m4a文件类型分别有两个地址:
http://f2.htqyy.com/play7/{sid}/mp3/12 和 http://f2.htqyy.com/play7/{sid}/m4a/12
实际运行爬虫的时候,我们会发现经常有歌曲无法200正常下载,或者401或者抛出异常我自己分析的话,这有两种原因,
1.mp3格式url网址无效,需切换m4a网址下载
2.请求时间间隔太短,应设置1-2s,以防因为延迟和服务器原因无法正常爬取。
此demo主要考察python和程序设计基本功,requests库的应用较少,由此也发现异常处理、网址拼接、f12工具的使用、性能和代码质量考核等因素在爬虫设计时是非常重要的,由此也看出一个设计优异的爬虫框架对实际业务来说是非常重要的,连续爬取、防封、分布式爬取,提高性能门槛也是必须的业务要求,爬虫随便几个demo写完看似很简单,但是简单的事如何做的有质量也是不简单的。
具体代码如下:
#SweetLightSpider
import re #python 的正则库
import requests #python 的requests库
importtimeimport random #随机选择
from requests import exceptions #requests 内置exception
classSweetLightMusicSpider:def __init__(self, page):
self.page=page#随机获取音乐榜单的网页信息text数据,取得songID准备为后续url拼接,获得songName获得歌曲名
def __getSong(self):
songID=[]
songName=[]
keyword= ["hot", "new", "recommend", "latest", "gedan"]
rankform=random.choice(keyword)print(rankform)for i inrange(0, self.page):
url= "http://www.htqyy.com/top/musicList/"+str(rankform)+"?pageIndex="+str(i)+"&pageSize=20"
#获得带有音乐id和name的信息的html文本
html =requests.get(url)
strr=html.text#正则匹配筛选信息
pat1 = r'title="(.*?)" sid'pat2= r'sid="(.*?)"'id_list=re.findall(pat2, strr)
title_list=re.findall(pat1, strr)#获得songID/Name数组
songID.extend(id_list)
songName.extend(title_list)returnsongID, songNamedef __songdownload(self):
song_list= SweetLightMusicSpider.__getSong(self)for x inrange(0, len(song_list[0])):
song_url= "http://f2.htqyy.com/play7/"+str(song_list[0][x])+"/"+"mp3"+"/12"song_name= song_list[1][x]
response=requests.get(song_url)print(response.status_code)
data=response.contentif response.status_code == 200:print("正在下载第{0}首, 歌曲名为:《{1}》".format(x+1, song_name))
with open("E:\\music\\{}.mp3".format(song_name), "wb") as f:
f.write(data)print("第{0}首: 《{1}》 已下载完毕".format(x+1, song_name))elif response.status_code == 401:
time.sleep(2)print("重定向资源中")
song_url2= "http://f2.htqyy.com/play7/"+str(song_list[0][x])+"/"+"m4a"+"/12"response2=requests.get(song_url2)print(response2.status_code)try:assert response2.status_code == 200
exceptexceptions.HTTPError as e:print(e)continue
else:
data2=response2.contentprint("正在下载第{0}首, 歌曲名为:《{1}》".format(x + 1, song_name))
with open("E:\\music\\{}.mp3".format(song_name), "wb") as f:
f.write(data2)print("第{0}首: 《{1}》 已下载完毕".format(x + 1, song_name))
time.sleep(1)defmusic_Spider(self):
SweetLightMusicSpider.__songdownload(self)if __name__ == '__main__':
i= SweetLightMusicSpider(10)
i.music_Spider()
设置两个请求间隔为1s,重定向url为2s,调试如下,基本杜绝了
1.无法获取到的歌曲 2.下载错误为十几KB无法打开的歌曲 这两个运行异常bug
最后牺牲了部分爬取效率获得了爬取质量的提高:
最后检查E盘的音乐下载情况,没有下载错误,文件大小均在1-3mb,不存在音乐无法打开的情况
随便打开一首网易云播放器验证下:
没有问题,bingo。因为是轻音乐网站嘛,faded的纯乐器版。。。。。。i am faded >_<
python音乐爬虫_Python爬虫实践 —— 4.好听音乐网轻音乐资源下载相关推荐
- Python学习路线2023升级版(课程大纲+视频教程+网盘资源下载)
2023最新Python全栈+人工智能学习路线升级版 全面涵盖前端.后端.爬虫.数据挖掘.人工智能等课程(课程大纲+视频教程+网盘资源下载)! 学习路线四大亮点: 1.人工智能三大主流框架全覆盖 2. ...
- python教程2019全套-Python学习路线2019升级版(课程大纲+视频教程+网盘资源下载)...
2019最新Python全栈+人工智能学习路线升级版 全面涵盖前端.后端.爬虫.数据挖掘.人工智能等课程(课程大纲+视频教程+网盘资源下载)! 学习路线四大亮点: 1.人工智能三大主流框架全覆盖 2. ...
- python教程视频 网盘-Python学习路线2019版(课程大纲+视频教程+网盘资源下载)...
2019最新Python全栈+人工智能学习路线升级版 全面涵盖前端.后端.爬虫.数据挖掘.人工智能等课程(课程大纲+视频教程+网盘资源下载)! 学习路线四大亮点: 1.人工智能三大主流框架全覆盖 2. ...
- Python学习路线2019升级版(课程大纲+视频教程+网盘资源下载)
2019最新Python全栈+人工智能学习路线升级版 全面涵盖前端.后端.爬虫.数据挖掘.人工智能等课程(课程大纲+视频教程+网盘资源下载)! 学习路线四大亮点: 1.人工智能三大主流框架全覆盖 2. ...
- python爬音乐网站_python爬虫-爬取高逼格音乐网站《落网》
关于 落网,一个高逼格的音乐网站,是很多文艺青年经常逛的网站.经常下载落网音乐到本地,一首一首的下载十分的痛苦.最近刚好在学习python爬虫的东西,刚好把落网音乐的爬取当做一个练习项目来实践(IT从 ...
- python pipeline框架_Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法...
原博文 2017-07-17 16:39 − 当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的pytho ...
- python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫
什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...
- monthy python爬虫_Python爬虫DOTA排行榜爬取实例(分享)
Python爬虫DOTA排行榜爬取实例(分享) 1.分析网站 打开开发者工具,我们观察到排行榜的数据并没有在doc里 doc文档 在Javascript里我么可以看到下面代码: ajax的post方法 ...
- python jsonpath库_Python爬虫(十六)_JSON模块与JsonPath
本篇将介绍使用,更多内容请参考:Python学习指南 数据提取之JSON与JsonPATH JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是的人们很容易 ...
- python网页结构分析_Python爬虫解析网页的4种方式 值得收藏
用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...
最新文章
- C#利用Graphics类绘制进阶--实现图片等比例缩放
- 数论初步——同余与模算术
- Oracle rowid
- 在BurpSuite中安装Jython环境
- Java枚举getDeclaringClass()方法与示例
- 正则表达式 re模块
- 异构服务器的负载均衡及过载保护
- 在线ASCII艺术字,Spring Boot banner生成工具
- 清华计算机系超算团队,清华大学学生超算团队
- Linux-Shell脚本教学
- 微信支付宝无现金之争:瞄准用户支付大数据
- java生成条形码~~使用barcode4j在线生成条形码
- AutoJs学习-多点取色
- 易语言 查询API之文本和字体函数
- 无线路由器dhcp服务器连接失败,TP-Link路由器桥接提示“获取IP地址失败,请检查DHCP是否开启”怎么办...
- 使用EFI安装win7-64位,在不能使用U盘的情况下
- 【产业互联网周报】外媒:英特尔等公司暂停向俄罗斯发货;阿里云季度营收195亿元;第四范式再次提交上市申请...
- 字体在其他浏览器正常在IE8显示字体模糊问题解决
- StackWalker 堆栈打印
- android 耳机监听权限,android 耳机监听