出於工作上的需要,兩年前wl363535796和我一起寫了一個微型的爬蟲庫(目前還稱不上一個爬蟲,僅僅是對一些抓取操作的封裝而已)。后來便一直沒怎么管它,直到最近有時間,我們修復了所有已發現的Bug,完善了一些功能,並對代碼進行了重構。現在將其開源,取名為EasySpider,意為一個簡單實用的抓取庫。開源的目的是希望這個項目能為有同樣需求的朋友們節省一些時間,如果僥幸哪位朋友能用到,我們會倍感榮幸。(ps:本人已經很長一段時間沒有碰過C#了,代碼寫得不好的地方還望各位朋友海涵。)
最近不知道為什么,codeplex訪問好慢,所以將項目托管到了
http://code.taobao.org。如果您在使用過程中如果遇到什么問題或者對未來版本有什么建議想法,歡迎大家在項目主頁上填寫issues,或者在此篇博文下留言,也可以給我們發email。
wl363535796的email:wl363535796@gmail.com
mangoalex的email:mangoalex@163.com
項目的地址是:http://code.taobao.org/p/easyspider,您可以使用svn簽出,也可以單擊這里下載第一個版本:http://code.taobao.org/svn/easyspider/tags/release-v1.0.rar
一、項目的相關介紹
1. 這個庫主要實現的功能如下:
(1) 封裝基本的Http請求操作,包括get、post請求,文件上傳以及資源下載等
(2) 封裝頁面的一些常用操作,包括js過濾,頁面所有資源下載(將頁面所含的圖片、js、css以及flash下載到本地指定路徑,然后更改頁面中的引用路徑)等
(3) 一些工具性的封裝,包括相對url到絕對url的轉換,根據兩個不同目錄得到引用路徑,以及頁面編碼判斷等
2. 項目主要的一些類以及說明如下:
Spider
這個是主要類,所有http請求操作的入口都在這里,主要封裝一個同異步請求相關的方法
WebPage
這個是頁面下載的主要類庫,需要您需要下載頁面所有資源到本地,就會用到這個類
CHttpWebRequest 對HttpWebRequest的一個封裝,添加一些諸如http標頭設置等方法
CHttpWebResponse 對HttpWebResponse的一個封裝,添加一些諸如頁面編碼獲取以及對服務器輸出的壓縮流解壓的一些操作
3. 項目主要目錄說明如下:
Common
看名字就知道,這個文件夾下是一些項目公用的配置以及基礎類的封裝
Regex
正則相關的封裝,主要封裝了一些常用的正則表達式
Utility 工具文文件夾,主要封裝一些路徑、文件等常用操作
4. 幾點補充說明:
(1) 出於性能考慮,CHttpWebResponse沒使用析構函數,而是實現了IDisposable接口,也就是說一般情況下您需要使用using語法來顯式釋放資源(某些情況下,您可以調用一些已經自帶垃圾回收的方法)
(2) 出於兼容性考慮,整個項目是基於FrameWork 2.0的。但是本人機子上裝的是vs2010,所以如果您的vs版本低於2010的話需要將項目轉換為低版本的(具體方法可參考此處:( http://www.cnblogs.com/hibernate6/archive/2011/11/28/2521991.html ),或者創建一個新項目,將代碼復制到新項目。
二、一些簡單的例子
1. 同步get、post請求
//
1.1 使用同步get請求,獲取返回的html
using (CHttpWebResponse cResponse = Spider.Get( " http://www.baidu.com "))
{
// 第一個參數是解析服務器輸出流的編碼,設置為null表示自動獲取;第二個參數是在調用方法后是否釋放資源,由於顯式使用了using所以此處設置為false
string html = cResponse.GetContent( null, false);
}
// 1.2 使用同步post方法,提交字符串和文件,獲取返回的html
Dictionary< string, string> postDic= new Dictionary< string, string>();
List<HttpPostFile> files = new List<HttpPostFile>();
// 發送"name=mango&age=20"到服務器
postDic.Add( " name ", " mango ");
postDic.Add( " age ", " 20 ");
// 發送兩個文件到服務器,FromFilePath的第一個參數是文件的本地路徑;第二個參數是文件在表單中的name;第三個參數是文件的mime類型,設置為null表示自動獲取
files.Add(HttpPostFile.FromFilePath( @" D:\1.txt ", " file1 ", null));
files.Add(HttpPostFile.FromFilePath( @" D:\2.txt ", " file2 ", null));
// Post方法第一個參數是url;第二個參數是需要提交的表單域的鍵值對;第三個參數是需要提交的文件列表,如果不需要提交文件則設置為null;第四個參數表示post字符串的編碼,如果為null則會使用utf8編碼
using (CHttpWebResponse cResponse =Spider.Post( " http://www.baidu.com ", postDic,files, null))
{
string html = cResponse.GetContent( null, false);
}
using (CHttpWebResponse cResponse = Spider.Get( " http://www.baidu.com "))
{
// 第一個參數是解析服務器輸出流的編碼,設置為null表示自動獲取;第二個參數是在調用方法后是否釋放資源,由於顯式使用了using所以此處設置為false
string html = cResponse.GetContent( null, false);
}
// 1.2 使用同步post方法,提交字符串和文件,獲取返回的html
Dictionary< string, string> postDic= new Dictionary< string, string>();
List<HttpPostFile> files = new List<HttpPostFile>();
// 發送"name=mango&age=20"到服務器
postDic.Add( " name ", " mango ");
postDic.Add( " age ", " 20 ");
// 發送兩個文件到服務器,FromFilePath的第一個參數是文件的本地路徑;第二個參數是文件在表單中的name;第三個參數是文件的mime類型,設置為null表示自動獲取
files.Add(HttpPostFile.FromFilePath( @" D:\1.txt ", " file1 ", null));
files.Add(HttpPostFile.FromFilePath( @" D:\2.txt ", " file2 ", null));
// Post方法第一個參數是url;第二個參數是需要提交的表單域的鍵值對;第三個參數是需要提交的文件列表,如果不需要提交文件則設置為null;第四個參數表示post字符串的編碼,如果為null則會使用utf8編碼
using (CHttpWebResponse cResponse =Spider.Post( " http://www.baidu.com ", postDic,files, null))
{
string html = cResponse.GetContent( null, false);
}
2. 異步get、post請求
異步方法與同步方法使用類似,只不多了一個委托參數,我們以異步get方法為例:
//
2.1 由於使用異步調用,所以AsyncGet不會阻塞程序的執行,想要看到服務端返回的html,需要在此方法后調用Console.ReadLine讓程序暫停
Spider.AsyncGet(Spider.CreateRequest( " http://www.baidu.com "), new ResponseCallback( delegate(CHttpWebResponse cResponse){
// 注意:此處沒有使用using語法,是因為做了一個封裝,GetContent()其實是調用GetContent(null, true)
string html = cResponse.GetContent();
Console.WriteLine(html);
}));
Console.ReadLine();
Spider.AsyncGet(Spider.CreateRequest( " http://www.baidu.com "), new ResponseCallback( delegate(CHttpWebResponse cResponse){
// 注意:此處沒有使用using語法,是因為做了一個封裝,GetContent()其實是調用GetContent(null, true)
string html = cResponse.GetContent();
Console.WriteLine(html);
}));
Console.ReadLine();
3. 頁面資源下載
using (CHttpWebResponse cResponse = Spider.Get(Spider.CreateRequest(
"
http://www.taobao.com
")))
{
WebPage page= cResponse.GetWebPage();
// 第一個參數指定保存的文件名;第二個參數表示不過濾js;第三個參數指定保存文件夾(還可以為css、js等指定不同的文件夾,只要在同一目錄下就行)
page.SaveHtmlAndResource( @" taobao.html ", false, new DirConfig( @" D:\test "));
}
{
WebPage page= cResponse.GetWebPage();
// 第一個參數指定保存的文件名;第二個參數表示不過濾js;第三個參數指定保存文件夾(還可以為css、js等指定不同的文件夾,只要在同一目錄下就行)
page.SaveHtmlAndResource( @" taobao.html ", false, new DirConfig( @" D:\test "));
}
執行上面的代碼以后,會在D:\test生成如下幾個目錄:

打開taobao.html,發現頁面顯示如下:

