我现在要做一个视频分享的功能,用户输入一个视频的链接(浏览器上的HTML的地址,而不是分享链接的地址),我用程序去抓取那个链接上面的网页内容,然后用正则表达式去匹配视频的分享链接,现在优酷、酷6、音悦台这三个可以抓取到,但是土豆、搜狐、奇艺这三个还是抓不到,因为网页上根本就没有分享的链接。哪位高手做过这类功能的,请多多指教。
我的部分代码:
#region 获取视频的路径
//获取视频的路径
protected void checkvideo(string v)
{
try
{
string txt = v.ToLower().Trim();
WebRequest wb = WebRequest.Create(texturl);
WebResponse wbs = wb.GetResponse();
StreamReader sr = new StreamReader(wbs.GetResponseStream(), Encoding.GetEncoding("gb2312"));
string s = sr.ReadToEnd();
if (texturl.Contains("youku"))
{
string patrn1 = @"<embed src=""(?<content>[\s\S]*?)""";
fanhui= searchExp(s, patrn1);
}
if (texturl.Contains("ku6"))
{
string patrn1 = @"<input class=""text_A"" value=""(?<content>[\s\S]*?)""";
fanhui = searchExp(s, patrn1);
}
if (texturl.Contains("yinyuetai"))
{
string patrn1 = @"<input type=""text"" class=""code_text"" id=""flashCode"" value='(?<content>[\s\S]*?)'";
fanhui = searchExp(s, patrn1);
}
sr.Close();
sr.Dispose();
wbs.Close();
}
catch (Exception ex)
{
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "信息提示", "<script>alert('" + ex + "')</script>");
}
}
#endregion
#region 正则表达式匹配视频路径
private string searchExp(string strng, string patrn)
{
Regex re = new Regex(@patrn);
MatchCollection mc = re.Matches(strng);
string fileUrl = "";
foreach (Match m in mc)
{
fileUrl = m.Groups["content"].ToString();
}
return fileUrl;
}
#endregion
比如土豆的某视频:http://www.tudou.com/abc.html,这个页面上的视频可以被分享到“人人”,“开心”,“新浪微博”,那么加载这个页面的时候完全可以不把这些分享按钮渲染出来,而是通过js在用户的浏览器上把这些按钮再渲染出来,这是很正常的做法,可以减小服务器压力。你用WebRequest去抓,得到的只是渲染前的页面源码,而不是js执行后的效果,因此这么做你是不可能得到分享链接的。你为何这么执着要在页面上得到分享链接呢,这些站的分享接口都是固定的,本质都是类似:http://share.example.com/url=http://www.resource.com/video.html。
土豆的是免费提供API接口的
嘿嘿。。。
我弄过土豆的,关注学习一下