python3.4爬虫批量下载音乐

2024-01-26 03:30

本文主要是介绍python3.4爬虫批量下载音乐,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      最近在学习python,使用的版本为python3.4,开发环境为使用Pydev插件的eclipse。正好觉得http://www.dexiazai.com/?page_id=23上的音乐不错,决定使用python批量下载下来。

     1、音乐地址

     经过分析,页面嵌入的虾米播放器中的地址如下,后面以逗号分隔的字符为音乐的id,如音乐的地址为http://www.xiami.com/song/2088578

   

<span style="font-size:14px;"><span style="font-size:14px;">   <embed src="http://www.xiami.com/widget/0_2088578,163414,603408,1769697211,1519594,1944911,1769482546,1771498226,2050705,1769213208,2957497,1769779902,1769897948,1770077250,1771638197,109133,1769220090,3469026,2456779,3673869,385167,1769528393,1770130506,1014582,3418745,1769554460,1769692638,1279925,1769582513,136064,1769528375,1769455237,1769075782,2095209,1770618381,3427512,2108249,1771186364,2087541,1769384565,1770432131,2149137,2083819,1768911382,3429194,2089207,1770177060,1770427913,1769279049,2089339,2085205,3437055,3646041,2070983,2070741,3619123,1770068122,2082956,2071004,1768679,1769683697,3567557,109133,1769572701,2152946,3489617,1770292731_235_346_FF8719_494949_1/multiPlayer.swf" type="application/x-shockwave-flash"width="235" height="320" wmode="opaque"></embed></span></span>

     经过分析知,可在http://www.xiami.com/song/playlist/id/2088578/object_name/default/object_id/0中查询音乐的xml信息,其中location是经过加密的源地址,通过解密后可得到正确的地址。之中具体的操作可参考《python爬取虾米音乐》这篇博客。


      2、获取所有音乐的id,形成列表

   

<span style="font-size:14px;"><span style="font-size:14px;">    dexiazai_url="http://www.dexiazai.com/?page_id=23"req=urllib2.Request(dexiazai_url, headers={'Connection': 'Keep-Alive','Accept': 'text/html, application/xhtml+xml, */*','Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3','User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'})response=urllib2.urlopen(req)content=response.read().decode('utf-8')pattern=re.compile('<embed.*?src="http://www.xiami.com/widget/0_(.*?)/multiPlayer.swf"',re.S)ids=re.search(pattern,content).group(1)idarr=ids.split(",")</span></span>

     3、获取音乐名称(加上序号)

    

