在進行數據採集模塊開發以前咱們先來看看製做好管理界面效果圖:css
數據採集管理和監控界面:html
數據源配置界面:web
根據需求分析列出所須要作的事以下表:正則表達式
數據採集sql |
|
序號數據庫 |
任務說明緩存 |
1工具 |
建立WebCrawler模塊網站 |
2ui |
定義一個名爲 CrawlerArticle 的內容類型來存放採集來的文章。在該內容類型中同時包含如下字段,便於前臺以爲展示方式。 SourceName:數據源名稱 SourceUrl: 數據源地址 OpenStyle:打開方式(當前窗口或者新窗口) ArticleTime:文稿數據(數據源自己建立的時間不是在在本平臺中寫入的時間) Visits:訪問量原網站該文章的訪問量 |
3 |
建立用於存放數據源 地址、採集規則。以及採集任務執行策略的表,並提供管理界面。 數據源(CrawlerSourcePart)結構以下: SourceName:數據源名稱 SourceHost:數據源網站域名(即網站的根地址如:http://www.baidu.com/ SourceUrl:數據源地址,指具體衝網站的那一個頁面採集數據 LastCrawlerUrl:最後一次訪問的Url Enabled:當前數據源是否啓用. 採集策略配置(CrawlerSettingsPart)以下: Interval 執行間隔時間 Thumbnail 縮略圖比例(採集到的內容中的圖片將按照該比例處理成文章縮略圖) Ignore 忽略少年前的數據 採集規則配置(CrawlerRulePart)以下: SourceID 數據源ID與CrawlerSourcePart關聯 Behavior 採集行爲,指採集的是標題,仍是日期,仍是訪問量等,本項目中只須要用到採集數據表格的容器,以及詳細內容,標題、日期等。 Expression 對應與採集行爲的正則表達式. 數據源默認圖片配置表(DefaultImagePart)以下: SourceID 關聯數據源ID ImageUrl 圖片路徑數據採集在採集到沒有圖片的文稿時候會從數據源默認圖片中選擇圖片做爲列表中顯示的文稿縮略圖以下圖:’
|
4 |
編寫任務調度器,以及具體採集執行的代碼。 |
在開始開發數據採集Module以前咱們先來看看,Orchard Module的項目結構。在使用Orchard 命令行工具建立Module之後,在解決方案中會多出一個新的項目,項目結構以下圖:
Assets:資源文件,用來存放模塊用到的JS、樣式、圖片等靜態資源文件夾,該資源文件夾下面必須包含一個web.config用於標識該文件夾是靜態資源的文件夾,Orchard纔會到這個文件夾查找css樣式 JS腳本等。該代碼以下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <staticContent> <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" /> </staticContent> <handlers accessPolicy="Script,Read"> <!-- iis7 - for any request to a file exists on disk, return it via native http module. accessPolicy 'Script' is to allow for a managed 404 page. --> <add name="StaticFile" path="*" verb="*" modules="StaticFileModule" preCondition="integratedMode" resourceType="File" requireAccess="Read" /> </handlers> </system.webServer> </configuration>
另外一般該文件夾只會在模版中用到。
Controllers:控制器文件夾,用於存放MVC模塊的控制器。
Drivers:驅動器,用於爲ContentPart提供顯示和編輯的視圖。Orchard使用了一個叫Shape的概念,相似於MVC中的視圖。
Handlers:提供ContentPart變化的事件監聽。有以下事件:
OnInitializing:ContentPart初始時 促發該事件
OnRemoved:ContentPart刪除時候觸發該事件
能夠利用這些事件來作相應的業務邏輯處理,例如能夠用 OnInitializing事件來爲ContentPart提供默認值。能夠用OnRemoved事件來在ContentPart刪除時候進行數據清理、緩存移除等操做。Handlers還包含其餘的事件,能夠參考官方資料.
Models:實體類即數據庫實體類,存放ContentPart的各個屬性Models分爲ContentPart(用於Drivers肯定顯示和編輯的樣式)以及ContentPartRecord(用於Nhibrerate的數據映射)。ContentPartRecord的各個屬性並需用 virtual關鍵字來修飾。
ViewModels:視圖實體類
Services:模塊服務類局放於該文件夾,提供業務邏輯,以及數據庫操做。
Views:視圖文件夾。存放cshtml頁面。
Orchard建立Module能夠經過命令行來建立
首先進入Orchard的部署目錄中找到Orchard.exe(在bin目錄中) 用命令行打開。以下圖:
打開Orchard命令行之後輸入:
Orchard> codegen module WebCrawler
注:若是執行錯誤,則須要先啓用 Codegen模塊
執行以上指令之後Orchard將會在Module文件夾中建立名爲 WebCrawler的一個項目。從新源代碼解決方案Orchard.sln便可在解決方案的看到該項目。以下圖:
Module建立好之後接下來建立 Migrations 類,該類用於安裝或升級Module時候進行ContentType定義、ContentPart定義、以及數據表的建立等。執行如下Orchard命令行來建立該類。
Orchard > codegen datamigration WebCrawler
首次建立好 Migrations類之後該類中會有一個Create方法,若是之後須要對Module升級只需建立一個 UpdateFrom1的方法,而且返回 2,再次升級則再建立一個方法UpdateFrom2 返回3 依次類推。
public int Create()//首次建立 { return 1; } public int UpdateFrom1()//第一次升級 { return 2; } public int UpdateFrom2()//第二次升級 { return 3; } public int UpdateFrom3()//第三次升級 { return n; } public int UpdateFromN()//第N次升級 { return n+1; }
Orchard會自動檢查當前模塊是否須要升級,升級Module會調用最新的UpdateFrom方法。並在Orchard_Framework_DataMigrationRecord表中記錄相應的版本信息。以下圖:
接下來在Migrations類中定義WebCrawler Module所須要的ContentPart以及要建立的數據庫表。
定義用於存儲經過數據採集而來的文稿的內容類型。該內容類型首先是須要有標題、有主體、還能夠有評論。須要進行版本管理、須要有進行列表顯示,須要能夠被建立。同時該類型還有一些其餘的附加屬性。這個類型由TitlePart、BodyPart、TagsPart、CommentsPart(評論)等ContentPart組成。定義該類型的代碼以下:
ContentDefinitionManager.AlterTypeDefinition("CrawlerArticle", cfg => cfg .Creatable()//容許建立 .Listable()//運行顯示列表 .Draftable()//容許版本管理 .Securable() .WithPart("TitlePart")//附加TitlePart .WithPart("BodyPart")//附加BodyPart .WithPart("TagsPart")//附加TagsPart .WithPart("CrawlerArticle")//附加他自身的Part沒類型都有一個與類型同名的Part .WithPart("CommentsPart")//附加CommentsPart .WithSetting("Description", "")//對類型進行備註說明 );
定義CrawlerArticlePart內容部件併爲其添加擴展字段。代碼以下:
ContentDefinitionManager.AlterPartDefinition("CrawlerArticle", part => part .WithField("SourceName", cfg => cfg .WithDisplayName("文稿來源") .OfType("TextField") .WithSetting("TextField.Required", "True")) .WithField("SourceUrl", cfg => cfg .WithDisplayName("源地址") .OfType("TextField").WithSetting("TextField.Required", "True")) .WithField("Thumbnail", cfg => cfg .WithDisplayName("縮略圖") .OfType("TextField") .WithSetting("TextField.Required", "False")) .WithField("OpenStyle", cfg => cfg .WithDisplayName("打開方式") .OfType("EnumerationField") .WithSetting("EnumerationFieldSettings.Required", "True") .WithSetting("EnumerationFieldSettings.Options", "當前窗口\r\n新窗口")) .WithField("ArticleTime", cfg => cfg .WithDisplayName("文稿日期") .OfType("TextField") .WithSetting("EnumerationFieldSettings.Required", "False")) );
上面定義了名爲CrawlerArticle的內容類型,並定義如下字段:
SourceName:用於存放該文稿的來源名稱。
SourceUrl: 文稿的原始地址。
OpenStyle:打開方式,這是一個枚舉字段用於決定點擊該文稿時候,是在當前窗口打開仍是新窗口打開。有兩個枚舉值「當前窗口」和「新窗口」。
ArticleTime:文稿時間。
內容部件擴展字段的定義存放在[Settings_ContentPartFieldDefinitionRecord]表中。定義好這些文稿類型以及內容部件,而且Orchard安裝了該模塊之後在後臺管理系統如下結果:
首先在Module中多出來名爲 WebCrawler的模塊,在這裏能夠進行啓用和停用。
接下來定義數據採集所須要用到的數據表。數據採集須要用到數據源表(ClawlerSource)、採集規則表(ClawlerRule)、數據採集全局設置表(ClawlerSetting)、數據源默認圖片表(DefaultImage)。下面以建立數據源集合表爲例加以說明:
建立數據源集合表
SchemaBuilder.CreateTable("CrawlerSourcePartRecord", table => table
.ContentPartRecord()
.Column("SourceName", DbType.String)
.Column("SourceUrl", DbType.String)
.Column("LastCrawlUrl", DbType.String)
.Column("Enabled", DbType.Byte)
.Column("MenuID", DbType.String)
);
當Orchard執行該代碼之後數據庫中就會多一個名爲WebClawler_ClawlerSourcePartRecord的表。
定義數據源內容類型
ContentDefinitionManager.AlterTypeDefinition("CrawlerSource", cfg => cfg
.WithPart(typeof(CrawlerSourcePart).Name)
.WithPart("IdentityPart")
.WithPart("CommonPart")
.WithSetting("Description", "數據源")
);
定義數據採集全局設置內容類型
ContentDefinitionManager.AlterTypeDefinition("CrawlerSetting", cfg => cfg
.WithPart(typeof(CrawlerSettingPart).Name)
.WithPart("IdentityPart")
.WithPart("CommonPart")
.WithSetting("Description", "數據採集全局配置")
);
定義採集規則內容類型
ContentDefinitionManager.AlterTypeDefinition("CrawlerRule", cfg => cfg
.WithPart(typeof(CrawlerRulePart).Name)
.WithPart("IdentityPart")
.WithPart("CommonPart")
.WithSetting("Description", "數據採集採集規則")
);
定義默認圖片內容類型
ContentDefinitionManager.AlterTypeDefinition("DefaultImage", cfg => cfg
.WithPart(typeof(DefaultImagePart).Name)
.WithPart(typeof(IdentityPart).Name)
.WithPart(typeof(CommonPart).Name)
.WithSetting("Description", "數據源默認圖片")
);
定義對應的Part
ContentDefinitionManager.AlterPartDefinition("CrawlerSourcePart", builder => builder
.Attachable()
.WithDescription("數據源定義")
);
ContentDefinitionManager.AlterPartDefinition("CrawlerSettingPart", builder => builder
.Attachable()
.WithDescription("數據採集全局配置信息")
);
ContentDefinitionManager.AlterPartDefinition("CrawlerRulePart", builder => builder
.Attachable()
.WithDescription("採集規則定義")
);