准备工作

  起因是因为这个网站:http://i.youku.com/kmsfan 这个是一个叫做冒险岛的游戏的资讯论坛,以前我经常在里面传视频,现在我不玩这个游戏了,但是很多玩家还是经常到我的网站里面去看视频,所以我觉得有点不好意思,我觉得开发出一款自动上传下载的工具比什么都好,也不耽误我时间。需要准备一些插件,这些插件都可以从Nuget里面找到,比如Newtonsoft.Json啊HtmlAgilityPack ,不过目前为止也只用到了这些东西。还有我没有做youtube视频的下载,我只做了Daum tv的视频解析,因为Insoya视频区大部分都是上传到Daum Tv 的视频。

Insoya视频区结构解析

  我先不放代码,大家先要对网站的文件解析有个大概的了解才行吧?我的想法就是:解析当天的视频。因为Insoya是一个韩国网站,所以韩文什么的思密达什么的就不要再吐槽了。这是视频区的地址:http://www.insoya.com/bbs/zboard.php?id=ucc

  大家可以把手指指向链接,可以发现:视频的ID是一个自增长的。比如:

  http://www.insoya.com/bbs/zboard.php?id=ucc&no=58158

  http://www.insoya.com/bbs/zboard.php?id=ucc&no=58157

  http://www.insoya.com/bbs/zboard.php?id=ucc&no=58156.....略掉了。。。

  我们随便点一个进去,如果我们想获得视频的标题啊,URL啊,还有发布日期的话,就可以从里面获取,下面框框就是:

需要知道的几件事情

  第一,我们从Daum Tv上面获取视频的真实地址,具体可以参考优酷,因为有点难度,视频的地址通常只是给了ID,所以我们还必须获取真实地址:不过StackoverFlow上面我得到了答案 ,哈哈多亏这位老兄。下面是daumTv 的调用API,后面的Vid是视频的ID.

        public static string daumAPI = "http://videofarm.daum.net/controller/api/closed/v1_2/IntegratedMovieData.json?vid=";

  光有了api不行,因为我们是从inosya网站里面去得到视频的真实地址,所以我们还需要有一个解析工具就是HtmlAgilityPack .为此我们需要知道网站是怎么在HTML结点里面存储这些东西的(标题,URL等)。下面几张图可以帮你解惑。下面这张图中指向的是URL,我们想,如果这些ID都是连续的话,那我是不是在第一页获取一个最大的ID,那其他的ID是不是可以都得出来了呢?

下面图是内容页的,我们可以看到时间是存储到这个CLASS里面的,也许我们有疑问,为什么我要标注CLASS呢,嘿嘿,别急,等下你就知道了。

编码1:获取文件的真实地址

  因为我们是从INSOYA网站里面去获取,INSOYA采用的是iframe方式,所以我们并没有在daumTV里面弄。我的想法是弄到DAUM TV的真实页面地址。

