把上面的代码复制,保存为htm文件,打开运行1.当500个mp3的真实地址在页面显示后,然后
右键---用讯雷下载全部链接,那感觉不是一般的爽,全部下载后
进入讯累已下载栏目,选择刚刚下的歌,鼠标右键弹出讯雷菜单  选"重命名"--->"注释作为文件名",又是一种爽,看着几百个歌整整齐齐的摆在那里了2.因为是娱乐,所以没有那么多时间考虑兼容非ie浏览器啦。
而且我个人只喜欢 *.mp3文件,可偏偏里面有两首歌只提供 wma 文件,喜欢其他格式音乐的朋友
只需要在代码中修改不到10个字母就可以下载wma文件了。3.几乎每首歌曲baidu都给我们提供了好几十个下载连接。而且给出的mp3文件大的有七八兆,
小的还不到1兆。而且并不一定baidu所提供的链接都可以100%连通。
那到底挑哪个下载呢,程序无法判断,只能随机选择两个。一个下载,另一个备用,当你发现
有mp3不能下载,或者下的歌太小想重新下的时候,点一下更改链接地址那个按纽,把下载地址更换为备用地址,再重新下载4.上一个版本中速度慢是因为对 responseBody的编码导致ie假死机。 这个版本用responseText
所以速度快了100多倍。 虽然responseText取回来的东东汉字是乱码,但这并不妨碍我们取歌的
地址。为了速度考虑,凡下载地址中含汉字的地址我都抛弃掉了。

