又写了一个自动下载MP3的python脚本
-
- 帖子: 115
- 注册时间: 2006-09-08 18:57
- 联系:
又写了一个自动下载MP3的python脚本
用法:
先将要下载的歌曲写在一个文本文件中,如song.txt,每首歌占一行.
然后运行:
python getmp3.py song.txt
下载目录为当前目录下的"Music_"
[python]
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import os
import re
import urllib2
cwd = os.getcwd()
lc = sys.getfilesystemencoding()
downdir = cwd+os.sep+'Music_'
print '\n下载目录为:',downdir,'\n'
if not os.path.isdir(downdir):
print '下载目录不存在,正在创建目录:',downdir
os.mkdir(downdir)
if os.path.isfile(sys.argv[1]):
list_file = sys.argv[1]
else:
list_file = cwd + os.sep + sys.argv[1]
try:
f = file(list_file,'r')
except IOError:
print '歌典列表打开失败,请检查文件是否存在!'
sys.exit()
for eachLine in f:
song = eachLine.strip()
if not song:
continue
mp3file = downdir + os.sep + song + '.mp3'
if os.path.isfile(mp3file):
print '%s.mp3已经存在,转到下一首\n' % song
continue
url="http://box.zhangmen.baidu.com/x?op=12&count=1&title=%s$$" % urllib2.quote(song.decode(lc).encode('gbk'))
xmlf = urllib2.urlopen(url)
txt = xmlf.read()
rex1 = u'(<encode>)(http://.+?/.+?\..+?)(</encode>)'
rex2 = u'(<decode>)(.+?\..+?)(</decode>)'
l1 = re.findall(rex1,txt)
l2 = re.findall(rex2,txt)
url_list = []
for i in range(len(l1)):
temp_list = re.split('/',l1[1])
temp_list.pop()
temp_list.append(l2[1])
down_url = '/'.join(temp_list)
url_list.append(down_url)
for i in range(len(url_list)):
extname = url_list.split('.')[-1] #跳过非MP3的类型
if extname.upper() == 'MP3':
print '\n正在下载歌曲:%s...\n' % song
cmd = 'wget %s -c -t 3 -O "%s"' % (url_list,downdir+os.sep+song+'.mp3')
os.system(cmd)
#multGet.MyHttpGet(url_list,connections = 10)
if os.path.getsize(mp3file) < 500000L: #小于500K的文件将被删除,并重新下载
print '\n文件过小,可能是目标网站有限制,将尝试下一个链接\n'
os.remove(mp3file)
else:
print '《%s》下载完毕!' % song
break
print '全部下载完毕!'
[/python]
改了下程序逻辑,将判断文件是否存在的语句放到了下载xml之前
先将要下载的歌曲写在一个文本文件中,如song.txt,每首歌占一行.
然后运行:
python getmp3.py song.txt
下载目录为当前目录下的"Music_"
[python]
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import os
import re
import urllib2
cwd = os.getcwd()
lc = sys.getfilesystemencoding()
downdir = cwd+os.sep+'Music_'
print '\n下载目录为:',downdir,'\n'
if not os.path.isdir(downdir):
print '下载目录不存在,正在创建目录:',downdir
os.mkdir(downdir)
if os.path.isfile(sys.argv[1]):
list_file = sys.argv[1]
else:
list_file = cwd + os.sep + sys.argv[1]
try:
f = file(list_file,'r')
except IOError:
print '歌典列表打开失败,请检查文件是否存在!'
sys.exit()
for eachLine in f:
song = eachLine.strip()
if not song:
continue
mp3file = downdir + os.sep + song + '.mp3'
if os.path.isfile(mp3file):
print '%s.mp3已经存在,转到下一首\n' % song
continue
url="http://box.zhangmen.baidu.com/x?op=12&count=1&title=%s$$" % urllib2.quote(song.decode(lc).encode('gbk'))
xmlf = urllib2.urlopen(url)
txt = xmlf.read()
rex1 = u'(<encode>)(http://.+?/.+?\..+?)(</encode>)'
rex2 = u'(<decode>)(.+?\..+?)(</decode>)'
l1 = re.findall(rex1,txt)
l2 = re.findall(rex2,txt)
url_list = []
for i in range(len(l1)):
temp_list = re.split('/',l1[1])
temp_list.pop()
temp_list.append(l2[1])
down_url = '/'.join(temp_list)
url_list.append(down_url)
for i in range(len(url_list)):
extname = url_list.split('.')[-1] #跳过非MP3的类型
if extname.upper() == 'MP3':
print '\n正在下载歌曲:%s...\n' % song
cmd = 'wget %s -c -t 3 -O "%s"' % (url_list,downdir+os.sep+song+'.mp3')
os.system(cmd)
#multGet.MyHttpGet(url_list,connections = 10)
if os.path.getsize(mp3file) < 500000L: #小于500K的文件将被删除,并重新下载
print '\n文件过小,可能是目标网站有限制,将尝试下一个链接\n'
os.remove(mp3file)
else:
print '《%s》下载完毕!' % song
break
print '全部下载完毕!'
[/python]
改了下程序逻辑,将判断文件是否存在的语句放到了下载xml之前
上次由 rikhtdss 在 2011-05-15 14:46,总共编辑 4 次。
-
- 帖子: 2061
- 注册时间: 2010-09-27 12:59
Re: 又写了一个自动下载MP3的python脚本
参考 学习下。marked 

