Board logo

标题: [分享] python实现批量下载google上的歌曲的一个有效方法,作为参考 [打印本页]

作者: python达人    时间: 2012-9-25 10:05     标题: [分享] 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/




欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/) Powered by Discuz! 6.0.0