返回列表 发帖

[文本处理] 【更新了问题】如何用批处理实现自动下载网络视频?

原问题1.0:
喜欢在网络上看电视,比如 :央视的《环球财经连线》连接:http://cctv.cntv.cn/lm/huanqiucaijinglianxian/    (该地址每一期并不改变)

可是,央视不提供直接下载,于是转到第三方网站“硕鼠官网” www.flvcd.com/      

输入《环球财经连线》的地址就会得到其真实地址了:

  解析连接:  http://www.flvcd.com/parse.php?f ... t=%BF%AA%CA%BCGO%21

可以看到该视频被切分成了8段,通过近几期的观察,其中的规律就在于后面的1、2、3、4、5、6、7、8、不同,那么好了,下载不就可以批处理了吗?

http://vod.cntv.lxdns.com/flash/ ... 000nero_aac32-1.mp4
http://vod.cntv.lxdns.com/flash/ ... 000nero_aac32-2.mp4
http://vod.cntv.lxdns.com/flash/ ... 000nero_aac32-3.mp4
http://vod.cntv.lxdns.com/flash/ ... 000nero_aac32-4.mp4
http://vod.cntv.lxdns.com/flash/ ... 000nero_aac32-5.mp4
http://vod.cntv.lxdns.com/flash/ ... 000nero_aac32-6.mp4
http://vod.cntv.lxdns.com/flash/ ... 000nero_aac32-7.mp4
http://vod.cntv.lxdns.com/flash/ ... 000nero_aac32-8.mp4


那么问题来了?如何通过批处理实现运行命令自动下载当天的视频

最后再将8段视频重命名为    日期-01。。。日期-08的mp4.


感谢5楼terse完美地解决了该问题,同时让我看到了批处理更迷人的一面,谢谢!

------------------------------问题2.0------------------------华丽的分割线-------------------------------------------------------------------------

后来,我发现,从《环球财经连线》的地址http://cctv.cntv.cn/lm/huanqiucaijinglianxian/ 直接解析出现了问题:

因为,该节目一天中有“午间版”、“晚间版”两个版块,于是在上述地址页面中看到了如下代码:

2015.01.13午间版:http://jingji.cntv.cn/2015/01/13/VIDE1421126100885196.shtml
2015.01.12晚间版:http://jingji.cntv.cn/2015/01/13/VIDE1421105440961859.shtml     (也许央视网管程序管理有问题,日期不匹配)

http://cctv.cntv.cn/lm/huanqiucaijinglianxian 在硕鼠网上直接解析出来的是昨天晚上的视频,不是今天中午最新的

其实我想下载的是最近一期的(刚更新的一期2015.01.13午间版)就要用到   http://jingji.cntv.cn/2015/01/13/VIDE1421126100885196.shtml  这个地址。

而这个地址需要从上述http://cctv.cntv.cn/lm/huanqiucaijinglianxian/ 页面代码中提取,那么问题又来了:


如何在固定地址  http://cctv.cntv.cn/lm/huanqiucaijinglianxian/  中提取出最新一期视频连接,把该连接放到第三方网站“硕鼠官网” www.flvcd.com/  中解析出视频地址,最后再下载下来?

这样,就可以实现:在下午就可以下载当天的午间版;在深夜就可以下载当天的晚间版了;


感谢amwfjhh不厌其烦地、完美地解决了该问题,谢谢!


------------------------------问题3.0------------------------华丽的分割线-------------------------------------------------------------------------

再以上两问题实现的最后,又如何将8段视频合并成一个整体,MP4格式(或其它用批处理可以实现的方式)

话说,这个问题是不是有点儿难为批处理了? 呵呵。等待大牛出现。。。

可以暴力一点:
@echo off
set "年=%date:~0,4%"
set "月=%date:~5,2%"
set "日=%date:~8,2%"
for /l %%a in (1 1 16) do down http://vod.cntv.lxdns.com/flash/mp4video38/TMS/%年%/%月%/%日%/aa7bf38105cc4efab5ccb038cd9903bc_h264418000nero_aac32-%%a.mp4   aa7bf38105cc4efab5ccb038cd9903bc_h264418000nero_aac32-%%a.mp4   2>nulCOPY
这个 down 换成 wget curl 什么的也都行
down.exe 下载
支持http的文件下载工具 - Filedownloader
wget下载
curl下载

TOP

http://vod.cntv.lxdns.com/flash/mp4video38/TMS/2015/01/11/aa7bf38105cc4efab5ccb038cd9903bc_h264418000nero_aac32-1.mp4

