Dirain的开源地带

思想在进步
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

百度视频采集.

Posted on 2008-06-04 16:15  Dirain  阅读(2191)  评论(4编辑  收藏  举报

     因为以前对C#有些基础的情况下开始学习asp.net.现在多少能写点东西了。今天做了个百度视频采集的小例子。给大家分享,高手过了。
     首先一下写这程序前对百度视频搜索页面的分析。在百度的视频搜索页面http://video.baidu.com/输入“抗震救灾”提交后,页面地址变为http://video.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=0&fbl=1024&word=%BF%B9%D5%F0%BE%C8%D4%D6 知道他的参数信息了,我们可以自己去组参数,然后获得我们想要的页面,拿到页面源码用正则表达式提取。很明显word参数是搜索视频的关键字,“抗震救灾”是被编码后的结果。这样我们就可以自己制作一个提交页面提交,获得输入关键字的搜索后页面源码。我们要做到不让用户看到我们把数据提交到百度的页面,所以不能直接在表单提交时提交到http://video.baidu.com/v 上,所以我们要在做一个页面,用于处理提交的搜索关键字和获取连接。此页面关键信息如下:

string word=this.Request["keyword"];
string url="http://video.baidu.com/v";
url
+="?word="+word;   //拼一个页面连接

写的简单了点,具体代码我会把写好的文件传上来,可以自己去做测试。上面的代码主要就是接受到上一页面提交的关键字后拼出一个连接百度视频的串,获取该页面的源码。但如果按上面的方式写会出问题。我们试想一下,比如拼出的连接是http://www.video.baidu.com/v?word=抗震救灾 这样在asp.net中连接此页面时中文没有进行编码处理,所以访问的页面会有乱码。因为我们看到从百度提交后会变成%BF%B9%D5%F0%BE%C8%D4%D6 如果在.net中提交不和上面的一样,因为百度的编码是gb2312,asp.net默认的是utf-8。所以编码后的串不一样,那么我们就需要修改配置文件,但这么小一个功能修改配置文件有些不值得了。所以我们把字符串接收到后自己用gb2312方式编码一次。

System.Web.HttpUtility.UrlEncode("抗震救灾", Encoding.GetEncoding("gb2312"));  //以gb2312方式把关键字编码了,这样就和百度统一了

OK,编码完毕,我们可以获取源码用正则表达式提取关键信息了。
     获取页面源代码很简单,下面是我写好的一个方法,提供URL连接地址返回该页面源码。

    public string GetHTML(string url)
  
{
        WebClient web 
= new WebClient();
        
byte[] buffer = web.DownloadData(url);
        
return Encoding.Default.GetString(buffer);
    }

接下来就是用正则表达式取我们想要的信息了,这个正则我就不解释了,因为正则的写法是随时变的。大家可以网上找找资料学一下,不难的。

Regex regexVideo = new Regex("\\<td\\>\\<div\\s+class\\=x\\>\\<a\\s+href=\"(?<videourl>.+)\"\\s+onmousedown=\".+\"\\s+title=\"(?<title>.+)\"\\s+target=\"_blank\"><img\\s+src=\"(?<imgurl>.+)\"\\s+alt=\".+\"\\>");  //这个是我写好的正则,用来取搜索视频后源码中的视频信息。

        MatchCollection ms 
= regexVideo.Matches(htmlcode);  //取视频信息
        foreach (Match m in ms) //遍历正则取到的结果
      {
            
this.Response.Write("<img src=\"" + m.Groups["imgurl"] + "\"></img><br>");  //输出取到的图片
            this.Response.Write("<a href=\"" + m.Groups["videourl"] + "\">" + m.Groups["title"+ "</a><br>");  //输出取到的视频真实地址
        }

上面就是取百度页面源码中每个视频信息的正则表达式。

在总结一下我设计此程序的思路吧,大家可以不记这个代码,理清思路,我认为代码不是很重要,重要的是思想。

1.分析一下百度视频搜索页面连接地址,并分析该页面源码的的视频具体格式,就是分析html元素了。
2.拼连接地址,取源码并取出信息。

拿到信息了,我们可以直接输出了,或者我们可以扩展下思路,用winfrom写个工具,采用多线程自动采集数据录入到数据库里。可扩展的地方还是很多的。

写出来不要笑,或许你认为很简单,但尊总下我这个新手的劳动成果喽,多多评论,我可以更好的了解到自己的缺点呢