網路採集軟體核心技術剖析系列(6)---將任意博主的全部博文下載到SQLite資料庫中並通過Webbrower顯示(將之前的內容綜合到一起)

來源:互聯網
上載者:User

標籤:winform   datagridview   style   blog   http   io   ar   color   os   

一 本系列隨筆目錄及本節代碼下載

開發環境:VS2008

本節源碼位置:https://github.com/songboriceboy/GatherAllStoreInDB

源碼下載辦法:安裝SVN用戶端(本文最後提供),然後checkout以下的地址:https://github.com/songboriceboy/GatherAllStoreInDB

系列文章提綱擬定如下:

1.如何使用C#語言擷取部落格園某個博主的全部隨筆連結及標題;
2.如何使用C#語言獲得博文的內容;
3.使用C#語言如何將html網頁轉換成pdf(html2pdf)
4.如何使用C#語言下載博文中的全部圖片到本地並可以離線瀏覽
5.如何使用C#語言合成多個單個的pdf檔案到一個pdf中,並組建目錄
6.網易部落格的連結如何使用C#語言擷取到,網易部落格的特殊性;
7.公眾號文章如何使用C#語言下載;
8.如何擷取任意一篇文章的全部圖文
9.如何使用C#語言去掉html中的全部標籤擷取純文字(html2txt)
10.如何使用C#語言將多個html檔案編譯成chm(html2chm)
11.如何使用C#語言遠程發布文章到新浪部落格
12.如何使用C#語言開發靜態網站產生器
13.如何使用C#語言搭建程式架構(經典Winform介面,頂部功能表列,工具列,左邊樹形列表,右邊多Tab介面)
14.如何使用C#語言實現網頁編輯器(Winform)......

二 第六節主要內容簡介(將任意博主的全部博文下載到SQLite資料庫中並通過Webbrower顯示)

將任意博主的全部博文下載到SQLite資料庫中並通過Webbrower顯示的解決方案,示範demo如所示:可執行檔下載

與上節的demo不同在於,上節我們得到的某個博主的全部博文被儲存在DataTable(記憶體)中,程式關閉後,全部下載下來的博文全都沒了,下次還需要重新下載,這樣明顯不好。

這次我們將下載的博文存在sqlite資料庫中,每新增一個博主,程式會自動在執行檔案所在的檔案夾下的WebSiteDB子目錄中建立一個以博主ID命名的.db檔案,該資料庫是sqlite資料庫。

 程式載入的時候會自動去執行檔案所在的檔案夾下的WebSiteDB子目錄掃描,在ComboBox下拉中列出掃描到資料庫名字,點擊某一個下拉項,程式自動載入該資料庫中的文章表中的全部資料到DataGridView顯示,點擊DataGridView的某一項,可以在下部的WebBrower中瀏覽網頁。

三 基本原理