解决方案 »

  1.   

    其实可以更快的。因为ajax是异步的嘛改这里:
    for(var i=0;i<mp3ToDownNum;i++){ //保存歌名到数组
        mp3NameList.push(arr[i].replace('><a href="http。
        (new XHConn()).connect(mp3SeachUrl.replace("$$$",mp3NameLi。。
    }
    修改以前,mp3文件信息一个接着一个获取的。(要排队,恩~)
       比方说,如果第3个mp3的信息还没有取回来,就不会去取下一个mp3(第四个)修改后,取mp3文件信息无须排队的
       可能文件2的信息还正在读取,文件5,文件6的结果就已经返回来了。
       这样程序会快很多。但是正因为不要排队,会造成歌名和排序混乱。(打个比方
    排本来排序为 1.GGG 2.BBB  3. DDD 4.YYY 可能取回来后是 1.YYYY 2. BBBB 3.DDDD)在我的机子上,代码非要这样写,他在工作for(var i=0;i<mp3ToDownNum;i++){ //保存歌名到数组
        mp3NameList.push(arr[i].replace('><a href="http。
    }
    for(var i=0;i<mp3ToDownNum;i++){ //保存歌名到数组
       (new XHConn()).connect(mp3SeachUrl.replace("$$$",mp3NameLi。。
    }
    下面这样就罢工哦,莫名奇妙。 for(var i=0;i<mp3ToDownNum;i++){ //保存歌名到数组
        mp3NameList.push(arr[i].replace('><a href="http。
        (new XHConn()).connect(mp3SeachUrl.replace("$$$",mp3NameLi。。
    }
      

  2.   

    可以用的,我们一直用它mybaby11(), 你那边的错误提示是什么呢?
      

  3.   

    呵呵,现在做MP3批量下载的很多啊,楼主的办法也很有创意,不过我见过MP3批量下载做得最好的是http://www.boloo.com.cn,他们把这个概念做到了最好.
      

  4.   

    如果代码出错不能运行,请用这个最新修改的版本
    我其实在发贴之前是排过版的,代码可读性很好,万恶的CSDN把排版都搞没了
    <script language=vbs>
    '秋水无痕写的函数,以前CSDN的高手哦   
    function urldecoding(vstrin)    'url解码,  把%B8%DF%CA%D6之类的字符串还原为汉字
    dim i,strreturn,strSpecial
    strSpecial = "!""#$%&'()*+,/:;<=>?@[\]^`{|}~%"   '特殊字符
    strreturn = ""
    for i = 1 to len(vstrin)
    thischr = mid(vstrin,i,1)
    if thischr="%" then
    intasc=eval("&h"+mid(vstrin,i+1,2))
    if instr(strSpecial,chr(intasc))>0 then
    strreturn= strreturn & chr(intasc)
    i=i+2
    else
    intasc=eval("&h"+mid(vstrin,i+1,2)+mid(vstrin,i+4,2))
    strreturn= strreturn & chr(intasc)
    i=i+5
    end if
    else
    if thischr="+" then
    strreturn= strreturn & " "
    else
    strreturn= strreturn & thischr
    end if
    end if
    next
    urldecoding = strreturn
    end function
    </script>
    <SCRIPT LANGUAGE=javascript>
    function XHConn(){
      var xmlhttp, bComplete = false;
      try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
      catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
      catch (e) { try { xmlhttp = new XMLHttpRequest(); }
      catch (e) { xmlhttp = false; }}}
      if (!xmlhttp) return null;  
      this.connect = function(sURL, sMethod, sVars, fnDone) {
    if (!xmlhttp) return false;
    bComplete = false;
    sMethod = sMethod.toUpperCase();
    try {
    if (sVars) sURL=sURL+"?"+sVars
    xmlhttp.open(sMethod, sURL,true);
    sVars = null;
    xmlhttp.onreadystatechange = function(){
    if (xmlhttp.readyState == 4 && !bComplete){
    bComplete = true;
    fnDone(xmlhttp)
    }};
    xmlhttp.send(sVars);
    }
    catch(z) { return false; }
    return true;
    };
    return this;
    }function showMp3Links(){
    //top 500 mp3的地址
    var top500url="http://list.mp3.baidu.com/topso/mp3topsong.html"   // 把$$$改为你要的歌名就可以去baidu搜歌了  $$$可以是汉字,也可以是编码后的 %B8%DF%CA%D6
    // 注意这里只下载 *.mp3文件,喜欢rm,wma的改下面这句
    var mp3SeachUrl=new String("http://mp3.baidu.com/m?f=ms&tn=baidump3&ct=134217728&lf=&rn=&word=$$$&lm=0")//要下载的mp3的总数目,这个数字不要超过501,否则...
    var mp3ToDownNum=500
    var myConn = new XHConn();//这个数组保存要下载的歌名,注:编码过的歌名哦 类似 %B8%DF%CA%D6 
    var mp3NameList=new Array()  
    var curIndex=0      //指示当前正在第几首的歌var get500Mp3Name = function (oXML) { 
    //         ><a href="http://mp3.baidu.com/m?tn=baidump3&ct=134217728&lm=-1&li=500&word=%C1%A6%BA%EA" 
    var reg=/\>\<a href\=\"http\:\/\/mp3\.baidu.com\/m\?tn\=baidump3\&ct\=134217728\&lm=\-1\&li\=500\&word\=\S+[^\"]/gi;
    var arr = oXML.responseText.match(reg);
    mp3NameList.length=curIndex=0 for(var i=0;i<mp3ToDownNum;i++){ //保存歌名到数组
    try{
    mp3NameList.push(arr[i].replace('><a href="http://mp3.baidu.com/m?tn=baidump3&ct=134217728&lm=-1&li=500&word=','').replace('" ',''))
    }catch(x){continue}
    }
    //开始获取第一首歌的真实下载地址
    myConn.connect(mp3SeachUrl.replace("$$$",mp3NameList[0]), "get",null, getDownloadInfo);
    };var getDownloadInfo=function(oXML){
     var htmltext=oXML.responseText
     // 匹配一个真实下载地址,以http://开头, .mp3结束,注意排除了url中有汉字的情况
     //    http://xxx.xxx.xx/xxx/xxx.mp3 
     var reg=/  http\:\/\/[(\w|\.|\/|\,]+\.mp3/gi;
     //匹配类似  rn=20&tn=news&word=%B4%F3%B3%C7%D0%A&t=12" 的字符,因为%B4%F3%B3%C7%D0%A这些就是歌名啊 
     var reg2=/rn\=20\&tn\=news\&word\=[\.|\S]+[^\"]/i;
     var arr=htmltext.match(reg)
     var mp3name=""
     try{       //获取歌名,得到的是汉字,而不是 %B4%F3%B3%C7%D0%A之类的鬼东西 
    var arr2=htmltext.match(reg2)
     mp3name=urldecoding(arr2[0].replace("rn=20&tn=news&word=","").replace('&t=12" ',''))
    }catch(x){
    try{        
    mp3name=urldecoding(arr2[0].replace("rn=20&tn=news&word=","").replace('&t=12" ','').split("+")[0])
    }catch(x){}
     }
     // 其实一个页面一般不止一个有效下载地址,正则是按随机顺序匹配所有符合要求的地址存到数组。 
     if (arr){  //找到了
    // 顺便保存第二个有效地址做备用
    addLinks(arr[0].replace("  ",""),mp3name,(arr.length>1)?arr[1]:"")
    }else{   //找不到的话连接指向搜索页面,让使用者手工下载
    addLinks(mp3SeachUrl.replace("$$$",mp3NameList[curIndex]),"<font color=red>错误,点击手动下载</font>","")
    }
    if (++curIndex<mp3ToDownNum) {  //处理下一个
    myConn.connect(mp3SeachUrl.replace("$$$",mp3NameList[curIndex]), "get",null, getDownloadInfo);
    }else{
    o.value =" 所有歌曲已全部获取"
    alert(o.value)
    if (document.all) o.scrollIntoView()
    }
    };
    var addLinks=function(url,txt,rel){
    o.value =[" 正在获取第",curIndex+1,"首歌曲的信息..."].join("")
    var link=document.createElement("A")
    link.innerHTML=[curIndex+1,txt].join(".")
    link.href=url
    link.rel=rel   //rel 保存第二个有效下载地址做备用
    link.style.cssText="display:block;font-size:15px"
    link.target="_blank"var t=document.getElementById("linklist") 
    var tr=(curIndex % 4==0)?t.insertRow():t.rows[t.rows.length-1]
    var td=tr.insertCell();
    td.appendChild(link) 
    if (curIndex % 10==0) tr.scrollIntoView()
    };if (!myConn) return "退出,ajax无法初始化"
    myConn.connect(top500url, "get",null, get500Mp3Name); //开始干活
    }function updateLinks(){
    var arr=document.links
    if (!arr.length) return alert("没有要更新的歌曲,请先获取歌曲")
    for(var i=0;i<arr.length;i++){
    if (arr[i].rel) arr[i].href=arr[i].rel       
    }
    alert("所有歌曲的下载地址已经重新更新,请点击下载")
    }
    </script>
    <body leftmargin=0>
    <input type=button onclick="javascript:this.disabled=true;o.style.display='';showMp3Links()" value="获取Top500歌曲">
    <input type=button onclick="javascript:updateLinks()" value="更新链接的地址">
    <input type=text value=" 正在连接  mp3.baidu.com..." style="display:none;margin-left:80px" id=o readonly size=35>
    <table id="linklist" width=100% border><tbody></tbody></table>
    </body>