js+AJAX异步从优酷专辑中采集所有视频及信息

http://www.glzy8.com/article/22031.htm

  个人觉得不甚满意,因为VB.NET在.NET环境下执行采集,产生的网络连接与正则匹配消耗太大,而我最终的应用是在视频采集提交上,所以就考虑用JS的AJAX+正则表达式来完成这个目标。

  以前一直没有系统地学习JS和正则,所以花费的时间比预想的要长,折腾了一个晚上,糊弄出了下面的代码。=..=

  代码

  

复制代码 代码如下:

  <!--

  夜闻香原创,转载请保留此信息,万分感谢!

  博客: http://clso.cnblogs.com

  主页: http://cleclso.cn

  QQ:315514678 E-mail:clso#qq.com

  欢迎技术交流!

  -->

  <html>

  <head>

  <title>JavaScipt AJAX & 正则表达式 test</title>

  <script type="text/javascript" language="javascript">

  function wrt(s){

  subret.value = s + "\n" + subret.value;

  //subret.value += "\n" + s;

  }

  var objRequest; //定义一个XML请求对象

  var previd = "",nowid =0,listid = "",iscancel=false; //其他变量

  function getlid(){

  var listid = weburl.value.match(/playlist_show\/.*(?=id_(\d+)).*\.html$/i);

  if(!listid){

  return null;

  } else {

  return listid[1];

  }

  }

  function retweb(){

  if(objRequest.readyState == 4 && objRequest.status == 200){

  // 获得回调

  var webstr = objRequest.responseText;

  vid = webstr.match(/var\s+videoId\s*=\s*"(\d+)"\s*;/)[1];

  vtitle = webstr.match(/<title>(.+) - (.+) - 视频 - 优酷视频 - 在线观看( - )?<\/title>/)[2];

  wrt(nowid + ":" + vtitle + "=" + vid);

  if(previd == vid) return;

  previd = vid;

  nowid += 1;

  // 开始新循环

  if(iscancel) return;

  tstart();

  } else {

  //alert("回调失败!");

  return;//"error: " + objRequest.statusText;

  }

  }

  function getweb(u){

  objRequest = new XMLHttpRequest(); //new ActiveXObject("Msxml2.XMLHTTP"); //IE5&6初始化XMLHTTP对象

  objRequest.onreadystatechange = retweb; //异步回调方法

  objRequest.open("GET",u,true);

  objRequest.send(null);

  }

  function tstart(){

  if(listid==""){

  listid=getlid();

  }

  url = "http://v.youku.com/v_playlist/f" + listid + "o1p" + nowid + ".html";

  getweb(url);

  }

  </script>

  </head>

  <body>

  <input type="text" id="weburl" value="http://www.youku.com/playlist_show/id_2350764.html" style="width:640" /><br />

  <textarea id="subret" readonly="readonly" style="width:640; height:360;">#star</textarea>

  <br/>

  <input type=button value="开始提取专辑" onclick="if(iscancel)iscancel=false;tstart();" />

  <input type=button value="清除文本" onclick="subret.value='';nowid =0;preid='';listid='';" />

  <input type=button value="暂停" onclick="iscancel=true;" />

  </body>

  </html>

  思路基本跟上次的一样,所以就不多赘述了。

  用VB.NET一个页面的采集时间一般在1秒钟左右,而这个代码依靠客户端脚本,每个页面采集在0.3~0.5秒左右,依据用户的电脑配置而不同。

  个人用IE7测试通过,但代码比较随意,所以兼容性不是很好。如果你需要使用,请自行修改代码。