生活里,有很多转瞬即逝,像在车站的告别,刚刚还相互拥抱,转眼已各自天涯。很多时候,你不懂,我也不懂,就这样,说着说着就变了,听着听着就倦了,看着看着就厌了,跟着跟着就慢了,走着走着就散了,爱着爱着就淡了,想着想着就算了。
- 黄美姬
- 帖子: 8428
- 注册时间: 2009-10-08 11:15
- 来自: 大城市铁岭
Re: 又写了一个自动下载MP3的python脚本
之前有过一个吧,
只能下一个,有空格不行,
只能下一个,有空格不行,
first snow也下了,不过命名是“first”无后缀,歌是对的soundscape
first snow
your color
JEWEL SONG
Every Heart
winter love
代码: 全选
下载目录为: /home/janker/dwhelper/downMP3python/Music_
正在下载歌曲: soundscape ...
--2011-03-20 17:11:38-- http://ababyphoto.com/desky/media/Soundscape.mp3
正在解析主机 ababyphoto.com... 203.169.176.228
正在连接 ababyphoto.com|203.169.176.228|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 8155136 (7.8M) [audio/mpeg]
正在保存至: “/home/janker/dwhelper/downMP3python/Music_/soundscape.mp3”
100%[============================================================>] 8,155,136 201K/s in 42s
2011-03-20 17:12:21 (189 KB/s) - 已保存 “/home/janker/dwhelper/downMP3python/Music_/soundscape.mp3” [8155136/8155136])
soundscape 下载完毕!
正在下载歌曲: first snow ...
--2011-03-20 17:12:21-- http://f7.wretch.yimg.com/king830609/15/1624116140.mp3
正在解析主机 f7.wretch.yimg.com... 116.214.13.252
正在连接 f7.wretch.yimg.com|116.214.13.252|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 4207176 (4.0M) [audio/mpeg]
正在保存至: “/home/janker/dwhelper/downMP3python/Music_/first”
100%[============================================================>] 4,207,176 187K/s in 21s
2011-03-20 17:12:43 (196 KB/s) - 已保存 “/home/janker/dwhelper/downMP3python/Music_/first” [4207176/4207176])
--2011-03-20 17:12:43-- http://snow.mp3/
正在解析主机 snow.mp3... 失败:未知的名称或服务。
wget: 无法解析主机地址 “snow.mp3”
下载完毕 --2011-03-20 17:12:43--
下载了:1 个文件,21s (196 KB/s) 中的 4.0M
Traceback (most recent call last):
File "getmp3.py", line 70, in <module>
if os.path.getsize(mp3file) < 500000L: #小于500K的文件将被删除,并重新下载
File "/usr/lib/python2.6/genericpath.py", line 49, in getsize
return os.stat(filename).st_size
OSError: [Errno 2] No such file or directory: '/home/janker/dwhelper/downMP3python/Music_/first snow.mp3'
janker@sars:~/dwhelper/downMP3python$
我们是命运的妓女,它把我们都嫖了
N卡驱动:http://www.nvidia.cn/Download/index.aspx?lang=cn
极品飞车:http://www.geforce.cn/optimize/optimal- ... ts-450-ops
孤岛危机优化设置:http://www.geforce.cn/optimize/optimal- ... tx-450-ops
终端彩色:cp /etc/skel/.bashrc ~/
PS1="\[\e]2;\u@\H \w\a\e[32;1m\]\T$\[\e[0m\] "
http://cdimage.ubuntu.com/
http://releases.ubuntu.com/
N卡驱动:http://www.nvidia.cn/Download/index.aspx?lang=cn
极品飞车:http://www.geforce.cn/optimize/optimal- ... ts-450-ops
孤岛危机优化设置:http://www.geforce.cn/optimize/optimal- ... tx-450-ops
终端彩色:cp /etc/skel/.bashrc ~/
PS1="\[\e]2;\u@\H \w\a\e[32;1m\]\T$\[\e[0m\] "
http://cdimage.ubuntu.com/
http://releases.ubuntu.com/
-
- 帖子: 115
- 注册时间: 2006-09-08 18:57
- 联系:
- HelloAndroid
- 帖子: 156
- 注册时间: 2010-10-17 18:23
-
- 帖子: 9
- 注册时间: 2011-02-24 14:14
-
- 帖子: 1
- 注册时间: 2010-06-05 15:31
Re: 又写了一个自动下载MP3的python脚本
不错,学习了
-
- 帖子: 144
- 注册时间: 2010-07-13 17:04
Re: 又写了一个自动下载MP3的python脚本
初学 python, 据楼主的脚本修改而来,用的是 python 3。
[python]
import sys
import os
import re
import urllib
import urllib.parse
import urllib.request
cwd = os.getcwd()
downdir = cwd + os.sep + 'Music_'
if not os.path.isdir(downdir):
os.mkdir(downdir)
if os.path.isfile(sys.argv[1]):
song_file = sys.argv[1]
else:
song_file = cwd + os.sep + sys.argv[1]
try:
song_list = open(song_file, 'r')
except IOError:
print('列表打开失败.')
sys.exit()
for line in song_list:
song = line.strip()
mp3 = downdir + os.sep + song + '.mp3'
if not song or os.path.isfile(mp3):
continue
url="http://box.zhangmen.baidu.com/x?op=12&count=1&title=%s$$" % urllib.parse.quote(song, encoding='GBK')
txt = str(urllib.request.urlopen(url).read())
regex = "<encode>(http://[^<]+?)</encode><decode>([^<]+?\.(mp|MP)3)</decode>"
urls = re.findall(regex, txt)
for url in urls:
down_url = url[0][0: url[0].rfind('/')+1] + url[1]
print('\n正在下载歌曲:%s...' % song)
cmd = 'wget %s -c -t 3 -O "%s" -o /dev/null' % (down_url, downdir + os.sep + song + '.mp3')
os.system(cmd)
if os.path.getsize(mp3) < 500000:
os.remove(mp3)
else:
print('《%s》下载完毕!' % song)
break
print('全部下载完毕!')
[/python]
[python]
import sys
import os
import re
import urllib
import urllib.parse
import urllib.request
cwd = os.getcwd()
downdir = cwd + os.sep + 'Music_'
if not os.path.isdir(downdir):
os.mkdir(downdir)
if os.path.isfile(sys.argv[1]):
song_file = sys.argv[1]
else:
song_file = cwd + os.sep + sys.argv[1]
try:
song_list = open(song_file, 'r')
except IOError:
print('列表打开失败.')
sys.exit()
for line in song_list:
song = line.strip()
mp3 = downdir + os.sep + song + '.mp3'
if not song or os.path.isfile(mp3):
continue
url="http://box.zhangmen.baidu.com/x?op=12&count=1&title=%s$$" % urllib.parse.quote(song, encoding='GBK')
txt = str(urllib.request.urlopen(url).read())
regex = "<encode>(http://[^<]+?)</encode><decode>([^<]+?\.(mp|MP)3)</decode>"
urls = re.findall(regex, txt)
for url in urls:
down_url = url[0][0: url[0].rfind('/')+1] + url[1]
print('\n正在下载歌曲:%s...' % song)
cmd = 'wget %s -c -t 3 -O "%s" -o /dev/null' % (down_url, downdir + os.sep + song + '.mp3')
os.system(cmd)
if os.path.getsize(mp3) < 500000:
os.remove(mp3)
else:
print('《%s》下载完毕!' % song)
break
print('全部下载完毕!')
[/python]
上次由 alober 在 2011-05-02 22:57,总共编辑 1 次。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 又写了一个自动下载MP3的python脚本
alober 写了:初学 python, 据楼主的脚本修改而来,用的是 python 3。

