ASP.NET視訊採集站核心技術分析

iDotNetSpace發表於2009-07-31

      很多站長都是從做“垃圾站”起家了。什麼是“垃圾站”?說白了就是採集別人的資料存入自己的資料庫,加以聚合、整理、歸類,或增加自己的一些小修改,然後自己做一個節目,成為自己的網站。一直以來最流行的“垃圾站”多是文章內的,因為文章內比較容易採集,而且資料量大,有利於搜尋引擎。前兩三年開始有人做視訊採集站,甚至還有了一些很完善的視訊採集系統(如馬克思CMS,非常專業),也讓一些站長發了一筆橫財。可是隨著用馬克思的人越來越多,越晚開始做的站就越沒搞頭了,呵呵。解決方法其實也簡單,就是趁現在視訊採集站還不夠氾濫,自己寫視訊採集站,不用別人做的通用系統,只需要稍微做一點SEO,搜尋引擎就會照顧你咯~ o(∩_∩)o。

     下面以採集土豆為例,談談如何以最簡單粗暴的方式採集視訊。

      成功案例:http://www.kangxiyoulaile.com/( 康熙又來了)

     自從Youtube出來之後,視訊採集站就根本不需要採集視訊了——它只需要採集Flash播放器引數即可。

     比如以下這個視訊,我們只需要採集到它的引數“K1hf2uocE1Y”就可以了。當然,為了顯得更專業,我們還要採集視訊的相關資訊,比如視訊名字、視訊時長、觀看次數、網友評論、內容簡介等等,這都是舉一反三的事了,^_^,通通都存入我們自己的資料庫中!

<embed>

     既然是做垃圾站,那麼一定要有自己的分類。我們就把這作為起點吧!用土豆搜尋功能!

搜尋“康熙來了”+日期,就可以得到某日期內的“康熙來了”節目,如“康熙來了20090720”,我們就來到了http://so.tudou.com/isearch.do?kw=%BF%B5%CE%F5%C0%B4%C1%CB20090720

      明白了吧?我們定期讓程式開啟http://so.tudou.com/isearch.do?kw=%BF%B5%CE%F5%C0%B4%C1%CB + ‘當前日期’ 就可以了達到自動採集的效果了。

 

      如何用ASP.NET獲取HTML呢?這是一個沒有技術含量的問題。我們直接給程式碼。

/// 
/// 獲取網頁內容
/// 
/// 
/// 
public static string GetHtml(string url)
{
string result = "";
try
{
WebRequest request = WebRequest.Create(url);
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("GBK"));
result = reader.ReadToEnd();
}
catch
{
result = "";
}
return result;
}

      接下來,我們分析得到的HTML。現在這個年代,大家都採用div+css,這也讓我們的採集變得很容易。嘿嘿,仔細想想,土豆在採用div+css來做介面的時候,肯定會為每一個“節目”單獨做一個css的class吧? 嗯,這就對了!分析原始檔後,果然,我們發現在搜尋節目列表中,每一個節目都採用了“pack pack_video_card”這個css的class。

     我們應該怎麼做呢? 將整個原始檔作為一個字串,然後以“

” 作為分隔符,將字串切割到一個字串陣列中。這樣,在得到的字串陣列中,除了第一個字串不是視訊以外,其他的每一個字串都包含我們需要的視訊資訊!

     程式碼如下:

