採集程序 -【開源項目】

更新:經過一些朋友的回覆,瞭解到,可能文章太長了,有朋友只是簡略瀏覽,因此尚未明白程序工做流程。html

簡單介紹,這個程序是給程序員用的,使用這個軟件,必須是會寫正則的朋友,或者是有朋友幫忙寫正則。
前端

這個程序不是針對某個網站或者網頁而寫的,而是一個「採集框架 」——說是框架,有點大了。
git

可是核心的一點就是,只要會寫正則,幾分鐘就能夠針對一個採集目標,編寫一個採集規則。程序員

只須要4(3)個正則,就能夠完成任務。github

列表網址、頁面標題、頁面內容、頁面連接

 

若是是逐頁採集模式,列表網址的正則能夠忽略。

 ------------------------------------------------正則表達式

前言

愛學習、愛使用移動設備閱讀電子書的朋友,不能不擁有一款屬於本身的採集利器。框架

而使用此程序便可以簡單輕鬆的實現採集任務。ide

採集效果圖工具

程序介紹

 在程序運行子目錄 Config 是程序的配置的保存目錄。學習

path.txt

[config]

Config\HtmlFormatConfig.xml

[task]

Config\task\

config 設置採集內容格式化的配置保存路徑

task 設置任務工做規則保存和加載路徑

 

採集工做窗體

起始網址

採集開始的網址,若是是逐頁的模式,則是第一頁的地址;

若是是列表的模式,則是第一個列表頁面的地址。

列表網址

匹配下一個列表頁面地址的正則表達式。

在逐頁模式下,不用填寫。

 

頁面標題

匹配頁面標題的正則表達式

頁面內容

匹配頁面內容的正則表達式

頁面連接

匹配內容頁面連接的正則表達式

在逐頁模式,採集到一個內容頁面以後,能夠匹配到下一個頁面連接。

在列表模式,採集到一個列表頁面以後,就能夠匹配到若干個頁面連接。

分頁標識

識別是否爲分頁標題的匹配正則表達式

首頁標識

第一頁的標識,好比標題【科技業的員工到底有多年輕 1)】,那麼標識能夠是(1)

保存路徑

採集內容的保存目錄

分頁處理

是指採集的文章資料是進行了分頁的,那麼程序會根據設定的規則,判斷是不是分頁章節,若是是,則不重複添加標題。

好比

科技業的員工到底有多年輕 1

科技業的員工到底有多年輕 2

科技業的員工到底有多年輕 3

那麼採集過程當中,只會寫入一個標題【科技業的員工到底有多年輕】

保存爲一個文件

若是勾選,則採集到的全部內容都寫入到一個文件中

開始

開始採集並將內容保存

測試

在消息框顯示採集的效果

格式化設置窗體

左邊是匹配到的字符,後邊是表示要替換成的字符。

程序運行時,會將第二行(若是有兩行)的字符拷貝一份轉換爲大寫組合在一塊兒,進行格式化。

換行標籤、空白標籤、縮進標籤

能夠輸入包含正則在內的字符進行匹配

章節標題

{0}表示採集的序號(採集一個地址則加1),{1}表示採集到的標題。

輔助功能

能夠將輸入的字符進行大小寫轉換

 

編寫新規則

編寫採集規則須要有必定的正則表達式的知識,若是不瞭解閱讀這個頁面:(正則表達式30分鐘入門教程)http://deerchao.net/tutorials/regex/regex.htm

 

任務是以xml文件的形式保存,文件名命名格式是:任務名稱 - 網站名稱.xml

在任何一個任務狀態下,只須要修改任務名稱,或者網站名稱,再點擊保存任務,便可新建一個任務。

若是名稱同樣會提示是否覆蓋。

 

這裏以博客園新聞爲例

博客園新聞是一個列表式的採集任務——在一個頁面能夠匹配獲得若干個頁面地址

http://news.cnblogs.com/

使用firebug或者其它前端調試工具,能夠輕鬆獲得採集特徵

