文档章节

传媒大学媒体中心资源批量获取工具的制作

雷霄骅
 雷霄骅
发布于 2014/08/16 13:54
字数 1779
阅读 60
收藏 0

中国传媒大学媒体中心(http://media.cuc.edu.cn/)是中国传媒大学媒体资源最集中的地方,各种电影,电视剧,音乐等等,可以说是丰富多彩。然而它有一个缺点,就是只能在线看,不能下载。这导致想把自己喜爱的视频保存下来是比较困难的。为此我课余时间进行了一个小研究,做了一个MFC的小程序,可以实现媒体中心中资源URL的提取和保存,在此记录一下自己的制作过程。

该工具主要涉及以下三个技术:

1.发送HTTP请求,获取网页的源代码

2.查找具有特定标记的字符串,并提取出来

3.数据写入xml文件

下面先看看实际情况

首先登录媒体中心,打开一个视频,截图如图所示:


查看一下网页的源代码,看看有没有视频URL。在网页里搜索了关键字“.flv”,竟然找到了。

地址就是:

http://202.205.20.12:2048/02/video/2012/5/111309/1336492554022.flv


只要把上述地址粘贴到迅雷,快车里面就可以下载视频了。

现在有一个问题,就是下载一个视频可以这样翻网页源代码找一找,但是每次这样操作有点太过麻烦了。因此需要编程实现一个小工具。当输入一个视频播放网页的地址的时候,就可以输出该视频实际的下载地址。当然,最好可以批量输入页面地址,然后批量解析视频的实际地址。

其实这个东西已经实现出来了,最终界面如下所示:

在这个工具中,贴入视频所在的网页,就可以解析出视频的标题以及视频的地址。而且下半部分还提供了批量解析的功能,输入视频ID(随后会解释)的范围,就可以探测出该范围内所有的视频资源,同时输出成XML或者TXT。


批量解析输出成XML如下所示:

<URLList>
    <URL id="4">
        <name>恐惧拉斯维加斯</name>
        <link>http://202.205.20.12:2048/02/video/2008/6/恐惧拉斯维加斯/恐惧拉斯维加斯.flv</link>
        <type>vod</type>
        <protocol>http</protocol>
    </URL>
    <URL id="5">
        <name>一球成名2CD1</name>
        <link>http://202.205.20.12:2048/02/video/2008/7/一球成名2CD1/一球成名2CD1.flv</link>
        <type>vod</type>
        <protocol>http</protocol>
    </URL>
    <URL id="6">
        <name>一球成名2CD2</name>
        <link>http://202.205.20.12:2048/02/video/2008/7/一球成名2CD2/一球成名2CD2.flv</link>
        <type>vod</type>
        <protocol>http</protocol>
    </URL>
    <URL id="7">
        <name>深海寻人</name>
        <link>http://202.205.20.12:2048/02/video/2008/7/深海寻人/深海寻人.flv</link>
        <type>vod</type>
        <protocol>http</protocol>
    </URL>
    <URL id="28">
        <name>Oh_My_Friend</name>
        <link>http://202.205.20.12:2048/02/video/1970/1/28.BIGBANG_3rd_MINI_Oh_My_Friend_MV/BIGBANG_3rd_MINI_Oh_My_Friend_MV.flv</link>
        <type>vod</type>
        <protocol>http</protocol>
    </URL>
    <URL id="30">
        <name>once in a lifetime</name>
        <link>http://202.205.20.12:2048/02/video/2008/9/30.once_in_a_lifetime/once_in_a_lifetime.flv</link>
        <type>vod</type>
        <protocol>http</protocol>
    </URL>
</URLList>


或者TXT格式:

视频ID:4		视频名称:恐惧拉斯维加斯					视频地址:http://202.205.20.12:2048/02/video/2008/6/恐惧拉斯维加斯/恐惧拉斯维加斯.flv
视频ID:5		视频名称:一球成名2CD1						视频地址:http://202.205.20.12:2048/02/video/2008/7/一球成名2CD1/一球成名2CD1.flv
视频ID:6		视频名称:一球成名2CD2						视频地址:http://202.205.20.12:2048/02/video/2008/7/一球成名2CD2/一球成名2CD2.flv
视频ID:7		视频名称:深海寻人						视频地址:http://202.205.20.12:2048/02/video/2008/7/深海寻人/深海寻人.flv
视频ID:28		视频名称:Oh_My_Friend						视频地址:http://202.205.20.12:2048/02/video/1970/1/28.BIGBANG_3rd_MINI_Oh_My_Friend_MV/BIGBANG_3rd_MINI_Oh_My_Friend_MV.flv
视频ID:30		视频名称:once in a lifetime					视频地址:http://202.205.20.12:2048/02/video/2008/9/30.once_in_a_lifetime/once_in_a_lifetime.flv


介绍完毕。现在简要介绍一下单个视频解析url的制作过程。

第一步:发送HTTP请求,获取网页的源代码

曾经写过一篇发送HTTP请求获取网页源代码的文章:C++发送HTTP请求获取网页HTML代码 

第二步:查找具有特定标记的字符串,并提取出来

曾经写过一篇查找字符串并提取出来的方法的文章:C++从文件中查找特定的字符串,并提取该字符串 

在此需要综合前两篇文章的方法,实现对特定url的网页源代码的请求,以及对特定字符串的查找和提取。

首先观察一下网页源代码,发现视频地址是在一对<script>标签里:

<script type='text/javascript'>
					var s1 = new SWFObject('/v/Y29uZmlnPS9tcGMuanNwP21pZD0xMTEzMDk=','mediaplayer','480','380','10');
					//var s1 = new SWFObject('/scripts/player_4.4.swf?config=/mpc.jsp?mid=111309','mediaplayer','480','380','9');
					//s1.addParam('flashvars','&file=http://202.205.20.12:2048/02/video/2012/5/111309/1336492554022.flv&streamer=lighttpd');
					s1.useExpressInstall('/scripts/expressinstall.swf');
					s1.addParam('allowfullscreen','true');
					s1.addParam('allowscriptaccess','always');
					s1.write('player_box');
</script>


而地址开头“http://”前面是“('flashvars','&file=”,地址结尾“.flv”后面是“&streamer=lighttpd”。以这两个字符串作为标志,就能找到视频url地址。

视频标题的开头前面是“<span class=text_bl>”,地址结尾“</span>&nbsp;&nbsp”。以这两个字符串作为标志,就能找到视频的标题。

下面贴上这部分的源代码

注意:本工程中使用了3个CString变量关联到3个Edit Control控件:

CString m_htmlurl;//输入页面url
CString m_videourl;//输出解析出来的视频url
CString m_videoname;//输出解析出来的视频名称

void Csocket_http_dialogDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	//地址-----------------
	char stringsearch_before[]="('flashvars','&file=";
	char stringsearch_after[]="&streamer=lighttpd";
	//标题-----------------
	char stringsearch_before1[]="<span class=text_bl>";
	char stringsearch_after1[]="</span>  ";
	//url_search_before位置,代表找到了相应字符串
	const char *mark=NULL;
	//开始和结束
	const char *stringstart=NULL;
	const char *stringend=NULL;
	//结果
	char url[200]={0};
	char vname[200]={0};

	char *content_temp=NULL;
	char *string_temp=NULL;
	//-----------------



	CInternetSession session;//建立对话
	CHttpFile *file;
	//CException *e;
	UpdateData(true);
	CString URL = m_htmlurl.GetString();
	if(URL==""){
	AfxMessageBox("网页地址为空!");
	}
	try{
		file=(CHttpFile*)session.OpenURL(URL);//打开文件
	}catch(...){
		file = 0;
	}
	if (file){
		DWORD dwStatus;
		file->QueryInfoStatusCode(dwStatus);
		if(dwStatus == HTTP_STATUS_OK){
			CString content;
			CString data;
			while (file->ReadString(data)){
				content+=data+"\r\n";
			}
			content.TrimRight();
			//MessageBox((LPCTSTR)content);
			//处理数据,数据位于content之中---------------------------
			//获得地址
			mark=strstr(content,stringsearch_before);
			if(mark==NULL){
				AfxMessageBox("没有找到地址...本软件只适用于媒体中心");
				goto end;
			}
			//注意要-1,,此处获得string开始
			stringstart=mark+sizeof(stringsearch_before)-1;
			//注意此处获得string结束之后的1位,因此最后一位应改为\0
			stringend=strstr(stringstart,stringsearch_after);
			string_temp=url;
			for(content_temp=(char*)stringstart;content_temp!=stringend;content_temp++,string_temp++){
				*string_temp=*content_temp;
			}
			string_temp='\0';
			//获得标题-----------------------------
			mark=strstr(content,stringsearch_before1);
			if(mark==NULL){
				AfxMessageBox("没有找到标题...本软件只适用于媒体中心");
				goto end;
			}
			//注意要-1,,此处获得string开始
			stringstart=mark+sizeof(stringsearch_before1)-1;
			//注意此处获得string结束之后的1位,因此最后一位应改为\0
			stringend=strstr(stringstart,stringsearch_after1);
			//vname是最终输出
			string_temp=vname;
			for(content_temp=(char*)stringstart;content_temp!=stringend;content_temp++,string_temp++){
				*string_temp=*content_temp;
			}
			string_temp='\0';

			//----------------------------------
			m_videourl=url;
			m_videoname=vname;
			UpdateData(FALSE);
			
		}else{
			MessageBox("dwStatus!=HTTP_STATUS_OK");
		}
		end:
		file->Close();
		delete file;
	}
	session.Close();


}