红色字体部分每天是不一样的。

TOP

抛砖引玉
wget -q "http://www.flvcd.com/parse.php?format=&kw=http%%3A%%2F%%2Fcctv.cntv.cn%%2Flm%%2Fhuanqiucaijinglianxian%%2F" -O - | sed "/下载地址:/!d; s/href=./\n/g" | sed "/http:/!d; s/. target=.*//" > 地址.txtCOPY

TOP

也来一个 需下载外部 wget.exe
@if(0)==(0) echo off
CScript.exe -NoLogo -E:JScript %0 >$
for /f "tokens=1*" %%i in ($) do wget -c -O %%i %%j
del $ & pause & exit
@end
var url = "http://www.flvcd.com/parse.php?format=&kw=http%3A%2F%2Fcctv.cntv.cn%2Flm%2Fhuanqiucaijinglianxian%2F&sbt=%BF%AA%CA%BCGO%21"
var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("Get",url,false);
xmlhttp.send();
var html = new ActiveXObject("htmlfile");
html.write(xmlhttp.responseText);
var text = html.getElementsByTagName('a');
var len = text.length;
var date = new Date();
var y = date.getFullYear();
var m = (date.getMonth()+1)>9?(date.getMonth()+1):'0' + (date.getMonth()+1);
var d=date.getDate()>9?date.getDate():'0' + date.getDate();
var name = '' + y + m + d + '-'
for (i=0; i<len; i++) {
   if (text[i].onclick) {
     var str = '' + text[i]
     var filename = name + str.replace(/.+?([^ -]*)$/,'$1');
     WScript.Echo(filename,str)
   };
};COPY

TOP

正则用得好,批量没烦恼……

TOP

回复 5# terse

这代码写的。。。。太赞了!!非常感谢!!

当然,没怎么看懂,对CScript 还很陌生,不过看到你的代码更觉得批处理这东西真的很赞!

请教一下:  

第2行: -E:JScript %0   部分应该如何理解?(只知道生成了以$命名的文件中,形成了下载列表)

第8行:  new ActiveXObject("Microsoft.XMLHTTP")    是不是所谓的创建XMLHttpRequset对象?不明白程序是如何运行的

第13行:.write(xmlhttp.responseText)       不明白


因为对CScript还很陌生,不知道要理解该程序还应该补习哪些知识(或者说是哪一方面),特此请教!

TOP

回复 7# 宫商角徵羽


VBS和JScript相关教程:
http://bbs.bathome.net/thread-13298-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

