python3爬虫下载音乐_python3.4爬虫批量下载音乐

本文介绍了一位使用Python3.4和Eclipse的开发者如何爬取并下载http://www.dexiazai.com/?page_id=23网站上的音乐。通过分析虾米音乐播放器地址,提取音乐ID,利用正则表达式和HTTP请求获取音乐信息,并解密加密的音乐地址,最终实现批量下载。此外,还提到了使用cx_Freeze将脚本打包成exe文件的方法。
摘要由CSDN通过智能技术生成

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

1、音乐地址

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

width="235" height="320" wmode="opaque">

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

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

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('

ids=re.search(pattern,content).group(1)

idarr=ids.split(",")

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

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('

(.*?)', re.S)

fname=re.search(pat,cont).group(1)

fname=fname.strip().lstrip().rstrip().replace('

','')

#J'Ai Deux Amours转码为J'Ai Deux Amours

fname=html.parser.unescape(fname)

fname=fname.split("

fname=str(i+1)+"_"+fname

4、附上所有代码

# -*- coding: utf-8 -*-

import re

import urllib.request as urllib2

import html.parser

class 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('(.*?)',re.S)

location = re.search(pattern_location, xml).group(1)

#print("location:"+location)

lyc_location=re.compile('(.*?)',re.S)

lyc = re.search(lyc_location, xml).group(1)

pic_location=re.compile('(.*?)',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 // rows

right_rows = strlen % rows

new_str = self.url_location[1:]

url_true = ''

#print(strlen)

for i in range(strlen):

x = i % rows

y = i / rows

p = 0

if x <= right_rows:

p = x * (cols + 1) + y

else:

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('

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('

(.*?)', re.S)

fname=re.search(pat,cont).group(1)

fname=fname.strip().lstrip().rstrip().replace('

','')

#J'Ai Deux Amours转码为J'Ai Deux Amours

fname=html.parser.unescape(fname)

fname=fname.split("

fname=str(i+1)+"_"+fname

print("歌曲名为: "+fname+" 开始下载")

xi = XiamiDownload(url)

if xi.url_location=="exception":

continue

url_download = xi.get_url()

url_pic = xi.pic

url_lyc = xi.lyc

print ('下载地址是: ' +url_download)

try:

urllib2.urlretrieve(url_download, fname+'.mp3')

urllib2.urlretrieve(url_pic, fname+'.jpg')

urllib2.urlretrieve(url_lyc, fname+'.lyc')

except:

continue

print ("完成下载...")

5、效果

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值