好比下圖

 


 

點擊紅框【點擊查看頁面中的元素】而後在頁面的【創業公司如何評估度量公司潛力的方法】位置點下。

就能夠定位到html代碼

這樣就能夠獲取到內容頁面的連接特徵


< h2  class ="news_entry" >
< target ="_blank"  href ="/n/182026/" >創業公司如何估值 — 度量公司潛力的方法 </ a >
</ h2 >

而後須要觀察這個標識是否是惟一特徵的,也就是這個特徵匹配到的都是本身指望中的內容。不然就須要增長更多的限制特徵。

 

將特徵編寫爲匹配的正則表達式

 

源碼說明

解決方案有3個項目組成

Forms是視窗程序

Framework是採集程序

Helper是輔助程序

 

因爲考慮到之後會增長不一樣的採集任務,所以採用MDI窗體。

Config目錄是默認配置

FrmFormatConfig是內容格式化配置窗體

FrmGatherWorker是採集工做窗體

MDIParentMain是窗體容器

Config是內容格式化配置實體類

Task是採集任務規則實體類

Worker是採集工做類

 

 

Worker採集工做類說明

先看看3個主要事件

///   <summary>
///  錯誤觸發事件,傳入參數 引起的異常對象、錯誤的類型、當前工做的網址
///   </summary>
public  event Action<Exception, ErrorType,  string> OnError;

///   <summary>
///  工做結束觸發事件
///   </summary>
public  event Action OnWorkEnd;

///   <summary>
///  一次/地址採集完成觸發事件,傳入參數 採集內容的標題、內容、網址
///   </summary>
public  event Action< stringstringstring> OnWorkItemEnd;

 

建立對象

 
Worker work =  new Worker(_httpRequest, _config, _task);
work.OnError += w_OnError;
work.OnWorkItemEnd += work_OnWorkItemEnd;
work.OnWorkEnd += work_OnWorkEnd;

定義內容處理

///   <summary>
///  一次(個網址)採集完成後,執行內容寫入文件操做
///   </summary>
private  void work_OnWorkItemEnd( string curWebTitle,  string curWebContent,  string curUrl)
{
     // 將採集到的內容寫入到文件流中
     byte[] byteWebContent = Encoding.UTF8.GetBytes(curWebContent);
     if (_task.IsSaveOnlyFile)
    {
         // 若是當前內容標題爲空,則可能分頁
         if (! string.IsNullOrEmpty(curWebTitle))
        {
             byte[] byteWebTitle = Encoding.UTF8.GetBytes(curWebTitle);
            _curSavaFile.Write(byteWebTitle,  0, byteWebTitle.Length);
        }
        _curSavaFile.Write(byteWebContent,  0, byteWebContent.Length);
    }
     else
    {
         using (FileStream curSavaFile2 =  new FileStream( " {0}{1}.txt ".FormatWith(_task.SavePath, curWebTitle), FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            curSavaFile2.Write(byteWebContent,  0, byteWebContent.Length);
        }
    }
    UpdateWorkMessage( " \n已採集:{0},網址:{1} ".FormatWith(curWebTitle, curUrl));
    Application.DoEvents();
}

 

其它更多,請下載源碼查看

其它

運行程序下載:http://files.cnblogs.com/yelaiju/NWebGather.rar

 

源碼下載:http://files.cnblogs.com/yelaiju/NWebGather-src.rar

 

開源地址:https://github.com/alifellod/NWebGather

不瞭解github下載源碼的方式,請看文章:http://www.cnblogs.com/yelaiju/p/3180986.html

正則詞典(手冊)http://www.cnblogs.com/yelaiju/p/3182854.html

 

相關推薦項目:

 

園友:心態要好推薦 http://blog.csdn.net/sq_zhuyi/article/details/7924776

 

各位朋友對採集有興趣,能夠一塊兒維護和貢獻代碼,如此你們均可以輕鬆的共享同一個採集框架。

相關文章
相關標籤/搜索