看看用 "網(wǎng)頁(yè)快照" ("快照" )截?cái)嗟姆绞剑?BR>********************************* </a> - <a class=fl href="/search?hl=zh-CN&lr=lang_zh-CN&newwindow=1&q=related:www.design-war.com/manage/download_counter.asp%3Fid%3D2262">類似網(wǎng)頁(yè)</a></nobr> <p class=g> <a class=l target=_blank onmousedown="return clk(0,'res','2','')">鄭源/披著羊皮的狼.LRC 飛舞歌詞fei5.com</a><br> <font size=-1>鄭源/披著羊皮的狼.LRC. <b>...</b> [ti:披著羊皮的狼] [ar:鄭源] [al:我最<br>火] [by:fei5.com] [offset:-500] [00:01.00]-披著羊皮的狼- [00:04.00]歌手:鄭<br>源[00:08.00]專輯:我最火[00:12.00]詞曲:刀郎[00:16.00] <b>...</b><br> <font color=#008000> <span dir=ltr>www.rixiu.com/fei5/11/1140657ae45bc98.html</span> - 6k - 補(bǔ)充材料 - </font> <nobr><a class=fl target=_blank>網(wǎng)頁(yè)快照 </font> ********************************* 下面的處理事實(shí)上就是一層層剝離數(shù)據(jù)的過(guò)程。
第一句 linkData[i] = linkData[i].slice(0, linkData[i].lastIndexOf("<a")) 的作用是只取上面源代碼的一部份用作后面的處理,這樣有利于后面的操作和簡(jiǎn)化你的視野。
選取有特征的字符串在這里很重要。 看看上面的這段代碼,關(guān)于搜索結(jié)果的那一段("<font size=-1>鄭源/披著羊皮的狼.LRC......c98.html</span> - 6k")都是不能作為特征進(jìn)行數(shù)據(jù)搜索處理的,因?yàn)樗鼈儠?huì)隨著搜索結(jié)果的不同而改變。所有可用的就是關(guān)于超鏈接的部份(搜索引擎不管如何更改他們的頁(yè)面,點(diǎn)向最終頁(yè)面的這個(gè)鏈接始終都是會(huì)存在的,隨著時(shí)間的推移,在很長(zhǎng)一段時(shí)間內(nèi)也都是如此,這里有為你考慮到程序的壽命問(wèn)題,也就是說(shuō),你寫的這段程序在很長(zhǎng)的一段時(shí)間內(nèi)都是有用的)。
也就是源代碼中的"<a href= " 和"</a>"標(biāo)簽。在這里我們用了"<a"作為特征字符串并只取在這之前的數(shù)據(jù)。我們將從后面剝離最后一個(gè)超鏈接以使結(jié)果從后面開始第一個(gè)超鏈接就是我們想要的數(shù)據(jù)。 linkData[i].lastIndexOf("<a") 找到最后一個(gè) "<a"出現(xiàn)的位置,也就是在這個(gè)地方: ......補(bǔ)充材料 - </font><nobr><a class=fl href="http://72.14.203.104/ ..... linkData[i] = linkData[i].slice(0, linkData[i].lastIndexOf("<a")) 取它之前的數(shù)據(jù)。也就是這一段: </a> - <a class=fl href="/search?hl=......6k - 補(bǔ)充材料 - </font><nobr> (補(bǔ)充一句,考到錨點(diǎn)和結(jié)果文字多少的情況,事實(shí)上用"</a"作為特征字符串處理可能更好一些,這樣這一次處理的結(jié)果就剩下這段代碼了): ********************************* </a> - <a class=fl href="/search?hl=zh-CN&lr=lang_zh-CN&newwindow=1&q=related:www.design-war.com/manage/download_counter.asp%3Fid%3D2262">類似網(wǎng)頁(yè)</a></nobr> <p class=g> <a class=l target=_blank onmousedown="return clk(0,'res','2','')">鄭源/披著羊皮的狼.LRC 飛舞歌詞fei5.com</a> *********************************
對(duì)比一下上面用"類似網(wǎng)頁(yè)"截?cái)嗟臄?shù)據(jù),要處理到這一步,就需要重復(fù)處理兩次。(因?yàn)?"<a" 的超鏈接在從后向前查找的過(guò)程中,有出現(xiàn)兩次,這就是為什么要選擇 "網(wǎng)頁(yè)快照" 作為我們截?cái)嘀貜?fù)區(qū)塊的原因)
第二句 linkData[i] = linkData[i].slice(linkData[i].lastIndexOf("href=")+6) 從后面查找 "href="(現(xiàn)在最后的一個(gè)超鏈接區(qū)域就是我們想要的鏈接了,這就是為什么我們用lastIndexOf從后面搜索)。不過(guò)稍微不同的是,現(xiàn)在取在"href="之后的字符串(上一步是之前)。經(jīng)過(guò)這次處理剩下的代碼如下: ********************************* www.rixiu.com/fei5/11/1140657ae45bc98.html"; target=_blank onmousedown="return clk(0,'res','2','')">鄭源/披著羊皮的狼.LRC 飛舞歌詞fei5.com</a> *********************************
第三句 linkData[i] = linkData[i].slice(0, linkData[i].indexOf("\"")) 取得第一個(gè)引號(hào)以前的字符串。這里我講一下為什么不用 target= 或者.html 作為特征處理的原因,上面的代碼實(shí)際上也可以將 target= 放在后面,也不會(huì)影響最終頁(yè)面的結(jié)果。像這樣: www.rixiu.com/fei5/11/1140657ae45bc98.html"; onmousedown="return clk(0,'res','2','')" target=_blank>鄭源/披著羊皮的狼.LRC 飛舞歌詞fei5.com</a> 所以,它是不可識(shí)別和預(yù)知的。而.html 則并不是因?yàn)樗芯W(wǎng)頁(yè)都是以.html作為結(jié)尾的,有些可能是.htm ,有些更可能是像?sl=11&word=aa這樣動(dòng)態(tài)生成的格式。(其實(shí)" 也并不是非常穩(wěn)健的方式,因?yàn)橛行┎粯?biāo)準(zhǔn)的網(wǎng)頁(yè)可能將引號(hào)" 去除,這時(shí)候替代的方法是使用空格) ********************************* www.rixiu.com/fei5/11/1140657ae45bc98.html *********************************
現(xiàn)在最終我們得到了這個(gè)超鏈接。
通過(guò)上面的for (var i = 0; i<linkData.length; i++) { 循環(huán),我們得到了這個(gè)頁(yè)面的所有通過(guò)最終頁(yè)面的鏈接(在百度中是10個(gè))并將它們放入一個(gè)數(shù)組中。
現(xiàn)在我們已經(jīng)得到了搜索結(jié)果頁(yè)面的每個(gè)通向最終頁(yè)面的鏈接(Google 和百度都如此,教程中對(duì)兩者的特征字作了兼容),在百度中,一般而言,只要打開第一個(gè)鏈接就可以了。準(zhǔn)確性差不多高過(guò)95%。
openLRCPage(linkData[0])
linkIndex = 1 這句就不說(shuō)了,用來(lái)處理一些邏輯。使它可以在第一個(gè)鏈接失效的時(shí)候也能繼續(xù)運(yùn)行。
function openLRCPage(url) { myLoadVars.load(url); myLoadVars.onData = getLRC; }
這個(gè)和一開始加載搜索結(jié)果的代碼很相似,只不過(guò)將處理的函數(shù)傳給了 getLRC。
function getLRC(src) { htmlData = src.slice(src.lastIndexOf("[ti:"+musicName)); findEndTag(); ...... 現(xiàn)在開始處理最終的含有LRC內(nèi)容的網(wǎng)頁(yè)了(從搜索引擎中打開)。最終的結(jié)果頁(yè)可能如下:
(前面省略) [ti:突然的自我] [ar:黃小琥] [al:] [by:wolfpey] [offset:500] [00:02.67]《突然的自我》 [00:10.12]作詞:伍佰 徐克 [00:11.67]作曲/編曲:伍佰 [00:12.30]演唱:黃小琥 (后面省略)
具體請(qǐng)從搜索引擎打開幾個(gè)用"[ti:突然的自我"搜索的頁(yè)面看看,F(xiàn)在我們直接取在我們想要的LRC內(nèi)容開始后的網(wǎng)頁(yè)代碼。也就是以 "[ti:"+musicName) 為特征開始的網(wǎng)頁(yè)代碼。(為了便于觀察,我這里以實(shí)際顯示的內(nèi)容為參考,并沒有列出網(wǎng)頁(yè)的源代碼,但它們有時(shí)是可以相互通用的,在網(wǎng)頁(yè)源代碼都會(huì)包含最終顯示的內(nèi)容,某些特殊的轉(zhuǎn)義字符除外。只是更為雜亂。插一句,有些網(wǎng)頁(yè)的源代碼確實(shí)夠亂的,很可能讓你的程序崩潰)
我們可以用indexOf()和lastIndexOf()查找?紤]到有些網(wǎng)頁(yè)中(特別是論壇)會(huì)出現(xiàn)兩次以上的歌詞。也許是后一個(gè)發(fā)貼者貼了一個(gè)更準(zhǔn)確的歌詞或者其它情況(比如有人將它作為主題標(biāo)頭內(nèi)容發(fā)表)。我們這里使用lastIndexOf(),我們從后面開始查找(我們假定后一個(gè)歌詞比前一個(gè)歌詞更準(zhǔn)確)。并選取在它("[ti:突然的自我")之后的所有內(nèi)容用作后面的處理。
出處:藍(lán)色理想
責(zé)任編輯:藍(lán)色月光
上一頁(yè) 本地直接從百度獲取LRC歌詞 二 下一頁(yè) 本地直接從百度獲取LRC歌詞 四
◎進(jìn)入論壇Flash專欄版塊參加討論
|