返回列表 发帖
正则用得好,批量没烦恼……

TOP

来一个纯脚本版的,只需要只支BAT与JScript,无需第三方wget或者Curl.
  1. @if (0)==(0) echo off
  2. setlocal enabledelayedexpansion
  3. cscript -nologo -e:jscript %~s0 GetWebContent "http://cctv.cntv.cn/lm/huanqiucaijinglianxian/" "$"
  4. set /a index=0
  5. for /f "delims=" %%i in ('cscript -nologo -e:jscript %~s0 GetRegStr "$" "<BR><a\shref='([^']+)'[^>]+>[^<]+</a>"') do (
  6. set /a index+=1
  7. echo,!index! : %%i
  8. CScript -nologo -E:jscript %~s0 DownloadFile "%%i" "%cd%\!index!.mp4"
  9. )
  10. :end
  11. pause & goto :EOF
  12. @end
  13. var fun = WScript.arguments(0);
  14. switch (fun){
  15. case "GetWebContent":
  16. if (WScript.arguments.length < 3) {
  17. WScript.Echo("参数个数错误");
  18. WScript.quit();
  19. }
  20. var url = WScript.arguments(1);
  21. var fil = WScript.arguments(2);
  22. GetWebContent(GetEncodeURIComponentStr(url), fil);
  23. break;
  24. case "DownloadFile":
  25. if (WScript.arguments.length < 3) {
  26. WScript.echo("参数个数错误");
  27. WScript.quit();
  28. }
  29. var url = WScript.arguments(1);// + "?wshc_tag=1&wsts_tag=54b5d817&wsid_tag=abd9364e&wsiphost=ipdbm";
  30. var fil = WScript.arguments(2);
  31. GetWebContent(url, fil);
  32. break;
  33. case "GetEncodeURIComponentStr":
  34. if (WScript.arguments.length < 2) {
  35. WScript.echo("参数个数错误");
  36. WScript.quit();
  37. }
  38. var url = WScript.arguments(1);
  39. GetEncodeURIComponentStr(url);
  40. break;
  41. case "GetFileContent":
  42. if (WScript.arguments.length < 2) {
  43. WScript.Echo("参数个数错误");
  44. WScript.quit();
  45. }
  46. var fil = WScript.arguments(1);
  47. GetFileContent(fil);
  48. break;
  49. case "GetRegStr":
  50. if (WScript.arguments.length < 3) {
  51. WScript.Echo("参数个数错误");
  52. WScript.quit();
  53. }
  54. var fil = WScript.arguments(1);
  55. var regStr = WScript.arguments(2);
  56. regStr = regStr.replace(/'/g, "\"");
  57. GetRegStr(fil, regStr);
  58. break;
  59. default:;
  60. }
  61. function GetEncodeURIComponentStr(URL){
  62. var encodeUrl = encodeURIComponent(url);
  63. var webUrl = "http://www.flvcd.com/parse.php?format=&kw="
  64. webUrl += encodeUrl;
  65. WScript.echo(webUrl);
  66. return webUrl;
  67. }
  68. function GetWebContent(url, fileName){
  69. try{
  70. var oHttp = new ActiveXObject("MSXML2.ServerXMLHTTP");
  71. oHttp.open("Get", url, false);
  72. WScript.echo("进入函数,传入参数为:" + url);
  73. oHttp.send("");
  74. if (oHttp.readyState == 4) {
  75. WScript.echo("内容获取完毕");
  76. //WScript.echo(oHttp.responseText);
  77. var oStream = new ActiveXObject("adodb.stream");
  78. oStream.Open();
  79. oStream.Type = 1;
  80. oStream.Write(oHttp.responseBody);
  81. oStream.Position = 0;
  82. var fso = new ActiveXObject("scripting.filesystemobject");
  83. if (fso.fileExists(fileName)) fso.deleteFile(fileName);
  84. oStream.SaveToFile(fileName);
  85. WScript.Echo("写入文件:" + fileName);
  86. oStream.close();
  87. } else {
  88. WScript.Echo("内容获取失败");
  89. }
  90. }catch (e){
  91. WScript.echo(e.message);
  92. }
  93. }
  94. function GetFileContent(fil){
  95. var oStream1 = new ActiveXObject("adodb.stream");
  96. oStream1.open();
  97. oStream1.charset = "GBK";
  98. oStream1.Type = 2;
  99. oStream1.LoadFromFile(fil);
  100. content = oStream1.ReadText();
  101. oStream1.Close();
  102. //WScript.Echo(content);
  103. return content;
  104. }
  105. function GetRegStr(fil, regStr){
  106. //WScript.echo("正则表达式内容 : " + regStr);
  107. var reg = new RegExp(regStr, "g");
  108. var content = GetFileContent(fil);
  109. var ret = "";
  110. while ((collection = reg.exec(content)) != null) {
  111. //WScript.echo("正则匹配成功");
  112. ret += collection[1] + "\r\n";
  113. //WScript.echo(collection[1]);
  114. }
  115. WScript.Echo(ret);
  116. return ret;
  117. }
复制代码

TOP

回复 11# 宫商角徵羽


    那只是提供一种解题思路,如何在不用第三方程序,仅靠微软的脚本便将之办到的情况,其实你说的问题都可以解决,代码写那么长也是为可扩展而那么写的,在BAT里面给几个页面的初始化变量,然后在JS脚本里面调用正则表达式,解析页面元素,下载相应内容。你说的要求,其实改一下初始页面,或者多几步解析页面的代码就可以了。至于按日期命名下载文件,就更不是事了……

TOP

本帖最后由 amwfjhh 于 2015-1-15 11:38 编辑

回复 11# 宫商角徵羽


    主体内容不变,只小改一下批处理中的调用即可达到你要的目的:
  1. @if (0)==(0) echo off
  2. setlocal enabledelayedexpansion
  3. echo,取得最新一期视频播放地址
  4. cscript -nologo -e:jscript %~s0 DownloadFile "http://cctv.cntv.cn/lm/huanqiucaijinglianxian/" "$"
  5. for /f "delims=" %%i in ('cscript -nologo -e:jscript %~s0 GetRegStr "$" "<a\shref='([^']+)'\starget='_blank'\stitle=''>[^<]+</a>"') do (
  6.   echo,%%i&echo,&echo,
  7.   set "strVideoUrl=%%i"
  8.   goto :next
  9. )
  10. :next
  11. echo,传入视频播放地址,获取分析结果
  12. cscript -nologo -e:jscript %~s0 GetWebContent "!strVideoUrl!" "$"
  13. echo,&echo,
  14. set /a index=0
  15. for /f "delims=" %%i in ('cscript -nologo -e:jscript %~s0 GetRegStr "$" "<BR><a\shref='([^']+)'[^>]+>[^<]+</a>"') do (
  16.   set /a index+=1
  17.   echo,!index! : %%i
  18.   CScript -nologo -E:jscript %~s0 DownloadFile "%%i" "%cd%\%date:~0,10%_!index!.mp4"
  19.   echo,&echo,
  20. )
  21. :end
  22. del /f $
  23. pause & goto :EOF
  24. @end
  25. var fun = WScript.arguments(0);
  26. switch (fun){
  27. case "GetWebContent":
  28.   if (WScript.arguments.length < 3) {
  29.     WScript.Echo("参数个数错误");
  30.     WScript.quit();
  31.   }
  32.   var url = WScript.arguments(1);
  33.   var fil = WScript.arguments(2);
  34.   GetWebContent(GetEncodeURIComponentStr(url), fil);
  35.   break;
  36.   
  37. case "DownloadFile":
  38.   if (WScript.arguments.length < 3) {
  39.     WScript.echo("参数个数错误");
  40.     WScript.quit();
  41.   }
  42.   var url = WScript.arguments(1);// + "?wshc_tag=1&wsts_tag=54b5d817&wsid_tag=abd9364e&wsiphost=ipdbm";
  43.   var fil = WScript.arguments(2);
  44.   GetWebContent(url, fil);
  45.   break;
  46.   
  47. case "GetEncodeURIComponentStr":
  48.   if (WScript.arguments.length < 2) {
  49.     WScript.echo("参数个数错误");
  50.     WScript.quit();
  51.   }
  52.   var url = WScript.arguments(1);
  53.   GetEncodeURIComponentStr(url);
  54.   break;
  55.   
  56. case "GetFileContent":
  57.   if (WScript.arguments.length < 2) {
  58.     WScript.Echo("参数个数错误");
  59.     WScript.quit();
  60.   }
  61.   var fil = WScript.arguments(1);
  62.   GetFileContent(fil);
  63.   break;
  64.   
  65. case "GetRegStr":
  66.   if (WScript.arguments.length < 3) {
  67.     WScript.Echo("参数个数错误");
  68.     WScript.quit();
  69.   }
  70.   var fil = WScript.arguments(1);
  71.   var regStr = WScript.arguments(2);
  72.   regStr = regStr.replace(/'/g, "\"");
  73.   GetRegStr(fil, regStr);
  74.   break;
  75.   
  76. default:;
  77. }
  78. function GetEncodeURIComponentStr(url){
  79.   var encodeUrl = encodeURIComponent(url);
  80.   var webUrl = "http://www.flvcd.com/parse.php?format=&kw="
  81.   webUrl += encodeUrl;
  82.   WScript.echo(webUrl);
  83.   return webUrl;
  84. }
  85. function GetWebContent(url, fileName){
  86.   try{
  87.     var oHttp = new ActiveXObject("MSXML2.ServerXMLHTTP.4.0");
  88.     oHttp.setProxy(1);
  89.     oHttp.open("Get", url, false);
  90.     WScript.echo("进入函数,传入参数为:" + url);
  91.     oHttp.send("");
  92.    
  93.     if (oHttp.readyState == 4) {
  94.       WScript.echo("内容获取完毕");
  95.       //WScript.echo(oHttp.responseText);
  96.       var oStream = new ActiveXObject("adodb.stream");
  97.       oStream.Open();
  98.       oStream.Type = 1;
  99.       oStream.Write(oHttp.responseBody);
  100.       oStream.Position = 0;
  101.       
  102.       var fso = new ActiveXObject("scripting.filesystemobject");
  103.       if (fso.fileExists(fileName)) fso.deleteFile(fileName);
  104.       
  105.       oStream.SaveToFile(fileName);
  106.       WScript.Echo("写入文件:" + fileName);
  107.       oStream.close();
  108.     } else {
  109.       WScript.Echo("内容获取失败");
  110.     }
  111.    
  112.   }catch (e){
  113.     WScript.echo(e.message);
  114.   }
  115. }
  116. function GetFileContent(fil){
  117.     var oStream1 = new ActiveXObject("adodb.stream");
  118.     oStream1.open();
  119.     oStream1.charset = "GBK";
  120.     oStream1.Type = 2;
  121.     oStream1.LoadFromFile(fil);
  122.    
  123.     content = oStream1.ReadText();
  124.     oStream1.Close();
  125.    
  126.     //WScript.Echo(content);
  127.     return content;
  128. }
  129. function GetRegStr(fil, regStr){
  130.   //WScript.echo("正则表达式内容 : " + regStr);
  131.   var reg = new RegExp(regStr, "g");
  132.   var content = GetFileContent(fil);
  133.   var ret = "";
  134.   
  135.   while ((collection = reg.exec(content)) != null) {
  136.     //WScript.echo("正则匹配成功");
  137.     ret += collection[1] + "\r\n";
  138.     //WScript.echo(collection[1]);
  139.   }
  140.   
  141.   WScript.Echo(ret);
  142.   return ret;
  143. }
复制代码

TOP

写入失败,是已有文件存在吗?你新建一个文件夹,在里面执行程序试试。

TOP

想到一种可能,也许是文件名规则导致写入失败的,你看一下你的系统日期格式,在cmd里面echo %date%看看是什么?如果是 2014/01/15 这类字样可能就是它的问题了,加一个日期处理吧,把格式变为合法的文件名格式。

TOP

  1. @if (0)==(0) echo off
  2. setlocal enabledelayedexpansion
  3. echo,取得最新一期视频播放地址
  4. cscript -nologo -e:jscript %~s0 DownloadFile "http://cctv.cntv.cn/lm/huanqiucaijinglianxian/" "$"
  5. for /f "delims=" %%i in ('cscript -nologo -e:jscript %~s0 GetRegStr "$" "<a\shref='([^']+)'\starget='_blank'\stitle=''>[^<]+</a>"') do (
  6.   echo,%%i&echo,&echo,
  7.   set "strVideoUrl=%%i"
  8.   goto :next
  9. )
  10. :next
  11. echo,传入视频播放地址,获取分析结果
  12. cscript -nologo -e:jscript %~s0 GetWebContent "!strVideoUrl!" "$"
  13. echo,&echo,
  14. set /a index=0
  15. set "today=%date:~0,10%"
  16. set "today=%today:/=%"
  17. set "today=%today:-=%"
  18. for /f "delims=" %%i in ('cscript -nologo -e:jscript %~s0 GetRegStr "$" "<BR><a\shref='([^']+)'[^>]+>[^<]+</a>"') do (
  19.   set /a index+=1
  20.   echo,!index! : %%i
  21.   CScript -nologo -E:jscript %~s0 DownloadFile "%%i" "%cd%\%today%_!index!.mp4"
  22.   echo,&echo,
  23. )
  24. :end
  25. del /f $
  26. pause & goto :EOF
  27. @end
  28. var fun = WScript.arguments(0);
  29. switch (fun){
  30. case "GetWebContent":
  31.   if (WScript.arguments.length < 3) {
  32.     WScript.echo("参数个数错误");
  33.     WScript.quit();
  34.   }
  35.   var url = WScript.arguments(1);
  36.   var fil = WScript.arguments(2);
  37.   GetWebContent(GetEncodeURIComponentStr(url), fil);
  38.   break;
  39.   
  40. case "DownloadFile":
  41.   if (WScript.arguments.length < 3) {
  42.     WScript.echo("参数个数错误");
  43.     WScript.quit();
  44.   }
  45.   var url = WScript.arguments(1);// + "?wshc_tag=1&wsts_tag=54b5d817&wsid_tag=abd9364e&wsiphost=ipdbm";
  46.   var fil = WScript.arguments(2);
  47.   GetWebContent(url, fil);
  48.   break;
  49.   
  50. case "GetEncodeURIComponentStr":
  51.   if (WScript.arguments.length < 2) {
  52.     WScript.echo("参数个数错误");
  53.     WScript.quit();
  54.   }
  55.   var url = WScript.arguments(1);
  56.   GetEncodeURIComponentStr(url);
  57.   break;
  58.   
  59. case "GetFileContent":
  60.   if (WScript.arguments.length < 2) {
  61.     WScript.echo("参数个数错误");
  62.     WScript.quit();
  63.   }
  64.   var fil = WScript.arguments(1);
  65.   GetFileContent(fil);
  66.   break;
  67.   
  68. case "GetRegStr":
  69.   if (WScript.arguments.length < 3) {
  70.     WScript.echo("参数个数错误");
  71.     WScript.quit();
  72.   }
  73.   var fil = WScript.arguments(1);
  74.   var regStr = WScript.arguments(2);
  75.   regStr = regStr.replace(/'/g, "\"");
  76.   GetRegStr(fil, regStr);
  77.   break;
  78.   
  79. default:;
  80. }
  81. function GetEncodeURIComponentStr(url){
  82.   var encodeUrl = encodeURIComponent(url);
  83.   var webUrl = "http://www.flvcd.com/parse.php?format=&kw="
  84.   webUrl += encodeUrl;
  85.   WScript.echo(webUrl);
  86.   return webUrl;
  87. }
  88. function GetWebContent(url, fileName){
  89.   try{
  90.     var oHttp = new ActiveXObject("MSXML2.ServerXMLHTTP.4.0");
  91.     oHttp.setProxy(1);
  92.     oHttp.open("Get", url, false);
  93.     WScript.echo("进入函数,传入参数为:" + url);
  94.     oHttp.send("");
  95.    
  96.     if (oHttp.readyState == 4) {
  97.       WScript.echo("内容获取完毕");
  98.       //WScript.echo(oHttp.responseText);
  99.       var oStream = new ActiveXObject("adodb.stream");
  100.       oStream.Open();
  101.       oStream.Type = 1;
  102.       oStream.Write(oHttp.responseBody);
  103.       oStream.Position = 0;
  104.       
  105.       var fso = new ActiveXObject("scripting.filesystemobject");
  106.       if (fso.fileExists(fileName)) fso.deleteFile(fileName);
  107.       
  108.       oStream.SaveToFile(fileName);
  109.       WScript.echo("写入文件:" + fileName);
  110.       oStream.close();
  111.     } else {
  112.       WScript.echo("内容获取失败");
  113.     }
  114.    
  115.   }catch (e){
  116.     WScript.echo(e.message);
  117.   }
  118. }
  119. function GetFileContent(fil){
  120.     var oStream1 = new ActiveXObject("adodb.stream");
  121.     oStream1.open();
  122.     oStream1.charset = "GBK";
  123.     oStream1.Type = 2;
  124.     oStream1.LoadFromFile(fil);
  125.    
  126.     content = oStream1.ReadText();
  127.     oStream1.Close();
  128.    
  129.     //WScript.echo(content);
  130.     return content;
  131. }
  132. function GetRegStr(fil, regStr){
  133.   //WScript.echo("正则表达式内容 : " + regStr);
  134.   var reg = new RegExp(regStr, "g");
  135.   var content = GetFileContent(fil);
  136.   var ret = "";
  137.   
  138.   while ((collection = reg.exec(content)) != null) {
  139.     //WScript.echo("正则匹配成功");
  140.     ret += collection[1] + "\r\n";
  141.     //WScript.echo(collection[1]);
  142.   }
  143.   
  144.   WScript.echo(ret);
  145.   return ret;
  146. }
复制代码

TOP

用格式工厂进行视频合并也可以,支持命令行。

TOP

对头,楼上说得对,你试试重新注册一下系统组件。

TOP

那应该是MSXML2.SEVERXMLHTTP.4.0这个组件问题了,百度下解决方案。

TOP

返回列表