我們為某個博主的全部博文定義了一張資料庫表,表結構如下:

   string m_strCreatTable = @"--1-2 層節點表(AU_LayerNode)drop table if exists [AU_LayerNode];CREATE TABLE AU_LayerNode(    AU_LayerNodeID                 INT NOT NULL PRIMARY KEY,    AU_ParentLayerNodeID        INT NOT NULL DEFAULT 0,    AU_UrlAddress              VARCHAR(1000) NOT NULL DEFAULT ‘‘,    AU_UrlTitle              NVARCHAR(1000) NOT NULL DEFAULT ‘‘,    AU_UrlContent            NTEXT NOT NULL DEFAULT ‘‘,     AU_UrlLayer                   INT NOT NULL DEFAULT 0,        AU_IsVisit                   INT NOT NULL DEFAULT 0,        AU_RemoveSameOffset1          INT NOT NULL DEFAULT 0,     AU_RemoveSameOffset2          INT NOT NULL DEFAULT 0,     AU_LastUpdateDate           DATETIME  NOT NULL DEFAULT ‘2012-01-01‘,    AU_ReserveInt1            INT NOT NULL DEFAULT 0,    AU_ReserveInt2            INT NOT NULL DEFAULT 0,    AU_ReserveInt3            INT NOT NULL DEFAULT 0,    AU_ReserveInt4            INT NOT NULL DEFAULT 0,    AU_ReserveInt5            INT NOT NULL DEFAULT 0,    AU_ReserveInt6            INT NOT NULL DEFAULT 0,    AU_ReserveInt7            INT NOT NULL DEFAULT 0,    AU_ReserveInt8            INT NOT NULL DEFAULT 0,    AU_ReserveStr1              VARCHAR(1000) NOT NULL DEFAULT ‘‘,    AU_ReserveStr2              VARCHAR(1000) NOT NULL DEFAULT ‘‘,    AU_ReserveNStr1              NVARCHAR(1000) NOT NULL DEFAULT ‘‘,    AU_ReserveNStr2              NVARCHAR(1000) NOT NULL DEFAULT ‘‘,    AU_ReserveTEXT1              TEXT NOT NULL DEFAULT ‘‘,    AU_ReserveTEXT2              TEXT NOT NULL DEFAULT ‘‘,    AU_ReserveTEXT3              TEXT NOT NULL DEFAULT ‘‘,    AU_ReserveNTEXT1        NTEXT NOT NULL DEFAULT ‘‘,    AU_ReserveNTEXT2        NTEXT NOT NULL DEFAULT ‘‘,    AU_ReserveNTEXT3        NTEXT NOT NULL DEFAULT ‘‘,    AU_ReserveDateTime1           DATETIME  NOT NULL DEFAULT ‘2012-01-01‘,    AU_ReserveDateTime2           DATETIME  NOT NULL DEFAULT ‘2012-01-01‘,    AU_ReserveDateTime3           DATETIME  NOT NULL DEFAULT ‘2012-01-01‘,    AU_ReserveDateTime4           DATETIME  NOT NULL DEFAULT ‘2012-01-01‘,    AU_ReserveDecmial1        DECIMAL NOT NULL DEFAULT 0,    AU_ReserveDecmial2        DECIMAL NOT NULL DEFAULT 0);";

其中最重要的是AU_UrlAddress,AU_UrlTitle,AU_UrlContent這3個欄位,分別表示博文連結地址,博文標題,博文本文內容。

接下來,對比上節內容,我們在新增博主下載的功能函數中增加了以下幾行代碼:

private Cls_SqliteMng m_sqliteMng = new Cls_SqliteMng();
string m_connStr1 = @"Data Source=" + Application.StartupPath + @"\WebSiteDB\";string m_connStr2 = @";Initial Catalog=sqlite;Integrated Security=True;Max Pool Size=10";

private string m_strInsertTaskInitData = @"insert into [AU_LayerNode] values(0, 0, ‘#^$BlogID$^#‘,‘‘, ‘‘, 0, 0, 0, 0
, ‘2012-01-01‘, 0, 0, 0, 0, 0, 1, 1, 0,‘‘, ‘‘,‘‘, ‘‘,‘‘, ‘‘,‘‘, ‘‘,‘‘, ‘‘, ‘2012-01-01‘, ‘2012-01-01‘, ‘2012-01-01‘, ‘2012-01-01‘, 1, 0)";

     m_sqliteMng.CreateDB(m_strDBFolder + this.toolStripTextBox1.Text + ".db");            m_sqliteMng.ExecuteSql(m_strCreatTable                , m_connStr1 + this.toolStripTextBox1.Text + ".db" + m_connStr2);            string strInsertTaskInitData = m_strInsertTaskInitData.Replace("#^$BlogID$^#", this.toolStripTextBox1.Text);            m_sqliteMng.ExecuteSql(strInsertTaskInitData                , m_connStr1 + this.toolStripTextBox1.Text + ".db" + m_connStr2);
