因為以前對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 知道他的參數資訊了,我們可以自己去組參數,然後獲得我們想要的頁面,拿到頁面源碼用Regex提取。很明顯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,編碼完畢,我們可以擷取源碼用Regex提取關鍵資訊了。
擷取頁面原始碼很簡單,下面是我寫好的一個方法,提供URL串連地址返回該頁面源碼。
public string GetHTML(string url)
{
WebClient web = new WebClient();
byte[] buffer = web.DownloadData(url);
return Encoding.Default.GetString(buffer);
}
接下來就是用Regex取我們想要的資訊了,這個正則我就不解釋了,因為正則的寫法是隨時變的。大家可以網上找找資料學一下,不難的。
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>"); //輸出取到的視頻真真實位址
}
上面就是取百度頁面源碼中每個視頻資訊的Regex。
在總結一下我設計此程式的思路吧,大家可以不記這個代碼,理清思路,我認為代碼不是很重要,重要的是思想。
1.分析一下百度視頻搜尋網頁面串連地址,並分析該頁面源碼的的視頻具體格式,就是分析html元素了。
2.拼串連地址,取源碼並取出資訊。
拿到資訊了,我們可以直接輸出了,或者我們可以擴充下思路,用winfrom寫個工具,採用多線程自動採集資料錄入到資料庫裡。可擴充的地方還是很多的。
寫出來不要笑,或許你認為很簡單,但尊總下我這個新手的勞動成果嘍,多多評論,我可以更好的瞭解到自己的缺點呢