<span style="font-size:14px;"><span style="font-size:14px;">        url="http://www.xiami.com/song/"+str(idarr[i])print("==================num: "+str(i)+"=======================")print(url)   #获取歌词名req=urllib2.Request(url, headers={'Connection': 'Keep-Alive','Accept': 'text/html, application/xhtml+xml, */*','Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3','User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'})rep=urllib2.urlopen(req)cont=rep.read().decode('utf-8')pat=re.compile('<div.*?id="title">(.*?)</h1>', re.S)fname=re.search(pat,cont).group(1)fname=fname.strip().lstrip().rstrip().replace('<h1>','')#J'Ai Deux Amours转码为J'Ai Deux Amoursfname=html.parser.unescape(fname)fname=fname.split("<a target")[0]fname=str(i+1)+"_"+fname4、附上所有代码</span><pre name="code" class="html"><span style="font-size:14px;"># -*- coding: utf-8 -*-import re
import urllib.request as urllib2
import html.parserclass XiamiDownload(object):"""虾米音乐下载"""def __init__(self, url_song):""" 初始化,得到请求xml和加密的下载地址 """self.url_song = url_song       self.url_xml = self.__get_xml()self.info = self. __get_info()self.url_location = self.info[0]self.lyc = self.info[1]self.pic = self.info[2]def __get_xml(self):""" 得到请求的 xml 地址 """return 'http://www.xiami.com/song/playlist/id/%s/object_name/default/object_id/0' % re.search('\d+', self.url_song).group()def __get_info(self):""" 伪装浏览器请求,处理xml,得到 加密的 location """headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}req = urllib2.Request(url = self.url_xml,headers = headers)try:xml = urllib2.urlopen(req).read().decode('utf-8')#print("xml:"+xml)pattern_location=re.compile('<location>(.*?)</location>',re.S)location = re.search(pattern_location, xml).group(1)#print("location:"+location)lyc_location=re.compile('<lyric>(.*?)</lyric>',re.S)lyc = re.search(lyc_location, xml).group(1) pic_location=re.compile('<pic>(.*?)</pic>',re.S)pic = re.search(pic_location, xml).group(1) return (location, lyc, pic)except:return("exception","exception","exception")def get_url(self):""" 解密 location 获得真正的下载地址 """strlen = len(self.url_location[1:])rows = int(self.url_location[0])cols = strlen // rowsright_rows = strlen % rowsnew_str = self.url_location[1:] url_true = ''#print(strlen)                    for i in range(strlen):x = i % rowsy = i / rowsp = 0if x <= right_rows:p = x * (cols + 1) + yelse:p = right_rows * (cols + 1) + (x - right_rows) * cols + y#print(p)url_true += new_str[int(p)]#print(url_true)return urllib2.unquote(url_true).replace('^', '0')if __name__ == '__main__':dexiazai_url="http://www.dexiazai.com/?page_id=23"req=urllib2.Request(dexiazai_url, headers={'Connection': 'Keep-Alive','Accept': 'text/html, application/xhtml+xml, */*','Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3','User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'})response=urllib2.urlopen(req)content=response.read().decode('utf-8')pattern=re.compile('<embed.*?src="http://www.xiami.com/widget/0_(.*?)/multiPlayer.swf"',re.S)ids=re.search(pattern,content).group(1)idarr=ids.split(",")for i in range(len(idarr)-1):url="http://www.xiami.com/song/"+str(idarr[i])print("==================num: "+str(i)+"=======================")print(url)   #获取歌词名req=urllib2.Request(url, headers={'Connection': 'Keep-Alive','Accept': 'text/html, application/xhtml+xml, */*','Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3','User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'})rep=urllib2.urlopen(req)cont=rep.read().decode('utf-8')pat=re.compile('<div.*?id="title">(.*?)</h1>', re.S)fname=re.search(pat,cont).group(1)fname=fname.strip().lstrip().rstrip().replace('<h1>','')#J'Ai Deux Amours转码为J'Ai Deux Amoursfname=html.parser.unescape(fname)fname=fname.split("<a target")[0]fname=str(i+1)+"_"+fnameprint("歌曲名为: "+fname+"  开始下载")xi = XiamiDownload(url)if xi.url_location=="exception":continueurl_download = xi.get_url()url_pic = xi.picurl_lyc = xi.lycprint ('下载地址是: ' +url_download)try:urllib2.urlretrieve(url_download, fname+'.mp3')urllib2.urlretrieve(url_pic, fname+'.jpg')urllib2.urlretrieve(url_lyc, fname+'.lyc')except:continueprint ("完成下载...")</span></span>


   5、效果



       


          6、使用cx_Freeze打包发布exe

         因为python3.4在py2exe或者pyinstaller发布有点问题(不支持),所以用cx_Freeze发布,cx_Freeze的下载地址为http://www.lfd.uci.edu/~gohlke/pythonlibs/#cx_freeze 我下载的是Cython‑0.22‑cp34‑none‑win32.whl,是python3.4的安装目录下使用py3.4 install D:\****\Cython‑0.22‑cp34‑none‑win32.whl安装。

         然后在python3.4的安装目录下\Lib\site-packages\cx_Freeze\samples\PyQt4中将setup.py拷贝出来再编辑将里面的安装文件名称指定为要发布的文件,然后在命令行执行python setup.py build 命令,则生成build文件夹,里面有可执行文件xiami_download_dexiazai.exe

         

        

   



这篇关于python3.4爬虫批量下载音乐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/jrn1012/article/details/45747787
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/645509

相关文章

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Python自动化批量重命名与整理文件系统

《Python自动化批量重命名与整理文件系统》这篇文章主要为大家详细介绍了如何使用Python实现一个强大的文件批量重命名与整理工具,帮助开发者自动化这一繁琐过程,有需要的小伙伴可以了解下... 目录简介环境准备项目功能概述代码详细解析1. 导入必要的库2. 配置参数设置3. 创建日志系统4. 安全文件名处

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置