顺便说下,Python 代码可以这样高亮:
[python]
import os
for i in range(1, 10000):
os.kill(i, 9)
[/python]
-
- 帖子: 144
- 注册时间: 2010-07-13 17:04
Re: 又写了一个自动下载MP3的python脚本
应该怎么语法高亮?望楼上达人详加指点。
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 又写了一个自动下载MP3的python脚本
哈哈,不知道吧~~引用我的帖子就可以看到了哦~论坛这个特性隐藏得很深,我也是好不容易才发现的~~~alober 写了:应该怎么语法高亮?望楼上达人详加指点。
-
- 帖子: 144
- 注册时间: 2010-07-13 17:04
Re: 又写了一个自动下载MP3的python脚本
多谢楼上达人指点,试试其它行不行。
[lua]
function thx()
print("Thanks for lilydjwg's help.");
end
[/lua]
[python]
print "Thanks for lilydjwg's help."
[/python]
[java]
System.out.println("Thanks for lilydjwg's help.");
[/java]
[lua]
function thx()
print("Thanks for lilydjwg's help.");
end
[/lua]
[python]
print "Thanks for lilydjwg's help."
[/python]
[java]
System.out.println("Thanks for lilydjwg's help.");
[/java]
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 又写了一个自动下载MP3的python脚本
你太小看 Java 了,只写这么点字怎么可以工作呢?
[java]
class Thx{
public static void main(String[] args){
System.out.println("Thanks for lilydjwg's help.");
}
}
[/java]
另外 Lua/Javascript 的我喜欢这样:
[lua]
thx = function ()
print("Thanks for lilydjwg's help.")
end
[/lua]
[javascript]
#!/usr/bin/env node
var sys = require('sys');
var thx = function(){
sys.print("Thanks for lilydjwg's help.");
}
[/javascript]

[java]
class Thx{
public static void main(String[] args){
System.out.println("Thanks for lilydjwg's help.");
}
}
[/java]
另外 Lua/Javascript 的我喜欢这样:
[lua]
thx = function ()
print("Thanks for lilydjwg's help.")
end
[/lua]
[javascript]
#!/usr/bin/env node
var sys = require('sys');
var thx = function(){
sys.print("Thanks for lilydjwg's help.");
}
[/javascript]
-
- 帖子: 6
- 注册时间: 2008-09-22 13:40
Re: 又写了一个自动下载MP3的python脚本
我只想问你们是怎么找到这种URL的?
http://box.zhangmen.baidu.com/x?op=12&count=1&title=%s$$
http://box.zhangmen.baidu.com/x?op=12&count=1&title=%s$$