m_sqliteMng.CreateDB(m_strDBFolder + this.toolStripTextBox1.Text + ".db");
上面這句是建立資料庫;
m_sqliteMng.ExecuteSql(m_strCreatTable, m_connStr1 + this.toolStripTextBox1.Text + ".db" + m_connStr2);
上面這句是在資料庫中建立資料庫表;
m_sqliteMng.ExecuteSql(strInsertTaskInitData, m_connStr1 + this.toolStripTextBox1.Text + ".db" + m_connStr2);
上面這句是在資料庫表中插入一條預設資料;
其中Cls_SqliteMng是封裝的一個Sqlite操作類,代碼如下:
 class Cls_SqliteMng    {        //string m_DBName = "";        //string connStr = "";               //建立一個資料庫檔案,儲存在目前的目錄下HyData檔案夾下        //        public void CreateDB(string dbName)        {           // string databaseFileName = System.Environment.CurrentDirectory + @"/HyData/" + dbName;            SQLiteConnection.CreateFile(dbName);        }        //執行Sql語句        //建立一個表:  ExecuteSql("create table HyTest(TestID TEXT)");        //插入些資料:  ExecuteSql("insert into HyTest(TestID) values(‘1001‘)");        public void ExecuteSql(string sqlStr, string strConStr)        {            //connStr = connStr1 + m_DBName + connStr;            using (DbConnection conn = new SQLiteConnection(strConStr))            {                conn.Open();                DbCommand comm = conn.CreateCommand();                comm.CommandText = sqlStr;                comm.CommandType = CommandType.Text;                comm.ExecuteNonQuery();            }        }    }

 對比上一節,另一個修改的地方是,在底層採集器擷取到一篇博文回調介面的AddBlog(BlogGather.DelegatePara dp)函數:

  private void AddBlog(BlogGather.DelegatePara dp)        {            if (this.InvokeRequired)            {                this.Invoke(new BlogGatherCnblogs.GreetingDelegate(this.AddBlog), dp);                return;            }            try            {                string strWholeDbName = m_strDBConStringPath + this.toolStripTextBox1.Text + ".db";                DYH_DB.Model.AU_LayerNode modelAU_LayerNode = new DYH_DB.Model.AU_LayerNode();                modelAU_LayerNode.AU_ParentLayerNodeID = -1;                modelAU_LayerNode.AU_LayerNodeID = m_bllAU_LayerNode.GetMaxId(strWholeDbName);                modelAU_LayerNode.AU_UrlLayer = 0;                modelAU_LayerNode.AU_UrlAddress = "";                string strTitle = Regex.Replace(dp.strTitle, @"[|/\;.‘:*?<>-]", "").ToString();                strTitle = Regex.Replace(strTitle, "[\"]", "").ToString();                strTitle = Regex.Replace(strTitle, @"\s", "");                modelAU_LayerNode.AU_UrlTitle = strTitle;                modelAU_LayerNode.AU_UrlContent = dp.strContent; ;                modelAU_LayerNode.AU_IsVisit = 0;                modelAU_LayerNode.AU_RemoveSameOffset1 = 0;                modelAU_LayerNode.AU_RemoveSameOffset2 = 0;                modelAU_LayerNode.AU_LastUpdateDate = System.DateTime.Now.Date;                m_bllAU_LayerNode.Add(strWholeDbName, modelAU_LayerNode);                DataSet dsTemps = m_bllAU_LayerNode.GetList(strWholeDbName, "");                this.dataGridView1.DataSource = dsTemps.Tables[0];                this.dataGridView1.Columns[1].Visible = false;                this.dataGridView1.Columns[0].Width = this.Width;            }            catch (Exception ex)            {            }        }

這裡,我們將採集到的博文儲存到資料庫中,其中用到了動軟代碼產生器的三層結構,具體代碼請自行下載研究。 

宋波
出處:http://www.cnblogs.com/ice-river/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。
正在看本人部落格的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日後必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得准,我分文不收;相不準,你也好回來找我!

網路採集軟體核心技術剖析系列(6)---將任意博主的全部博文下載到SQLite資料庫中並通過Webbrower顯示(將之前的內容綜合到一起)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.