python3爬虫下载音乐_python3.4爬虫批量下载音乐
最近在学习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爬虫批量下载音乐相关推荐
- python怎么批量下载年报_使用Python批量下载Wind数据库中的PDF报告
原标题:使用Python批量下载Wind数据库中的PDF报告 背景 最近小编出于工作需要,准备在Wind金融数据终端批量下载上市公司2019年第一季度业绩预告.通过相关的条件检索,发现其相关数据有近百 ...
- [Windows] 哔哩下载姬—B站视频批量下载
哔哩下载姬 简介:哔哩下载姬是一款下载哔哩哔哩视频的免费软件.适用:windows系统文件大小:18.7 MB 特点: 1.无需登录即可下载. 2.可以多线程,多任务同时下载.(最高支持10线程,10 ...
- 自媒体批量下载短视频软件,批量下载短视频有诀窍
自媒体批量下载短视频软件,批量下载短视频有诀窍,现在随着短视频的爆火,越来越多的自媒体人和公司都注意到短视频这个平台流量有多大,短视频很容易变现也很容易引流,接下来我们来看看自媒体批量下载短视频软件有 ...
- vue-qr 二维码 添加logo 下载单个二维码 批量下载二维码并打包
使用 vue-qr 生成二维码并可以添加logo 逻辑: 1.下载二维码生成插件 这里用的是qrcode 2.下载二维码 使用html2canvas(其实解释一个截图工具)将标签截图并下载下来 3. ...
- python爬微信公众号视频_python爬虫公众号所有信息,并批量下载公众号视频
之前写过一篇类似的文章:python爬取公众号,用最简单的方式爬虫 还有同学一直在问,可能中间有一些小细节不明确,这次彻底明确一下细节. 本篇添加一个批量下载公众号内视频的功能,可以实现完全复制一个公 ...
- python爬虫公众号所有信息,并批量下载公众号视频
之前写过一篇类似的文章:python爬取公众号,用最简单的方式爬虫 还有同学一直在问,可能中间有一些小细节不明确,这次彻底明确一下细节. 本篇添加一个批量下载公众号内视频的功能,可以实现完全复制一个公 ...
- python壁纸数据抓取_python爬虫系列之 xpath实战:批量下载壁纸
一.前言 在开始写爬虫之前,我们先了解一下爬虫 首先,我们需要知道爬虫是什么,这里直接引用百度百科的定义网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照 ...
- python批量下载bilibili视频_如何批量下载bilibili的视频?
貌似现在 you-get 已经支持批量下载了.通过下面命令就可以批量下载了 you-get --playlist 网址 本来是带这个需求来的,看到 Venchi 的答案,装了 Python3 之后发现 ...
- 用python批量下载网络图片_使用python批量下载图片吗?怎么做?
没想到吧,我们居然可以用python去下载图片,关于单个下载内容,之前已经出了教程告诉大家,大家应该都知道,图片跟文字似的,经常多个发布,我们如果想得到很多个图片,还得一个代码或者一个图片源的去敲击吗 ...
- python 批量下载 代码_Python + Selenium +Chrome 批量下载网页代码修改
Python + Selenium +Chrome 批量下载网页代码修改 主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt 来达到在登陆状态下 批量打开并下载网 ...
最新文章
- 最初的梦想,将来的你一定会感谢现在努力的自己
- python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器
- 以太坊联合创始人发明了新语言叫板Vyper,主链之后语言将引领新一轮大战?...
- 《敏捷企业》作者访谈录
- SpringSecurity权限控制之异常处理方式三
- 利用矩阵的n次方求图的连通性
- Linux内核程序的编译:模块化编译
- ETL学习总结(1)——ETL 十大功能特性详解
- C++ operator关键字(重载操作符)(转)
- 装hadoop引发的一系列事件
- 各种常见排序算法的时间/空间复杂度 是否稳定 算法选取的情况 改进 思维导图整理
- Linux安装软件的三种方式
- 天才黑客,阿里安全科学家吴翰清:做对事只能赢一场,跟对人可以赢一生!...
- Ckplayer视频播放器使用方法介绍
- The APR based Apache Tomcat Native library which allows optimal performance in production
- Windows Service 创建与安装
- Python -- 限流 throttle
- 创造历史后的2008年中国股市
- 如何查看是否有清华源/删除清华源,保留默认源
- php设计模式-中级
热门文章
- c语言某年某月某日的天数,输入某年某月某日,判断这一天是这一年的第几天...
- 用Python做一个美丽的每日计划
- linux下无线网卡做热点,用ArchLinux做wifi热点无线路由
- 无线网络共享有线计算机,win10怎么把有线网络变成无线_win10如何共享有线网络为无线热点...
- 分析保镖人才网网站优化与搜索引擎相关建议
- 带键盘的java模拟器_虚拟键盘实现!JAVA模拟器PSPKVM v0.3.2推出
- 逻辑结构定义及其分类
- 战队口号霸气押韵8字_当朱广权遇上沙雕网友,押韵狂魔花落谁手?
- 下列计算机程序设计语言中不属于高级语言,下列计算机程序设计语言中不属于高级语言的是()?...
- ASEMI双向可控硅BTA12A,详解BTA12A参数应用与特性