public static string GetDownloadUrls(stringvideoUrl){string vid = "";if (videoUrl == null){throw new ArgumentNullException("video Url can not be null");}//是否是标准的daumtv链接,并输出链接地址和视频IDbool isDaumUrl = TryNormalizeDaumTvUrl(videoUrl, out videoUrl,outvid);if (!isDaumUrl){throw new ArgumentException("It is not a daum Url");}string vLink = "";try{//通过DAUM API获得返回的JSONvar json = LoadJson(daumAPI +vid);//通过JSON获得文件的真实地址。vLink =GetVideLink(json);}catch(Exception ex){ }returnvLink;}

GetDownloadUrls(获取下载URL)

/// <summary>///把从insoya.com中获取的视频地址转换为标准的DAUM TV的视频地址/// </summary>/// <param name="url"></param>/// <param name="normalizeUrl"></param>/// <returns></returns>public static bool TryNormalizeDaumTvUrl(string url, out string normalizeUrl, out stringvId){url=url.Trim();string videoId = "";if (url.IndexOf("videofarm") != -1){int firstParam = url.IndexOf('=');int secondParam = url.IndexOf('&')-1;videoId= url.Substring(firstParam + 1, secondParam -firstParam);url= "http://tvpot.daum.net/v/" +videoId;}vId=videoId;normalizeUrl=url;return true;}

TryNormalizeDaumTvUrl(转换INSOYA内嵌视频地址为标准的DAUM TV视频地址)

        private static JObject LoadJson(stringurl){string pageSource =HttpHelper.DownloadString(url);if (!IsVideoValid(pageSource)){throw new Exception("video not valid");}returnJObject.Parse(pageSource);}public classHttpHelper{public static string DownloadString(stringurl){using (var client = newWebClient()){client.Encoding=System.Text.Encoding.UTF8;returnclient.DownloadString(url);}}}

LoadJson(把返回的JSON以字符串形式下载下来)

编码2:分析HTML结点并存储

  首先我们需要得到HTML结点的数据并存储。我的想法是从主页面进去也就是:http://www.insoya.com/bbs/zboard.php?id=ucc 然后再区最大的ID,那样就可以把第一页的所有东西都取到了 o(╯□╰)o。,用的是HtmlAgilityPack 有不懂的自己百度吧。

 private static intgetMaxIdOfVideo(){HtmlWeb docWeb= newHtmlWeb();HtmlDocument doc= docWeb.Load("http://www.insoya.com/bbs/zboard.php?id=ucc&page=1&divpage=12");IList<int> b = new List<int>();foreach (HtmlNode numbers in doc.DocumentNode.Descendants("td").Where(d=>d.Attributes.Contains("class")&&d.Attributes["class"].Value.Contains("eng w_num"))){inta;int.TryParse(numbers.InnerText, outa);if (a != 0){b.Add(a);}}returnb.Max();}

getMaxIdOfVideo(获取视频页面的最新视频的ID)

  下面的就是最重要的了,就是抓取视频标题,视频URL等,当然我们首先需要建立一个Model然后返回的是这个Model的List.

    public classVideoModel{public int VideoId { get; set; }public string VideoUrl { get; set; }public string Title { get; set; }public DateTime PubTime { get; set; }}

VideoModel(视频实体模型)

public static IList<VideoModel>GrabVideoInfo(){int max=getMaxIdOfVideo();int staticMax =max;IList<VideoModel> models = new List<VideoModel>();do{VideoModel model=newVideoModel();HtmlWeb innerDocWeb= newHtmlWeb();HtmlDocument innerDoc= innerDocWeb.Load(insoyaUcc +max);//标题foreach (HtmlNode title in innerDoc.DocumentNode.Descendants("a").Where(d =>d.Attributes.Contains("name") && d.Attributes["name"].Value.Contains("pv9"))){model.Title=title.InnerText;break;}//日期foreach (HtmlNode title in innerDoc.DocumentNode.Descendants("span").Where(d =>d.Attributes.Contains("class") && d.Attributes["class"].Value=="eng")){DateTime date;DateTime.TryParse(title.InnerText,outdate);if (date != null){model.PubTime=date;break;}}//视频地址foreach (HtmlNode title in innerDoc.DocumentNode.Descendants("iframe").Where(d =>d.Attributes.Contains("title") && d.Attributes["title"].Value.Contains("maplestory_ucc"))){string oldUrl = title.Attributes["src"].Value;string newUrl =GetDownloadUrls(oldUrl);model.VideoUrl=newUrl;break;}model.VideoId=max;models.Add(model);Console.WriteLine("ID:"+max + "has accomplish grabbed!");--max;}while (max >= staticMax - 20);returnmodels;}

GrabVideoInfo(获取视频模型)

  好了,到此为止我们就可以抓取到视频模型了。

尚未完成的工作

  当然了,才完成了30%,还要自动上传视频到优酷,还有要把韩文翻译成最合适的中文,如果我做出来了,会和大家分享的,首先是上传到优酷。有兴趣的同好可以看看优酷开放平台。

C#控制台程序取得INSOYA视频区的视频的真实URL,视频标题,发布时间集合。相关推荐

  1. 海康威视SDK控制台程序consoleDemo将实时码流保存为视频文件mp4

    陈拓 2021/08/28-2020/08/29 1. 概述 在<海康威视SDK控制台程序consoleDemo> https://zhuanlan.zhihu.com/p/4039038 ...

  2. 海康威视SDK控制台程序consoleDemo获取视频通道参数

    陈拓 2021/08/27-2020/08/27 1. 概述 在<海康威视SDK控制台程序consoleDemo> https://zhuanlan.zhihu.com/p/4039038 ...

  3. Flask学习 黑马程序员-6节课入门Flask框架web开发视频(中途撤退,寻找py3教程)

    文章目录 postman工具 get和post 如何给路由传参 解析 @app.route('')这个叫视图函数 Jinja2模板引擎 动态传参 注释.变量代码块以及控制代码块的使用 注释:ctrl+ ...

  4. 小程序博客资源娱乐网带微信流量主激励视频

    介绍: 新增:金刚区支持跳转业务域名(个人小程序不支持)新增:wordpress后台公众号文章(焦点)开关新增:资源下载提取密码新增:支持wordpress文章中添加小程序流量主AD,图组新增:腾讯视 ...

  5. c 语言 控制台程序 行字体颜色,C# 控制台程序设置字体颜色

    这几天做了个程序,程序本身很简单.大体功能是输入查询条件,从数据库里取出结果计算并显示.但是用户的要求是使用控制台(console)来实现功能.由于功能简单,程序很快就做完了,在面向用户演示程序时,突 ...

  6. 海康威视SDK控制台程序consoleDemo

    陈拓 2021/08/10-2020/08/10 1. 下载海康威视SDK 见<海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt)> https://zhuanlan.z ...

  7. 海康威视SDK控制台程序consoleDemo获取码流

    陈拓 2021/08/28-2020/08/28 1. 概述 在<海康威视SDK控制台程序consoleDemo> https://zhuanlan.zhihu.com/p/4039038 ...

  8. delphi 类的写法 和 控制台程序的制作---深入Delphi编程

    刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视化构件库).仅仅向窗体上扔几个构件,甚至不用动手写代码,就能很容易地做出一个有实用价值的程序,真是令人激动.但是,VCL只是D ...

  9. VC++ 隐藏控制台程序窗口

    转自:http://hi.baidu.com/sicceer/blog/item/d9c35a810d15c4c8bc3e1ec8.html 设置 #pragma comment( linker, & ...

最新文章

  1. learning armbian steps(4) ----- armbian 技术内幕
  2. 4G EPS 中的 FDD/TDD 无线帧
  3. pytorch的多分类问题
  4. 四元数相关总结-未完
  5. 计算机认识新朋友教案,小班教案认识新朋友
  6. UVA1394 LA3882 POJ3517 And Then There Was One【约瑟夫环+数学】
  7. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_11-MongoDb入门-安装Mongodb数据库...
  8. 论文小技巧-pdf转eps使色彩保持RGB不变及去边框
  9. YuniKorn 介绍
  10. 《windows游戏编程大师技巧》第五章:DirectX基础知识和令人生畏的COM
  11. python提供了几个基本的数值运算操作符_慢步学习,二级python,数字类型及其运算...
  12. macbook pro能搜索到wifi,但是连接不上
  13. java基础复习-集合框架(1)
  14. 前程无忧达成私有化协议:遭遇大砍价 作价降至43亿美元
  15. 计算机创造奇迹的英语作文,英语作文_可以创造奇迹的3D打印机 (有声)_沪江英语...
  16. swank: (too proud or confident) 炫耀;卖弄 to behave in way that is too proud or confident
  17. wlan和wfi的区别
  18. 微信公众号广告后台接口开发
  19. C#实现工厂模式简介--实现访问不同的数据库
  20. 【柒穆雨】学习平面设计指南

热门文章

  1. springmvc java的验证码的小程序
  2. while;do while; for循环
  3. MyBatis generator 使用方式 小结
  4. 学习日报 7-10(验证码)
  5. 使用VNC远程安装CentOS 7操作系统
  6. css display:box 新属性
  7. UVALive 4043 Ants
  8. PHP判断文件夹是否存在和创建文件夹的方法
  9. java项目eclipse上tomcat部署后项目添加不进去
  10. SpringCloud创建Config读取本地配置