python 分析Google音樂下載地址(一)

Google音樂作的不錯,不過可能因爲家裏網絡的的緣由,常常聽着聽着就不動了,就想着下到本地聽,不知道他怎麼作的,在Internet臨時文件夾裏看不到音樂的臨時文件,從網上只找到一個下載的工具是用PYTHON作的,不過不合個人要求,因而決定本身寫一個。
 我比較喜歡聽Google整理的專輯,因此就從這裏開始了,好比這個頁面(http://www.google.cn/music/topiclistingq=top100_north_south_line&cat=song)查看他的源碼,發現音樂下載頁面的地址是下面紅字的部分(<a href="javascript:void(0)" title="下載" oncontextmenu="return false;"onclick="window.open(&quot;/music/url?q\x3dhttp%3A%2F%2Fg.top100.cn%2F12174704%2Fhtml%2Fdownload.html%3Fid%3DS518edb7fd08fbd08\x26resnum\x3d50\x26ct\x3ddl\x26cad\x3dtopic\x26cd\x3d1\x26ei\x3dQrKlSoj5OKewsgKB9PSgAQ&quot;,&#39;&#39;, &quot;resizable\x3d0, status\x3d0, width\x3d750, height\x3d360&quot;);return false;">),因此須要把這一部分提取出來就能夠了,天然就想到了用正則表達式,之前沒用過,現學現用吧, 看了網上一個30分鐘的教程,寫了一個正則表達式「(?<=下載.*\/music\/url\?q\\x3d).*(?=\\x26resnum) ,放到測試工具裏能成,可是那個教程講的是C#的正則表達式,當時機器上沒安.net,只能用PYTHON,不過python好像不支持向前預匹配,這個表達式不能用,從網上找了好長時間也沒有找到解決的辦法,只能用比較的笨的辦法了。
  個人思路是這樣的,先把‘下載" oncontextmenu="return false;" onclick="window.open(&quot;/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(&quot;/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()就好了,最後得出來的地址是
固然這個地址不是音樂的下載地址,只是下載頁面的地址,還得分析那個頁面才能獲得真正的下載的地址,當我用urllib.urlopen().read()下載這個地址的時候,下到的不是真正下載頁面的源碼,但是把這個地址放到瀏覽器裏就成下載頁面,可能中間Google作的別的處理吧,這個今天尚未解決,留到下一篇文章裏面,下面是如今的所有的代碼,剛剛開始學python,寫的很差,還但願你們看完了給出意見,謝謝。若是您知道怎樣一步用正則表達式把地址匹配出來,還但願您能在下面留言,我想了幾天也沒弄出來。您能夠給我發郵件mistral1986@gmail.com
 
# 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()
相關文章
相關標籤/搜索