importrequests,os,time,sys,reimporturllib.requestimportrequestsfrom bs4 importBeautifulSoupimportosfrom scrapy.selector importSelectorclasswangyiyun():def __init__(self):

self.headers={‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36‘,‘Referer‘: ‘http://music.163.com/‘}

self.main_url=‘http://music.163.com/‘self.session=requests.Session()

self.session.headers=self.headers

self.song_list={}defget_songurls(self,playlist,long):‘‘‘进入所选歌单页面,得出歌单里每首歌各自的ID 形式就是“song?id=64006"‘‘‘url=self.main_url+‘playlist?id=%d‘%playlist

re= self.session.get(url) #直接用session进入网页

sel=Selector(text=re.text) #用scrapy的Selector,懒得用BS4了

songurls=sel.xpath(‘//ul[@class="f-hide"][email protected]‘).extract()

songurls= songurls[:long] #这里我只选取了列表的前long个元素

return songurls #所有歌曲组成的list

##[‘/song?id=64006‘, ‘/song?id=63959‘, ‘/song?id=25642714‘, ‘/song?id=63914‘, ‘/song?id=4878122‘, ‘/song?id=63650‘]

defget_songinfo(self,songurl):‘‘‘根据songid进入每首歌信息的网址,得到歌曲的信息

return:‘64006‘,‘陈小春-失恋王‘‘‘url=self.main_url+songurl

re=self.session.get(url)

sel=Selector(text=re.text)

song_id= url.split(‘=‘)[1]

song_name= sel.xpath("//em[@class=‘f-ff2‘]/text()").extract_first()

singer= ‘&‘.join(sel.xpath("//p[@class=‘des s-fc4‘]/span/a/text()").extract())

songname=singer +‘-‘+song_name

b=[‘\\‘,‘/‘,‘:‘,‘*‘,‘?‘,‘"‘,‘‘,‘"‘]for x inb:if x insongname:

songname=songname.replace(x,‘‘)returnstr(song_id),songnamedefdownload_song(self, i, songurl, dir_path):‘‘‘根据歌曲url,下载mp3文件‘‘‘

try:

song_id, songname= self.get_songinfo(songurl) #根据歌曲url得出ID、歌名

song_url = ‘http://music.163.com/song/media/outer/url?id=%s.mp3‘%song_id

path= dir_path + os.sep + songname + ‘.mp3‘ #文件路径

ifos.path.exists(path):print(str(i), songname+‘exists!‘,sep=‘.‘)else:

song=requests.get(song_url,headers =self.headers)

with open(path,‘wb‘) as f: #下载文件

print(str(i),songname+‘.mp3‘,sep=‘.‘)

f.write(song.content)

self.song_list[i]=pathexceptException as error_info:print(‘Error! =======‘ +songname)pass

deffileSize(self):"""判断下载下来的文件的大小,如果太小,就删掉。"""

for num inself.song_list:

file=self.song_list[num]

fsize=os.path.getsize(file)

f_kb= fsize/float(1024)if f_kb < 1024:

os.unlink(file)print(str(num),file.split(‘\\‘)[-1] + ‘Small than 1M. Has been deleted.‘,sep=‘.‘)defwork(self, playlist,long,path):

songurls= self.get_songurls(playlist,long) #输入歌单编号,得到歌单所有歌曲的url

i = 1

for songurl insongurls:

self.download_song(i,songurl, path)#下载歌曲

i += 1self.fileSize()if __name__ == ‘__main__‘:

long= int(input("How many songs do you want to download?\n"))

path= r‘D:\备份\新建文件夹‘d=wangyiyun()

d.work(400931460,long,path) #400931460是网页版歌单网址中 id 后面的参数

python下载mp3文件_Python 下载Mp3相关推荐

  1. python 打开word文件_python下载word文件-Python用python-docx读写word文档

    备注: doc是微软的专有的文件格式,docx是Microsoft Office2007之后版本使用,其基于Office Open XML标准的压缩文件格式,比 doc文件所占用空间更小.docx格式 ...

  2. Linux命令行下载大文件,下载Onedrive文件

    Linux命令行下载大文件,下载Onedrive文件 做深度学习实验时,经常会遇到下载数据集,下载到本地又上传到Linux服务器上,这时用rz上传会很慢,在网上找到一些方法,用curl下载One-dr ...

  3. GitHub:如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细攻略(图文教程)

    GitHub:如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细攻略(图文教程) 目录 如何从GitHub上下载文件 1.下载整个项目文件 T1.点击download ZIP直接下 ...

  4. python软件在下载库文件_python – 并行下载多个文件的库或工具

    我正在寻找一个python库或一个命令行工具来并行下载多个文件.我目前的解决方案是顺序下载文件缓慢.我知道你可以很容易地在python中编写一个半条线程的线程解决方案,但是在使用线程时总是遇到麻烦的问 ...

  5. python多线程下载大文件_Python threading多线程断点下载文件的方法

    这是玩蛇网一篇关于Python多线程下载文件方法的代码实例.文中应用到的python模块和方法有httplib.Python urllib2.Python threading多线程模块.python ...

  6. python下载加密视频_Python下载未加密的m3u8文件(流媒体文件)

    很多时候我们用手机浏览器缓存视频时发现缓存下来的文件后缀是.m3u8格式的,按文件目录找过去发现是一个几十K大小的系统不可读的文件,那我们缓存下来的文件去哪儿了呢? 其实.m3u8文件就相当于一个协议 ...

  7. 用python写一个文件管理程序下载_Python管理文件神器 os.walk

    原标题:Python管理文件神器 os.walk 来自:CSDN,作者:诡途 [导语]:有没有想过用python写一个文件管理程序?听起来似乎没思路?其实是可以的,因为Python已经为你准备好了神器 ...

  8. Python requests下载超大文件/批量下载文件

    (一)下载超大文件: 使用 python 下载超大文件,直接全部下载,文件过大,可能会造成内存不足,这时候要使用 requests 的 stream 模式 主要代码如下 iter_content:一块 ...

  9. python读取手机文件_python 读取 网络 文件

    Python之pandas数据加载.存储 Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 ...

最新文章

  1. DRF序列化和反序列化
  2. Product Orders(生产订单)状态相关函数BAPI
  3. sudo: unable to resolve host ubuntu提示的解决
  4. 包邮送书 50 本,你还有什么理由不上进?
  5. 初识斯蒂尔杰斯积分(Stieltjes integral)
  6. 标准化(Normalization)和归一化实现
  7. 破格晋升!一批高校教师脱颖而出
  8. C#技术点--修改系统时间
  9. html表格编辑器退出编辑状态,易优后台编辑器取消html标签(比如表格属性等)过滤解决方法...
  10. PouchDB 基础
  11. javascript高级程序设计pdf(JavaScript高级程序设计PDF版)
  12. J2EE学习总结(五)------用户登录界面设计
  13. CATIA V6二次开发——宏应用
  14. 计算机国际期刊等级,计算机期刊等级(全)
  15. 200多个JS小技巧
  16. Lambda表达式的一些相关知识理解
  17. 关于开机USB电涌15秒关机的另类解决方法
  18. Python安装PEP8
  19. 基于多目标优化方法的电梯零部件预防性维修期决策
  20. es是什么意思java_Elasticsearch----java操作ES

热门文章

  1. 一图读懂国家标准GB/T 42012-2022《信息安全技术 即时通信服务数据安全要求》
  2. jquery插件chosen多选时排序问题
  3. jlink 下载uboot到norflash
  4. 阿里云账号实名认证、域名实名认证和域名备案有什么区别呢?
  5. 汽车零部件企业数字工厂管理系统建设方案
  6. 由九天创合资本及OnFund向上基金联合主办的链•全球区块链投资机构系列酒会第一站在上海顺利举办
  7. redis - set key value [expiration EX seconds|PX milliseconds] [NX|XX]
  8. 动网论坛 上传文件类型
  9. Any fool can do it (递归)
  10. ensp模拟器下简单ospf配置