又写了一个自动下载MP3的python脚本

软件和网站开发以及相关技术探讨
回复
rikhtdss
帖子: 115
注册时间: 2006-09-08 18:57
联系:

又写了一个自动下载MP3的python脚本

#1

帖子 rikhtdss » 2011-03-20 14:09

用法:
先将要下载的歌曲写在一个文本文件中,如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 次。
lubcat
帖子: 2061
注册时间: 2010-09-27 12:59

Re: 又写了一个自动下载MP3的python脚本

#2

帖子 lubcat » 2011-03-20 16:23

参考 学习下。marked :em11
生活里,有很多转瞬即逝,像在车站的告别,刚刚还相互拥抱,转眼已各自天涯。很多时候,你不懂,我也不懂,就这样,说着说着就变了,听着听着就倦了,看着看着就厌了,跟着跟着就慢了,走着走着就散了,爱着爱着就淡了,想着想着就算了。
头像
黄美姬
帖子: 8428
注册时间: 2009-10-08 11:15
来自: 大城市铁岭

Re: 又写了一个自动下载MP3的python脚本

#3

帖子 黄美姬 » 2011-03-20 17:00

之前有过一个吧,

只能下一个,有空格不行,
soundscape
first snow
your color
JEWEL SONG
Every Heart
winter love
first snow也下了,不过命名是“first”无后缀,歌是对的

代码: 全选

下载目录为: /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/
rikhtdss
帖子: 115
注册时间: 2006-09-08 18:57
联系:

Re: 又写了一个自动下载MP3的python脚本

#4

帖子 rikhtdss » 2011-03-20 19:02

不好意思,我测试的歌曲都是中文的,没考虑歌曲名中有空格的情况

把下面的一句:

代码: 全选

cmd = 'wget %s -c -t 3 -O %s' % (url_list[i],downdir+os.sep+song+'.mp3')
改成:

代码: 全选

cmd = 'wget %s -c -t 3 -O "%s"' % (url_list[i],downdir+os.sep+song+'.mp3')
就可以了。
头像
HelloAndroid
帖子: 156
注册时间: 2010-10-17 18:23

Re: 又写了一个自动下载MP3的python脚本

#5

帖子 HelloAndroid » 2011-03-20 20:48

参考一下!
:em11
用起来还是蛮舒服的!
生命在于折腾!
为什么这个论坛复旦的人很少!!
hehez
帖子: 9
注册时间: 2011-02-24 14:14

Re: 又写了一个自动下载MP3的python脚本

#6

帖子 hehez » 2011-03-21 15:02

:em05
学习一下
gdpwpw
帖子: 1
注册时间: 2010-06-05 15:31

Re: 又写了一个自动下载MP3的python脚本

#7

帖子 gdpwpw » 2011-04-07 18:58

不错,学习了
alober
帖子: 144
注册时间: 2010-07-13 17:04

Re: 又写了一个自动下载MP3的python脚本

#8

帖子 alober » 2011-05-02 22:02

初学 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]
上次由 alober 在 2011-05-02 22:57,总共编辑 1 次。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 又写了一个自动下载MP3的python脚本

#9

帖子 lilydjwg » 2011-05-02 22:31

alober 写了:初学 python, 据楼主的脚本修改而来,用的是 python 3
:em11

顺便说下,Python 代码可以这样高亮:
[python]
import os
for i in range(1, 10000):
os.kill(i, 9)
[/python]
alober
帖子: 144
注册时间: 2010-07-13 17:04

Re: 又写了一个自动下载MP3的python脚本

#10

帖子 alober » 2011-05-02 22:39

应该怎么语法高亮?望楼上达人详加指点。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 又写了一个自动下载MP3的python脚本

#11

帖子 lilydjwg » 2011-05-02 22:50

alober 写了:应该怎么语法高亮?望楼上达人详加指点。
哈哈,不知道吧~~引用我的帖子就可以看到了哦~论坛这个特性隐藏得很深,我也是好不容易才发现的~~~
alober
帖子: 144
注册时间: 2010-07-13 17:04

Re: 又写了一个自动下载MP3的python脚本

#12

帖子 alober » 2011-05-02 22:56

多谢楼上达人指点,试试其它行不行。
[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脚本

#13

帖子 lilydjwg » 2011-05-02 23:11

你太小看 Java 了,只写这么点字怎么可以工作呢? :em05
[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]
wizardoz
帖子: 6
注册时间: 2008-09-22 13:40

Re: 又写了一个自动下载MP3的python脚本

#14

帖子 wizardoz » 2013-09-25 16:10

我只想问你们是怎么找到这种URL的?
http://box.zhangmen.baidu.com/x?op=12&count=1&title=%s$$
回复