采集程序 -【開源項目】


更新:通過一些朋友的回復,了解到,可能文章太長了,有朋友只是簡略瀏覽,所以還沒有明白程序工作流程。

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

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

但是核心的一點就是,只要會寫正則,幾分鍾就可以針對一個采集目標,編寫一個采集規則。

只需要4(3)個正則,就可以完成任務。

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

 

如果是逐頁采集模式,列表網址的正則可以忽略。

 ------------------------------------------------

前言

愛學習、愛使用移動設備閱讀電子書的朋友,不能不擁有一款屬於自己的采集利器。

而使用此程序即可以簡單輕松的實現采集任務。

采集效果圖

程序介紹

 在程序運行子目錄 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

 

各位朋友對采集有興趣,可以一起維護和貢獻代碼,如此大家都可以輕松的共享同一個采集框架。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM