土豆的视频下载有以下几个特点:
1,地址动态生成,每次请求返回的地址都不一样。
2,长视频会被分割成多段短视频。
3,对视频下载有一些限制,下载地址只对与请求的浏览器相同的user-agent有效。这就意味着A用户用A浏览器获得的地址,只能用A浏览器下载,即使换个B浏览器也不行,更别说用其它工具了。
4,要解析土豆视频的下载地址,就必须找到iid。
土豆有两种形式的播放地址,一种是形如http://www.tudou.com/programs/view/QHFawBSeA4k/的单一视频播放地址,
另一种是形如http://www.tudou.com/playlist/playindex.do?lid=11694367&iid=75610812的豆单播放地址。
如果是第一种,直接查看源代码,可以找到,iid = 75629467如果是第二种,iid直接在url地址里,iid=75610812。找到iid以后,把iid拼在http://v2.tudou.com/v?vn=02&st=1%2C2&it=后面,比如http://v2.tudou.com/v?vn=02&st=1%2C2&it=75629467访问该地址,返回的是一个xml格式的文件,里面就有视频下载地址和一些视频相关信息(根据情况自己进行url_decode)。
土豆视频的解析相比于优酷的解析,因为地址没有加密,显得更直接。但是在服务器端限制了请求用户和下载用户的user-agent,需要特别注意。
嗯,谢谢LCM的解答,我先试试,有问题再向你请教!
@lezhan: 好的
@LCM: 我用下面这样的方法抓取土豆的源代码,怎么会显示乱码呢?应该怎样抓取呢?
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 30000;
request.Headers.Set("Pragma", "no-cache");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream streamReceive = response.GetResponseStream();
Encoding encoding = Encoding.GetEncoding("gbk");
StreamReader streamReader = new StreamReader(streamReceive, encoding);
@LCM: 呼叫LCM
@lezhan: 出现乱码你看下是不是编码的问题。另外,你用HttpWebRequest的话,要设置Accept和UserAgent再进行抓取。
@LCM: 能否写段实例代码让我参考下呢?土豆的编码是gbk,没错喔!麻烦你了,谢谢!
@lezhan: 那晚上看有没有时间。现在在写一份很急用的文档。
@LCM: 嗯,麻烦你了!谢谢!
@LCM: LCM,在么?
@LCM: 从土豆网抓取的源代码需要解压,所以导致了上述问题,现在已经解决了,获取网页源代码的代码如下:
///<summary>
///获取网页源代码内容(ContentEncoding是gzip格式)
///</summary>
///<param name="url"></param>
///<param name="encoding_type"></param>
///<returns></returns>
public static string Get_WebPageCode_Info_GZip(string url, string encoding_type)
{
string WebPageCode = "";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string ce = response.ContentEncoding;
Stream streamReceive = response.GetResponseStream();
Encoding encoding = Encoding.GetEncoding(encoding_type);
if (ce.ToLower() == "gzip")
{
GZipStream gzip = new GZipStream(streamReceive, CompressionMode.Decompress);
using (StreamReader reader = new StreamReader(gzip, encoding))
{
WebPageCode = reader.ReadToEnd();
reader.Close();
}
response.Close();
streamReceive.Close();
gzip.Close();
}
}
catch
{
WebPageCode = "";
}
return WebPageCode;
}
@lezhan: 好的,解决了就好。
@LCM: 实在麻烦你了,LCM,结贴的时候没看清楚就点了,没能给到你满分,实在不好意思!第一次在博客园提问,你是第一个答复我的,再说声谢谢!