最近在学习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、效果

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爬虫下载音乐_python3.4爬虫批量下载音乐相关推荐

  1. python怎么批量下载年报_使用Python批量下载Wind数据库中的PDF报告

    原标题:使用Python批量下载Wind数据库中的PDF报告 背景 最近小编出于工作需要,准备在Wind金融数据终端批量下载上市公司2019年第一季度业绩预告.通过相关的条件检索,发现其相关数据有近百 ...

  2. [Windows] 哔哩下载姬—B站视频批量下载

    哔哩下载姬 简介:哔哩下载姬是一款下载哔哩哔哩视频的免费软件.适用:windows系统文件大小:18.7 MB 特点: 1.无需登录即可下载. 2.可以多线程,多任务同时下载.(最高支持10线程,10 ...

  3. 自媒体批量下载短视频软件,批量下载短视频有诀窍

    自媒体批量下载短视频软件,批量下载短视频有诀窍,现在随着短视频的爆火,越来越多的自媒体人和公司都注意到短视频这个平台流量有多大,短视频很容易变现也很容易引流,接下来我们来看看自媒体批量下载短视频软件有 ...

  4. vue-qr 二维码 添加logo 下载单个二维码 批量下载二维码并打包

    使用 vue-qr 生成二维码并可以添加logo 逻辑: 1.下载二维码生成插件 这里用的是qrcode 2.下载二维码 使用html2canvas(其实解释一个截图工具)将标签截图并下载下来 3. ...

  5. python爬微信公众号视频_python爬虫公众号所有信息,并批量下载公众号视频

    之前写过一篇类似的文章:python爬取公众号,用最简单的方式爬虫 还有同学一直在问,可能中间有一些小细节不明确,这次彻底明确一下细节. 本篇添加一个批量下载公众号内视频的功能,可以实现完全复制一个公 ...

  6. python爬虫公众号所有信息,并批量下载公众号视频

    之前写过一篇类似的文章:python爬取公众号,用最简单的方式爬虫 还有同学一直在问,可能中间有一些小细节不明确,这次彻底明确一下细节. 本篇添加一个批量下载公众号内视频的功能,可以实现完全复制一个公 ...

  7. python壁纸数据抓取_python爬虫系列之 xpath实战:批量下载壁纸

    一.前言 在开始写爬虫之前,我们先了解一下爬虫 首先,我们需要知道爬虫是什么,这里直接引用百度百科的定义网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照 ...

  8. python批量下载bilibili视频_如何批量下载bilibili的视频?

    貌似现在 you-get 已经支持批量下载了.通过下面命令就可以批量下载了 you-get --playlist 网址 本来是带这个需求来的,看到 Venchi 的答案,装了 Python3 之后发现 ...

  9. 用python批量下载网络图片_使用python批量下载图片吗?怎么做?

    没想到吧,我们居然可以用python去下载图片,关于单个下载内容,之前已经出了教程告诉大家,大家应该都知道,图片跟文字似的,经常多个发布,我们如果想得到很多个图片,还得一个代码或者一个图片源的去敲击吗 ...

  10. python 批量下载 代码_Python + Selenium +Chrome 批量下载网页代码修改

    Python + Selenium +Chrome 批量下载网页代码修改 主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt 来达到在登陆状态下 批量打开并下载网 ...

最新文章

  1. 最初的梦想,将来的你一定会感谢现在努力的自己
  2. python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器
  3. 以太坊联合创始人发明了新语言叫板Vyper,主链之后语言将引领新一轮大战?...
  4. 《敏捷企业》作者访谈录
  5. SpringSecurity权限控制之异常处理方式三
  6. 利用矩阵的n次方求图的连通性
  7. Linux内核程序的编译:模块化编译
  8. ETL学习总结(1)——ETL 十大功能特性详解
  9. C++ operator关键字(重载操作符)(转)
  10. 装hadoop引发的一系列事件
  11. 各种常见排序算法的时间/空间复杂度 是否稳定 算法选取的情况 改进 思维导图整理
  12. Linux安装软件的三种方式
  13. 天才黑客,阿里安全科学家吴翰清:做对事只能赢一场,跟对人可以赢一生!...
  14. Ckplayer视频播放器使用方法介绍
  15. The APR based Apache Tomcat Native library which allows optimal performance in production
  16. Windows Service 创建与安装
  17. Python -- 限流 throttle
  18. 创造历史后的2008年中国股市
  19. 如何查看是否有清华源/删除清华源,保留默认源
  20. php设计模式-中级

热门文章

  1. c语言某年某月某日的天数,输入某年某月某日,判断这一天是这一年的第几天...
  2. 用Python做一个美丽的每日计划
  3. linux下无线网卡做热点,用ArchLinux做wifi热点无线路由
  4. 无线网络共享有线计算机,win10怎么把有线网络变成无线_win10如何共享有线网络为无线热点...
  5. 分析保镖人才网网站优化与搜索引擎相关建议
  6. 带键盘的java模拟器_虚拟键盘实现!JAVA模拟器PSPKVM v0.3.2推出
  7. 逻辑结构定义及其分类
  8. 战队口号霸气押韵8字_当朱广权遇上沙雕网友,押韵狂魔花落谁手?
  9. 下列计算机程序设计语言中不属于高级语言,下列计算机程序设计语言中不属于高级语言的是()?...
  10. ASEMI双向可控硅BTA12A,详解BTA12A参数应用与特性