分页: 2 / 2

Re: [原创] 搜索下载谷歌音乐的脚本

发表于 : 2009-09-24 21:39
redface999
还得请教一下,分析网页分析出现在的下载地址为“http://g.top100.cn/12174704/html/downlo ... 地址得到的是正确页面,但是用urllib得到的是别的页面,好像是一个中间页面,这个中间页面通过javascript跳转到了正确的页面,你有什么方法能下到正确的页面吗?谢谢!

Re: [原创] 搜索下载谷歌音乐的脚本

发表于 : 2010-04-01 18:15
lowsfer
hecha, 请问一下,你的wget是怎么编译的,为什么不会有乱码?我在gentoo下面,wget已经添加iri支持,用的是wget-1.12,下载中文url总是乱码。你修改源码了么?用你的这个wget文件就正常。

Re: [原创] 搜索下载谷歌音乐的脚本

发表于 : 2010-04-10 16:54
想入非非
不错,不过同时推荐大家使用骨头大婶的 #gmbox

Re: [原创] 搜索下载谷歌音乐的脚本

发表于 : 2010-04-10 17:38
黄美姬
我的是PY3,我不用你的wget,也不乱码

Re: [原创] 搜索下载谷歌音乐的脚本

发表于 : 2011-01-22 19:05
zszth
如果有文件名问题可以用我改的版本
文件名为“歌手 - 歌名.后缀”,不支持分目录
限于本人水平有限(从未接触python,只是猜了一下语法),若有不当之处请不吝指正。

代码: 全选

#!/usr/bin/python3
# 20110122 Koc (即zszth) 修改,原作hecha

import sys, os, re, urllib.parse
from html.parser import HTMLParser
from subprocess import Popen

def decode(string):
	return re.sub('&#[0-9]{5};', lambda x: chr(int(x.group(0)[2:-1])),
			re.sub(' ', ' ', string))

# 建立连接
import http.client
conn = http.client.HTTPConnection("www.google.cn")

# 下载搜索结果页面
if len(sys.argv) == 1:
	exit(0)

query = ' '.join(sys.argv[1:])
print ( "发送查询:", query )
query = urllib.parse.quote(query)
conn.request("GET", "http://www.google.cn/music/search?q="+query)
result = conn.getresponse()

# 分析页面, 得到歌曲列表
def get_attr(attrs, attr):
	for key, value in attrs:
		if key == attr:
			return value
	return None

class SongParser(HTMLParser):
	song_list = []
	def parse(self, htm):
		self.feed(htm.read().decode())
		return self.song_list

	def handle_starttag(self, tag, attrs):
		if get_attr(attrs, "class") == "SongItem BottomBorder":
			self.song_list.append( get_attr(attrs, "id")[3:] )

# 获取并分析下载页面
class SongInfoParser(HTMLParser):
	# song = [ name, singer, size, format ]
	tags = {
			"td-song-name":"name",
			"td-singer":"singer",
			"td-size":"size",
			"td-format":"format"
	}
	song = {}
	attr = None
	def parse(self, htm):
		self.feed(decode(htm.read().decode()))
		return self.song.copy()

	def handle_starttag(self, tag, attrs):
		if tag == "a":
			tag_href = get_attr(attrs, "href")
			if tag_href[0:7] == "/music/":
				self.song["address"] = "http://www.google.cn"+tag_href
		elif get_attr(attrs, "class") == "song-meta-data-table":
			self.attr = ''
		elif self.attr == '':
			tag_class = get_attr(attrs, "class")
			if tag_class in self.tags:
				self.attr = self.tags[tag_class]

	def handle_data(self, data):
		if self.attr:
			self.song[self.attr] = data

	def handle_endtag(self, tag):
		self.attr = ''

print ( "获取歌曲列表..." )
p = SongParser()
song_ids = p.parse( result )
songs = []
parser = SongInfoParser()

for i, id in enumerate(song_ids):
	conn.request("GET", "/music/top100/musicdownload?id="+id)
	response = conn.getresponse()
	song = parser.parse(response)
	name = song["name"]
	print ( i, '  '*(10-len(name))+name, song["singer"],
			song["format"], song["size"], sep='\t' )
	songs.append(song)


# 避免版权问题
ban = '下载即代表你同意巨鲸音乐网的服务条款(http://www.top100.cn/tos.html)和隐私协议(http://www.top100.cn/privatepolicy.html)'
print ( ban )

# 提示更加人性化
choice = input("选择要下载的歌曲[输入'all' 或 '1, 2  3'(逗号或空格) 或 回车即取消]: ")
choice = re.sub(',', ' ', choice).split()
if choice == []:
	print ( "什么也没下载" )
	exit(0)

if choice[0] == 'all':
	choice = range(len(songs))

# 下载歌曲
# 关于wget此处由Koc(即zszth)修改,修复了当前(2011年01月或者以后)文件名下载下来不正确的问题,另外使不喜欢分歌手目录存放歌曲的用户得到方便。限于本人水平有限(从未接触python,只是猜了一下语法),若有不当之处请不吝指正。
for i in choice:
	song = songs[ int(i) ]
	if isinstance(song, dict):
		print ( "下载", song["name"], "..." )
		finalsongname = song["singer"]
		finalsongname += ' - '
		finalsongname += song["name"]
		finalsongname += '.'
		finalsongname += song["format"]
		Popen(['wget', '-c', '-O', finalsongname, song["address"]]).wait()

# 关闭连接
conn.close()