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

上网、浏览、聊天、下载等
redface999
帖子: 2
注册时间: 2009-09-24 18:48

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

#16

帖子 redface999 » 2009-09-24 21:39

还得请教一下,分析网页分析出现在的下载地址为“http://g.top100.cn/12174704/html/downlo ... 地址得到的是正确页面,但是用urllib得到的是别的页面,好像是一个中间页面,这个中间页面通过javascript跳转到了正确的页面,你有什么方法能下到正确的页面吗?谢谢!
lowsfer
帖子: 1
注册时间: 2010-04-01 18:02

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

#17

帖子 lowsfer » 2010-04-01 18:15

hecha, 请问一下,你的wget是怎么编译的,为什么不会有乱码?我在gentoo下面,wget已经添加iri支持,用的是wget-1.12,下载中文url总是乱码。你修改源码了么?用你的这个wget文件就正常。
头像
想入非非
帖子: 8078
注册时间: 2008-07-14 22:42
来自: Beijing
联系:

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

#18

帖子 想入非非 » 2010-04-10 16:54

不错,不过同时推荐大家使用骨头大婶的 #gmbox
Ubuntu User
头像
黄美姬
帖子: 8428
注册时间: 2009-10-08 11:15
来自: 大城市铁岭

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

#19

帖子 黄美姬 » 2010-04-10 17:38

我的是PY3,我不用你的wget,也不乱码
我们是命运的妓女,它把我们都嫖了

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/
头像
zszth
帖子: 46
注册时间: 2010-05-30 9:35
联系:

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

#20

帖子 zszth » 2011-01-22 19:05

如果有文件名问题可以用我改的版本
文件名为“歌手 - 歌名.后缀”,不支持分目录
限于本人水平有限(从未接触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()

附件
gmusic.py
当然也可以直接下载
(3.41 KiB) 已下载 35 次
Work and study for the motherland.
访问我的个人小站:人间夜行https://elephantus.moe
回复