第三步:数据写入xml文件

曾经写过一篇数据写入成xml的文章:TinyXML:一个优秀的C++ XML解析器 

在这里就不多说了,方法类似。



本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/12974945

雷霄骅

雷霄骅

粉丝 214
博文 419
码字总数 2129
作品 4
朝阳
程序员
私信 提问
加载中

评论(0)

day81-20180908-流利阅读笔记

媒体失信的今天还有人愿意读新闻学吗? Daniel 2018-09-08 1.今日导读 2016 年底,《牛津英语词典》将“后真相”(Post-Truth)选为年度词汇,并将其定义为:“诉诸情感及个人信念,较陈述客...

飞鱼说编程
2018/09/08
206
0
市场推广

代理商 批量 低价 深度合作 传媒 文化 广告公司 召集 设计师 卖模板 赚积分 设计师 交易平台 模板征集 通过审核之后 送积分 5.1 旅游公司 合作 旅游模板 高校活动 校庆 最美高校 毕业旅游 地...

_落雪纷飞
2015/04/07
9
0
[上海]分绚文化传媒有限公司寻有识之士共创未来(PHP,前端,美工)

企业概述 上海分绚传媒有限公司是一家虹口区政府扶持企业,高起点,高素质的专业广告策划及推广机构,分绚传媒依托强大的媒体资源及人脉网络,成为集媒体发布、商务策划、企业设计、广告设计...

