上次写了一个 .NET从优酷专辑中采集所有视频及信息(VB.NET代码) http://www.cnblogs.com/clso/archive/2010/01/09/1642952.html
个人觉得不甚满意,因为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 >
夜闻香原创,转载请保留此信息,万分感谢!
博客: 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测试通过,但代码比较随意,所以兼容性不是很好。如果你需要使用,请自行修改代码。