看看用 "网页快照" ("快照" )截断的方式: ********************************* </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">类似网页</a></nobr> <p class=g> <a class=l href="http://www.rixiu.com/fei5/11/1140657ae45bc98.html" 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 - 补充材料 - </font> <nobr><a class=fl href="http://72.14.203.104/search?q=cache:jsIjyqajvhcJ:www.rixiu.com/fei5/11/1140657ae45bc98.html+%5Bti:%E6%8A%AB%E7%9D%80%E7%BE%8A%E7%9A%AE%E7%9A%84%E7%8B%BC&hl=zh-CN" target=_blank>网页快照 </font> ********************************* 下面的处理事实上就是一层层剥离数据的过程。
第一句 linkData[i] = linkData[i].slice(0, linkData[i].lastIndexOf("<a")) 的作用是只取上面源代码的一部份用作后面的处理,这样有利于后面的操作和简化你的视野。
选取有特征的字符串在这里很重要。 看看上面的这段代码,关于搜索结果的那一段("<font size=-1>郑源/披着羊皮的狼.LRC......c98.html</span> - 6k")都是不能作为特征进行数据搜索处理的,因为它们会随着搜索结果的不同而改变。所有可用的就是关于超链接的部份(搜索引擎不管如何更改他们的页面,点向最终页面的这个链接始终都是会存在的,随着时间的推移,在很长一段时间内也都是如此,这里有为你考虑到程序的寿命问题,也就是说,你写的这段程序在很长的一段时间内都是有用的)。
也就是源代码中的"<a href= " 和"</a>"标签。在这里我们用了"<a"作为特征字符串并只取在这之前的数据。我们将从后面剥离最后一个超链接以使结果从后面开始第一个超链接就是我们想要的数据。 linkData[i].lastIndexOf("<a") 找到最后一个 "<a"出现的位置,也就是在这个地方: ......补充材料 - </font><nobr><a class=fl href="http://72.14.203.104/ ..... linkData[i] = linkData[i].slice(0, linkData[i].lastIndexOf("<a")) 取它之前的数据。也就是这一段: </a> - <a class=fl href="/search?hl=......6k - 补充材料 - </font><nobr> (补充一句,考到锚点和结果文字多少的情况,事实上用"</a"作为特征字符串处理可能更好一些,这样这一次处理的结果就剩下这段代码了): ********************************* </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">类似网页</a></nobr> <p class=g> <a class=l href="http://www.rixiu.com/fei5/11/1140657ae45bc98.html" target=_blank onmousedown="return clk(0,'res','2','')">郑源/披着羊皮的狼.LRC 飞舞歌词fei5.com</a> *********************************
对比一下上面用"类似网页"截断的数据,要处理到这一步,就需要重复处理两次。(因为 "<a" 的超链接在从后向前查找的过程中,有出现两次,这就是为什么要选择 "网页快照" 作为我们截断重复区块的原因)
第二句 linkData[i] = linkData[i].slice(linkData[i].lastIndexOf("href=")+6) 从后面查找 "href="(现在最后的一个超链接区域就是我们想要的链接了,这就是为什么我们用lastIndexOf从后面搜索)。不过稍微不同的是,现在取在"href="之后的字符串(上一步是之前)。经过这次处理剩下的代码如下: ********************************* 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("\"")) 取得第一个引号以前的字符串。这里我讲一下为什么不用 target= 或者.html 作为特征处理的原因,上面的代码实际上也可以将 target= 放在后面,也不会影响最终页面的结果。像这样: www.rixiu.com/fei5/11/1140657ae45bc98.html"; onmousedown="return clk(0,'res','2','')" target=_blank>郑源/披着羊皮的狼.LRC 飞舞歌词fei5.com</a> 所以,它是不可识别和预知的。而.html 则并不是因为所有网页都是以.html作为结尾的,有些可能是.htm ,有些更可能是像?sl=11&word=aa这样动态生成的格式。(其实" 也并不是非常稳健的方式,因为有些不标准的网页可能将引号" 去除,这时候替代的方法是使用空格) ********************************* www.rixiu.com/fei5/11/1140657ae45bc98.html *********************************
现在最终我们得到了这个超链接。
通过上面的for (var i = 0; i<linkData.length; i++) { 循环,我们得到了这个页面的所有通过最终页面的链接(在百度中是10个)并将它们放入一个数组中。
现在我们已经得到了搜索结果页面的每个通向最终页面的链接(Google 和百度都如此,教程中对两者的特征字作了兼容),在百度中,一般而言,只要打开第一个链接就可以了。准确性差不多高过95%。
openLRCPage(linkData[0])
linkIndex = 1 这句就不说了,用来处理一些逻辑。使它可以在第一个链接失效的时候也能继续运行。
function openLRCPage(url) { myLoadVars.load(url); myLoadVars.onData = getLRC; }
这个和一开始加载搜索结果的代码很相似,只不过将处理的函数传给了 getLRC。
function getLRC(src) { htmlData = src.slice(src.lastIndexOf("[ti:"+musicName)); findEndTag(); ...... 现在开始处理最终的含有LRC内容的网页了(从搜索引擎中打开)。最终的结果页可能如下:
(前面省略) [ti:突然的自我] [ar:黄小琥] [al:] [by:wolfpey] [offset:500] [00:02.67]《突然的自我》 [00:10.12]作词:伍佰 徐克 [00:11.67]作曲/编曲:伍佰 [00:12.30]演唱:黄小琥 (后面省略)
具体请从搜索引擎打开几个用"[ti:突然的自我"搜索的页面看看。现在我们直接取在我们想要的LRC内容开始后的网页代码。也就是以 "[ti:"+musicName) 为特征开始的网页代码。(为了便于观察,我这里以实际显示的内容为参考,并没有列出网页的源代码,但它们有时是可以相互通用的,在网页源代码都会包含最终显示的内容,某些特殊的转义字符除外。只是更为杂乱。插一句,有些网页的源代码确实够乱的,很可能让你的程序崩溃)
我们可以用indexOf()和lastIndexOf()查找。考虑到有些网页中(特别是论坛)会出现两次以上的歌词。也许是后一个发贴者贴了一个更准确的歌词或者其它情况(比如有人将它作为主题标头内容发表)。我们这里使用lastIndexOf(),我们从后面开始查找(我们假定后一个歌词比前一个歌词更准确)。并选取在它("[ti:突然的自我")之后的所有内容用作后面的处理。
出处:蓝色理想
责任编辑:蓝色月光
上一页 本地直接从百度获取LRC歌词 二 下一页 本地直接从百度获取LRC歌词 四
◎进入论坛Flash专栏版块参加讨论
|