string[] list=html.Split(new string[]{"
"},StringSplitOptions.RemoveEmptyEntries);

      加一些簡單的控制條件,然後從每一個字串片段中提取資訊放入類裡。

      如採集視訊縮圖:

           foreach (string s in list)
{
               begin = s.IndexOf("src")+5;
end = s.IndexOf("")-4;
v.ImgUrl = s.Substring(begin, end - begin + 1);

                         …………

                         }

        

      有了這樣的基礎,就可以進一步封裝成一些函式,便於快速採集了。如:

/// 
/// 獲取兩個日期段之間的所有視訊實體
/// 
/// 
/// 
/// 每天的最大視訊數
/// 
public static List<Video> GetVideoByDate(DateTime beginDate, DateTime endDate,int everydayMax)
{
ByDateVideoList = new List<Video>();
DateTime dt = beginDate;
    while (dt <= endDate)
{
ByDateVideoList.AddRange(GetTopVideo(GetTudouString(dt.ToString("yyyyMMdd")),everydayMax));
dt = dt.AddDays(1);
}
return ByDateVideoList;
}

       

       還有一個小細節。土豆網採用的是GBK編碼,我們如果也採用GBK編碼,搜尋引擎就會發現重複資料太大,所以我們必須要修改編碼。假設我們的網站使用UTF8編碼,如何將採集到的GBK編碼資料轉換成UTF8進行展示呢? 參考以下函式:

     

public static string ConvertEncoding(Encoding oldEncoding, Encoding newEncoding, string oldString)
{
byte[] ldBytes = oldEncoding.GetBytes(oldString);
byte[] newsBytes = Encoding.Convert(oldEncoding, newEncoding, oldBytes);
char[] newChars = new char[newEncoding.GetCharCount(newsBytes, 0, newsBytes.Length)];
newEncoding.GetChars(newsBytes, 0, newsBytes.Length, newChars, 0);
string newString = new string(newChars);
return newString;
}
     最後,很重要了!做一個簡單的URL Rewrite,方便搜尋引擎搜錄。按照Google排PR的原則,離根目錄越近、地址越短、get引數越少的地址更容易收錄並靠前。
我們可以這樣來做,在Global.asax.cs裡這樣寫
  protected void Application_BeginRequest(object sender, EventArgs e)
        {
            robot();

            string Id = Request.Path.Substring(Request.Path.LastIndexOf('/') + 1);
            if (Id.Length==16)
            {
                Server.Transfer("~/V.aspx?Id=" + Id.Substring(0,11));
            }
        }
     這樣,原本是 http://www.kangxiyoulaile.com/v.aspx?id=3IPFQqeKtKc 的地址就可以通過
http://www.kangxiyoulaile.com/3IPFQqeKtKc.aspx  來訪問。把網站上所有帶引數形式的內部連結都改成後者,就可以瞞過搜尋引擎了。
    我們還可以賤一點,做一些針對搜尋引擎的優化。例如以下程式碼是判斷搜尋引擎蜘蛛訪問的。我們大可以在判斷到訪問者是搜尋引擎蜘蛛之後,對頁面資料做一些更改。。嘿嘿。。由於這招太賤了,以下不演示具體細節。稍微改改下面的程式碼你就可以……

  ///


        /// 判斷蜘蛛是否來過
        ///

        ///
        protected bool robot()
        {
            bool brtn = false;
            string king_robots = "mailto:Baiduspider+@Baidu%7CGooglebot@Google%7Cia_archiver@Alexa%7CIAArchiver@Alexa%7CASPSeek@ASPSeek%7CYahooSeeker@Yahoo%7Csohu-search@Sohu%7Chelp.yahoo.com/help/us/ysearch/slurp@Yahoo%7Csohu-search@SOHU%7CMSNBOT@MSN";
            string ls_spr;

            ls_spr = Request.ServerVariables["http_user_agent"].ToString();
            char[] delimiterChars = { '|' };
            char[] x = { '@' };
            string[] I1 = king_robots.Split(delimiterChars);

            for (int i = 0; i < I1.Length; i++)
            {
                string[] spider = I1[i].Split(x);
                if (ls_spr.IndexOf(spider[0].ToString()) > -1)
                {
                    brtn = true;
                    logrobots(spider[1].ToString()+"|"+Request.Path+"|");
                    break;
                }
            }
            return brtn;
        }

     好了!關鍵的技術都分析完了,我們點到為止吧,靠大家自己了!o(∩_∩)o
 1

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-610959/,如需轉載,請註明出處,否則將追究法律責任。

ASP.NET視訊採集站核心技術分析
請登入後發表評論 登入
全部評論

相關文章