来一个纯脚本版的,只需要只支BAT与JScript,无需第三方wget或者Curl.
@if (0)==(0) echo off
setlocal enabledelayedexpansion
cscript -nologo -e:jscript %~s0 GetWebContent "http://cctv.cntv.cn/lm/huanqiucaijinglianxian/" "$"
set /a index=0
for /f "delims=" %%i in ('cscript -nologo -e:jscript %~s0 GetRegStr "$" "<BR><a\shref='([^']+)'[^>]+>[^<]+</a>"') do (
set /a index+=1
echo,!index! : %%i
CScript -nologo -E:jscript %~s0 DownloadFile "%%i" "%cd%\!index!.mp4"
)
:end
pause & goto :EOF
@end
var fun = WScript.arguments(0);
switch (fun){
case "GetWebContent":
if (WScript.arguments.length < 3) {
WScript.Echo("参数个数错误");
WScript.quit();
}
var url = WScript.arguments(1);
var fil = WScript.arguments(2);
GetWebContent(GetEncodeURIComponentStr(url), fil);
break;
case "DownloadFile":
if (WScript.arguments.length < 3) {
WScript.echo("参数个数错误");
WScript.quit();
}
var url = WScript.arguments(1);// + "?wshc_tag=1&wsts_tag=54b5d817&wsid_tag=abd9364e&wsiphost=ipdbm";
var fil = WScript.arguments(2);
GetWebContent(url, fil);
break;
case "GetEncodeURIComponentStr":
if (WScript.arguments.length < 2) {
WScript.echo("参数个数错误");
WScript.quit();
}
var url = WScript.arguments(1);
GetEncodeURIComponentStr(url);
break;
case "GetFileContent":
if (WScript.arguments.length < 2) {
WScript.Echo("参数个数错误");
WScript.quit();
}
var fil = WScript.arguments(1);
GetFileContent(fil);
break;
case "GetRegStr":
if (WScript.arguments.length < 3) {
WScript.Echo("参数个数错误");
WScript.quit();
}
var fil = WScript.arguments(1);
var regStr = WScript.arguments(2);
regStr = regStr.replace(/'/g, "\"");
GetRegStr(fil, regStr);
break;
default:;
}
function GetEncodeURIComponentStr(URL){
var encodeUrl = encodeURIComponent(url);
var webUrl = "http://www.flvcd.com/parse.php?format=&kw="
webUrl += encodeUrl;
WScript.echo(webUrl);
return webUrl;
}
function GetWebContent(url, fileName){
try{
var oHttp = new ActiveXObject("MSXML2.ServerXMLHTTP");
oHttp.open("Get", url, false);
WScript.echo("进入函数,传入参数为:" + url);
oHttp.send("");
if (oHttp.readyState == 4) {
WScript.echo("内容获取完毕");
//WScript.echo(oHttp.responseText);
var oStream = new ActiveXObject("adodb.stream");
oStream.Open();
oStream.Type = 1;
oStream.Write(oHttp.responseBody);
oStream.Position = 0;
var fso = new ActiveXObject("scripting.filesystemobject");
if (fso.fileExists(fileName)) fso.deleteFile(fileName);
oStream.SaveToFile(fileName);
WScript.Echo("写入文件:" + fileName);
oStream.close();
} else {
WScript.Echo("内容获取失败");
}
}catch (e){
WScript.echo(e.message);
}
}
function GetFileContent(fil){
var oStream1 = new ActiveXObject("adodb.stream");
oStream1.open();
oStream1.charset = "GBK";
oStream1.Type = 2;
oStream1.LoadFromFile(fil);
content = oStream1.ReadText();
oStream1.Close();
//WScript.Echo(content);
return content;
}
function GetRegStr(fil, regStr){
//WScript.echo("正则表达式内容 : " + regStr);
var reg = new RegExp(regStr, "g");
var content = GetFileContent(fil);
var ret = "";
while ((collection = reg.exec(content)) != null) {
//WScript.echo("正则匹配成功");
ret += collection[1] + "\r\n";
//WScript.echo(collection[1]);
}
WScript.Echo(ret);
return ret;
}COPY

TOP

本帖最后由 宫商角徵羽 于 2015-1-14 18:15 编辑

回复 8# Batcher

我知道有这么些书(厚厚的书)可以参考,

不过,我想知道的是,在这么一堆东西里,关注哪部分内容可以理解本程序?

麻烦,能给圈一下重点,谢谢。(还有,这个程序是用到jscript,还是vbs,还是两个都有?)

TOP

本帖最后由 宫商角徵羽 于 2015-1-14 21:56 编辑

回复 9# amwfjhh
谢谢你的答复:

不过,后来,我发现用http://cctv.cntv.cn/lm/huanqiucaijinglianxian 在硕鼠网上直接解析出来的的视频,未必是最新的。

其实我想下载的是最近一期的(刚更新的一期2015.01.14午间版)就要用到   http://jingji.cntv.cn/2015/01/14/VIDE1421213038989792.shtml  这个地址。

而这个地址需要从上述http://cctv.cntv.cn/lm/huanqiucaijinglianxian/ 页面代码中提取,那么问题又来了:


如何在固定地址  http://cctv.cntv.cn/lm/huanqiucaijinglianxian/  中提取出最新一期视频连接,把该连接放到第三方网站“硕鼠官网” www.flvcd.com/  中解析出视频地址,最后再下载下来?

这样,就可以实现:在下午就可以下载当天的午间版;在深夜就可以下载当天的晚间版了;

(另,前面代码美中不足是:1、缺了个进度条;2、最后文件名不能按日期保存;3、代码显得多了一点,呵呵,谢谢)

TOP

回复 10# 宫商角徵羽


    我没有见过这样的书,如果你哪天找到了记得给我分享一下。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 11# 宫商角徵羽


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

TOP

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

回复 11# 宫商角徵羽


    主体内容不变,只小改一下批处理中的调用即可达到你要的目的:
@if (0)==(0) echo off
setlocal enabledelayedexpansion
echo,取得最新一期视频播放地址
cscript -nologo -e:jscript %~s0 DownloadFile "http://cctv.cntv.cn/lm/huanqiucaijinglianxian/" "$"
for /f "delims=" %%i in ('cscript -nologo -e:jscript %~s0 GetRegStr "$" "<a\shref='([^']+)'\starget='_blank'\stitle=''>[^<]+</a>"') do (
  echo,%%i&echo,&echo,
  set "strVideoUrl=%%i"
  goto :next
)
:next
echo,传入视频播放地址,获取分析结果
cscript -nologo -e:jscript %~s0 GetWebContent "!strVideoUrl!" "$"
echo,&echo,
set /a index=0
for /f "delims=" %%i in ('cscript -nologo -e:jscript %~s0 GetRegStr "$" "<BR><a\shref='([^']+)'[^>]+>[^<]+</a>"') do (
  set /a index+=1
  echo,!index! : %%i
  CScript -nologo -E:jscript %~s0 DownloadFile "%%i" "%cd%\%date:~0,10%_!index!.mp4"
  echo,&echo,
)
:end
del /f $
pause & goto :EOF
@end
var fun = WScript.arguments(0);
switch (fun){
case "GetWebContent":
  if (WScript.arguments.length < 3) {
    WScript.Echo("参数个数错误");
    WScript.quit();
  }
  var url = WScript.arguments(1);
  var fil = WScript.arguments(2);
  GetWebContent(GetEncodeURIComponentStr(url), fil);
  break;
  
case "DownloadFile":
  if (WScript.arguments.length < 3) {
    WScript.echo("参数个数错误");
    WScript.quit();
  }
  var url = WScript.arguments(1);// + "?wshc_tag=1&wsts_tag=54b5d817&wsid_tag=abd9364e&wsiphost=ipdbm";
  var fil = WScript.arguments(2);
  GetWebContent(url, fil);
  break;
  
case "GetEncodeURIComponentStr":
  if (WScript.arguments.length < 2) {
    WScript.echo("参数个数错误");
    WScript.quit();
  }
  var url = WScript.arguments(1);
  GetEncodeURIComponentStr(url);
  break;
  
case "GetFileContent":
  if (WScript.arguments.length < 2) {
    WScript.Echo("参数个数错误");
    WScript.quit();
  }
  var fil = WScript.arguments(1);
  GetFileContent(fil);
  break;
  
case "GetRegStr":
  if (WScript.arguments.length < 3) {
    WScript.Echo("参数个数错误");
    WScript.quit();
  }
  var fil = WScript.arguments(1);
  var regStr = WScript.arguments(2);
  regStr = regStr.replace(/'/g, "\"");
  GetRegStr(fil, regStr);
  break;
  
default:;
}
function GetEncodeURIComponentStr(url){
  var encodeUrl = encodeURIComponent(url);
  var webUrl = "http://www.flvcd.com/parse.php?format=&kw="
  webUrl += encodeUrl;
  WScript.echo(webUrl);
  return webUrl;
}
function GetWebContent(url, fileName){
  try{
    var oHttp = new ActiveXObject("MSXML2.ServerXMLHTTP.4.0");
    oHttp.setProxy(1);
    oHttp.open("Get", url, false);
    WScript.echo("进入函数,传入参数为:" + url);
    oHttp.send("");
   
    if (oHttp.readyState == 4) {
      WScript.echo("内容获取完毕");
      //WScript.echo(oHttp.responseText);
      var oStream = new ActiveXObject("adodb.stream");
      oStream.Open();
      oStream.Type = 1;
      oStream.Write(oHttp.responseBody);
      oStream.Position = 0;
      
      var fso = new ActiveXObject("scripting.filesystemobject");
      if (fso.fileExists(fileName)) fso.deleteFile(fileName);
      
      oStream.SaveToFile(fileName);
      WScript.Echo("写入文件:" + fileName);
      oStream.close();
    } else {
      WScript.Echo("内容获取失败");
    }
   
  }catch (e){
    WScript.echo(e.message);
  }
}
function GetFileContent(fil){
    var oStream1 = new ActiveXObject("adodb.stream");
    oStream1.open();
    oStream1.charset = "GBK";
    oStream1.Type = 2;
    oStream1.LoadFromFile(fil);
   
    content = oStream1.ReadText();
    oStream1.Close();
   
    //WScript.Echo(content);
    return content;
}
function GetRegStr(fil, regStr){
  //WScript.echo("正则表达式内容 : " + regStr);
  var reg = new RegExp(regStr, "g");
  var content = GetFileContent(fil);
  var ret = "";
  
  while ((collection = reg.exec(content)) != null) {
    //WScript.echo("正则匹配成功");
    ret += collection[1] + "\r\n";
    //WScript.echo(collection[1]);
  }
  
  WScript.Echo(ret);
  return ret;
}COPY

TOP

回复 14# amwfjhh

谢谢,非常感谢!!

不过,好像哪里出现问题了呢?

TOP

返回列表