Google音乐做的不错,不过可能由于家里网络的的原因,经常听着听着就不动了,就想着下到本地听,不知道他怎么做的,在Internet临时文件夹里看不到音乐的临时文件,从网上只找到一个下载的工具是用PYTHON做的,不过不合我的要求,于是决定自己写一个。
  我的思路是这样的,先把‘下载" oncontextmenu="return false;" onclick="window.open("/music/url?q\x3dhttp%3A%2F%2Fg.top100.cn%2F12174704%2Fhtml%2Fdownload.html%3Fid%3DS518edb7fd08fbd08’这一部分用正则表达式匹配出来,然后再把正确的地址“http%3A%2F%2Fg.top100.cn%2F12174704%2Fhtml%2Fdownload.html%3Fid%3DS518edb7fd08fbd08’”匹配出来,但是匹配的时候又出现了问题,最上面的蓝色部分,我去不掉(python我也不会,也是现学现用),最后匹配出来的是“下载" oncontextmenu="return false;" onclick="window.open("/music/url?q\x3dhttp%3A%2F%2Fg.top100.cn%2F12174704%2Fhtml%2Fdownload.html%3Fid%3DS518edb7fd08fbd08\x26resnum”好在蓝色部分固定长度,我用[ -10]把它截去了,最后用正则“http.*”把正确的地址匹配出来。思路弄清楚了就开始写代码,写起来没有想像得那么简单,由于对python一点也不懂,出现了几个不太好弄的问题,开始我用html=urllib.urlopen(“http://www.google.cn/music/topiclisting?q=top100_north_south_line&cat=song”).read()把网页源码读出来,直接匹配html结果一个也出不来,我也不知道什么原因,可以是行太多(我只做了单选的匹配),于是我又把html写到了文件里再一行一行的处理,不过读文件的时候又出来了中文的问题,需要转换编码,从网上找了不少代码没有解决,最后终于找到一个函数,呵呵
def mdcode( str ):
    for c in ( 'utf-8','gbk', 'gb2312'):   
        try:
            return str.decode(c).encode( 'gbk' )
        except:
            pass
    return 'unknown'
         html的源码好像不只有一种编码,转的时候总是转了一部分就报错,走不下去了,用了这个函数就解决了,这样得出来的地址是“http%3A%2F%2Fg.top100.cn%2F12174704%2Fhtml%2Fdownload.html%3Fid%3DS518edb7fd08fbd08”还不能用,需要url编码转换,用urllib.unquote()就行了,最后得出来的地址是
http://g.top100.cn/12174704/html/download.html?id=S518edb7fd08fbd08
 
# coding=utf-8
import urllib
import re
import sys

def mdcode( str ):
        for c in ( 'utf-8','gbk', 'gb2312'):        
                try:
                        return str.decode(c).encode( 'gbk' )
                except:
                        pass    
        return 'unknown'
    
url = 'http://www.google.cn/music/topiclisting?q=top100_north_south_line&cat=song'    
filename='c:\\tmp\\url.txt'
wname='c:\\tmp\\out.txt'
regx='下载.*window.*http.*\\\\x26resnum'#\x26resnum很奇怪,明明看到的是一个‘\’可是匹配不出来,好像是有两个‘\\’
reg='http.*'
list =[]
result=[]

html=urllib.urlopen(url).read(); #下载网页

file=open(filename,'w')
file.write(html)
file.close()
file=open(filename,'r')
lines=file.readlines()

reobj=re.compile(regx)
reo=re.compile(reg)

for line in lines:
  for match in reobj.finditer(line):
    list.append(urllib.unquote(mdcode(match.group())))  #匹配地址,并转码

for s in list:
  result.append(s[:-10]) #截去\x26resnum部分
    
list=[]

for r in result:
  for match in reo.finditer(r):
    list.append(match.group())    #匹配最后地址
    
file=open(wname,'w')

for r in list:
  file.write(r+"\n")
file.close()