[原创] 搜索下载谷歌音乐的脚本
-
- 帖子: 2
- 注册时间: 2009-09-24 18:48
Re: [原创] 搜索下载谷歌音乐的脚本
还得请教一下,分析网页分析出现在的下载地址为“http://g.top100.cn/12174704/html/downlo ... 地址得到的是正确页面,但是用urllib得到的是别的页面,好像是一个中间页面,这个中间页面通过javascript跳转到了正确的页面,你有什么方法能下到正确的页面吗?谢谢!
-
- 帖子: 1
- 注册时间: 2010-04-01 18:02
Re: [原创] 搜索下载谷歌音乐的脚本
hecha, 请问一下,你的wget是怎么编译的,为什么不会有乱码?我在gentoo下面,wget已经添加iri支持,用的是wget-1.12,下载中文url总是乱码。你修改源码了么?用你的这个wget文件就正常。
- 想入非非
- 帖子: 8078
- 注册时间: 2008-07-14 22:42
- 来自: Beijing
- 联系:
- 黄美姬
- 帖子: 8428
- 注册时间: 2009-10-08 11:15
- 来自: 大城市铁岭
Re: [原创] 搜索下载谷歌音乐的脚本
我的是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/
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: [原创] 搜索下载谷歌音乐的脚本
如果有文件名问题可以用我改的版本
文件名为“歌手 - 歌名.后缀”,不支持分目录
限于本人水平有限(从未接触python,只是猜了一下语法),若有不当之处请不吝指正。
文件名为“歌手 - 歌名.后缀”,不支持分目录
限于本人水平有限(从未接触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
访问我的个人小站:人间夜行https://elephantus.moe