mac_zhao
2011/11/27
618
6
文化传媒企业信息Web管理系统,用活字格灵活定制

某文化传媒公司,致力于各类大型文化媒体活动的专业策划和支持,公司业务包括:商业场景整体包装,营销信息策划发布,广告牌定制,平面广告设计等。由于广告展架和平面广告牌的设计、生产、物...

powertoolsteam
2018/08/10
0
0
腾讯收割一切:阅文集团将以不超过155亿元的价格收购新丽传媒

8月13日晚间消息,$阅文集团(00772)$ 发公告称,将以不超过155亿元人民币的价格收购新丽传媒100%股权。用以贯彻集团网络文学IP改编“精品化”的初心,进一步打通产业链。收购完成后,新丽传媒...

智科技
2018/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springcloud微服务实战_09_消息驱动

9.1 spring cloud stream 简介 spring cloud stream 是一个用来为微服务应用提供消息驱动能力的框架. 它可以基于 springboot 来单独的创建独立的,可用于生产的 spring 的应用程序. 它通过使用...

SP_K
26分钟前
75
0
福昕PDF编辑器个人版不能登录多个电脑问题处理

问题 福昕PDF编辑器个人版,只能在两台电脑登录,而且不能同时登录。但是当买换了新电脑后,新电脑属于第三台电脑,就不能登录使用编辑功能了。 解决 打开“我的电脑”,搜索出如下文件,删除...

InfoInit
38分钟前
65
0
pandas操作excel-08-简单绘图-柱状图

import pandas as pdimport matplotlib.pyplot as pltstudents = pd.read_excel('D:/output.xlsx', index_col='idx')students.sort_values(by='SinglePrice', inplace=True, ascending=......

烽焱10仴
39分钟前
52
0
向点击事件监听器添加“返回假”有什么作用?

很多次,我在HTML页面中都看到过这样的链接: <a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a> 那里return false有什么作用? 另外,我通常不会在按钮中看到它......

技术盛宴
45分钟前
37
0
搞不定Kafka重复消费?来看看就不一样了

前言 今天我们聊一个话题,这个话题大家可能在面试过程中,或者是工作当中经常遇到 :point_right: 如何保证 Kafka 消息不重复消费? 我们在做开发的时候为了程序的健壮性,在使用 Kafka 的时...

Java进阶程序员xx
55分钟前
47
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部