[分享] python实现批量下载google上的歌曲的一个有效方法,作为参考
批量下载top100上的歌曲的一个python实现
使用google music听歌确实很爽,可惜下载的时候不能批量下载,让人操作不方便。为了解决这个问题,一开始我准备用python写一个程序来从google music上批量获取歌曲的url地址并下载。可是发现里面全是javascript写的,而我又对这完全不懂。虽然学学javascript是好事情,但现在也没有那么多的时间,而且为了下几首歌来专门研究这个有点划不来。好在google music上的歌都是来自top100,而直接使用python中的urllib包就可以处理top100的源代码了。
废话不多少,直接上代码,有要的拿走好了,如果有人对代码有什么好的建议更是欢迎在下面留言。
import re
import copy
import socket
import urllib
import urllib2
socket.setdefaulttimeout(60) # 设置连接超时的时间
def urlList(url):
"""
从网页上抓取所有歌曲的下载地址
"""
urls = []
names = []
contexts = urllib2.urlopen(url).read()
urls0 = re.findall("http\:\/\/www.top100.cn\/download\/dl.ashx\?n\=[\%|\=|\w|\.|\&|\+]*",contexts)
urls = [urls0 for i in range(0,len(urls0),2)]
names = [] # 用于保存歌曲的名称
for url in urls:
index = contexts.find(url)
s = contexts[index:index+300]
name = re.findall("\>.*\<",s)[0][1:-1]
name = name.decode("utf-8")
print name
names.append(name)
return (urls,names)
def download(url,path):
"""
下载所有的歌曲到当地硬盘上
url: 选中若干歌曲,选择下载,可以进入一个下载页面,即这里的url
path: 本地保存路径
"""
(urls,names) = urlList(url)
print urls
while urls != []:
# 如果还有列表中还有歌曲未下下来
i = 0
the_urls = copy.deepcopy(urls)
the_names = copy.deepcopy(names)
for the_url in the_urls:
try:
name = the_names
print name
req = urllib2.Request(the_url)
req.add_header("Referer","http://www.top100.cn") # 这一步很重要,定义Referer,否则地址会重定向到top100的首页。
res = urllib2.urlopen(req)
# 下面是计算要下载的歌曲文件的大小
headers = res.info().headers
size = 0
for header in headers:
if header.find('Length') != -1:
size = header.split(':')[-1].strip()
size = int(size)
if size == 0:
continue
filename = path+name+".mp3" # 歌曲文件的保存名称
if os.path.isfile(filename) and os.path.getsize(filename) == size: # 如果文件存在且完整,从urls中删除这首歌,跳出
urls.remove(the_url)
names.remove(name)
i+=1
continue
f = open(filename,"wb")
f.write(res.read()) # 写入本地文件
f.close()
print "***********" # 成功下载,否则跳到异常处理中
urls.remove(the_url) # 从列表中移除已下载歌曲
names.remove(name)
i+=1
except (urllib2.URLError,IOError,socket.error):
print "^^^^^^^^^^^^^^^^"
i+=1
continue
if __name__ == '__main__':
url = "http://www.top100.cn/download/download.aspx?Productid=jwadyc3aghauycbogc,jwadnpbtgchuqcbogr,jwadnpb38r5dycbogo" # 一个歌曲下载页面
path = "L:\\Music\\google music\\Wang Feng\\"
import os
if not os.path.exists(path):
os.mkdir(path)
download(url,path)
本文源自:ht tp://w w w.c svt.ne t/