一 本系列随笔概览及产生的背景

自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱。同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的。

该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者。

本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持。

很多初学者常有此类困惑,“为什么我书也看了,C#相关的各个方面的知识都有所了解,但就是没法写出一个像样的应用呢?”,

这其实还是没有学会综合运用所学知识,锻炼出编程思维,建立起学习兴趣,我想该系列文章也许会帮到您,但愿如此。

开发环境:VS2008

本节源码位置:https://github.com/songboriceboy/GatherAll

源码下载办法:安装SVN客户端(本文最后提供下载地址),然后checkout以下的地址:https://github.com/songboriceboy/GatherAll

系列文章提纲如下:

二 第五节主要内容简介(将任意博主的全部博文下载到内存中并通过Webbrower显示)

将任意博主的全部博文下载到内存中并通过Webbrower显示的解决方案,演示demo如下图所示:可执行文件下载

三 基本原理

本节我们提供了一个示例将本系列中的第一节和第二节的内容综合到一起,实现下载博客园任意博主的全部博文功能。用户只要在编辑框中输入博客园任意博主的ID,该博主的全部文章就会被下载到内存中,我们本节就来剖析一下实现原理。

采集博文的结构图如下所示:

总体步骤如下:

1.用分页地址初始化Url队列(其实是一个堆栈数据结构),具体请参考本系列第一节内容;

2.调度器不断从Url队列中取得url,从网上获取该url对应的网页正文;

3.多线程的网页爬虫分析下载到的网页正文是链接提取页还是文章正文页;

(1)若为链接提取页面,则提取全部符合规则的文章链接,然后压入到前面的Url队列中(其实是堆栈操作,这里可以理解为,一个分页页面地址换取了几十个文章链接地址,接下来调度器将取得的链接是这几十个文章链接地址,全部下载完,存储到数据存储后,接下来才会轮到取第二个分页页面,这点大家可以对照提供的代码自行理解,此处是网络爬虫的精髓)。

(2)若为文章正文页,则按照正文css路径,提取出正文,存储到数据存储中(本节为datatable中),具体可参考本系列第二节内容。

4.递归的执行第2步和第3步,直至Url队列为空或已经判断出全部文章下载完毕(参见第一节)时,程序结束。

核心代码如下:

private void ParseWebPage(string strVisitUrl, string strPageContent, DoWorkEventArgs e)
{ string strUrlFilterRule = GetUrlFilterRule(); if (!IsFinalPage(strVisitUrl, strUrlFilterRule))
{ bool bNoArticle = SaveUrlToDB(strVisitUrl, strPageContent, e);
if (!bNoArticle)
{
BlogGatherNext(e);
}
}
else
{
if (strPageContent != "")
{
string strTitle = SaveFinalPageContent(""
, GetMainContentCss(), strVisitUrl, strPageContent); } BlogGatherNext(e);
}
}

IsFinalPage(strVisitUrl, strUrlFilterRule),该行代码根据本次请求的url和文章链接的url规则来判断当前获取的页面是最终文章页还是文章链接提取页,其实现代码如下:

       protected  bool IsFinalPage(string strVisitUrl, string strUrlFilterRule)
{
bool bRet = false; MatchCollection matchsTemp = Regex.Matches(strVisitUrl.ToString(), strUrlFilterRule, RegexOptions.Singleline);
if (matchsTemp.Count > )
{
bRet = true;
}
return bRet;
}

补充说明,何谓链接提取页?如下图所示即是:

更详细的代码请自行下载研究。

作者:宋波
出处:http://www.cnblogs.com/ice-river/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)的更多相关文章

  1. 网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  2. 网络采集软件核心技术剖析系列(6)---将任意博主的全部博文下载到SQLite数据库中并通过Webbrower显示(将之前的内容综合到一起)

    一 本系列随笔目录及本节代码下载 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软 ...

  3. 网络采集软件核心技术剖析系列(4)---使用C#语言如何将html网页转换成pdf(html2pdf)

    一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第四篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...

  4. 网络采集软件核心技术剖析系列(3)---如何使用C#语言下载博文中的全部图片到本地并可以离线浏览

    一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第三篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...

  5. 网络采集软件核心技术剖析系列(2)---如何使用C#语言获得任意站点博文的正文及标题

    一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第二篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...

  6. 【STM32系列汇总】小白博主的STM32实战快速进阶之路(持续更新)

    我把之前在学习和工作中使用STM32进行嵌入式开发的经验和教程等相关整理到这里,方便查阅学习,如果能帮助到您,请帮忙点个赞: 本文的宗旨 STM32 只是一个硬件平台,同样地他可以换成MSP430,N ...

  7. 【matlab系列汇总】小白博主的matlab学习实战快速进阶之路(持续更新)

    我把之前在学习和工作中使用matlab的技巧和使用教程等相关整理到这里,方便查阅学习,如果能帮助到您,请帮忙点个赞: MATLAB可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程 ...

  8. 【Linux系列汇总】小白博主的嵌入式Linux实战快速进阶之路(持续更新)

    我把之前在学习嵌入式Linux和工作中遇到问题和相关经验等,一起整理到这里,方便自己查阅和学习,温故而知新,如果能帮助到您,请帮忙点个赞: 本文的宗旨 嵌入式Linux 的项目通常需要一个团队来开发, ...

  9. WorldWind源码剖析系列:网络下载类WebDownload

    网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作.该类使用了两个委托类型和一个枚举类型. 该类的类图如下. 网络下载类WebDownload各个字段和属性的含义说明如下: st ...

随机推荐

  1. 转:Linux下使用Nginx搭建简单图片服务器

    最近经常有人问图片上传怎么做,有哪些方案做比较好,也看到过有关于上传图片的做法,但是都不是最好的,今天再这里简单讲一下Nginx实现上传图片以及图片服务器的大致理念. 如果是个人项目或者企业小项目,仅 ...

  2. nodejs与sqlite

    //打开数据库var db = new sqlite3.Database('xx.db'); // 关闭数据库db.close(); db.run('xx');  // 数据库对象的run函数可以执行 ...

  3. SCC模板

    vector<int> G[maxn]; int pre[maxn], low[maxn], c[maxn]; int n, m; stack<int> s; int dfst ...

  4. Tomcat部署时war和war exploded区别及验证

    war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: 是选择war还是war exploded 这里首先看一下他们两个的区别: war模式 ...

  5. 2017年上海金马五校程序设计竞赛:Problem C : Count the Number (模拟)

    Description Given n numbers, your task is to insert '+' or '-' in front of each number to construct ...

  6. 鼠标DPI和液晶显示器分辨率的关系

    鼠标DPI和液晶显示器分辨率的关系 说起鼠标,有两个性能指标是我们不能忽略的.一是游戏玩家相当熟悉的扫描率(单位:Frames Per Second),二是我们今天要和大家探讨的鼠标的分辨率(单位:D ...

  7. MongoDB简介以及下载安装

    什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.运行稳定,性能高 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在 ...

  8. memcached启动脚本(class练习)

    说明:使用类的方式编写程序启动脚本(memcached) import time import os from subprocess import Popen,PIPE class Process(o ...

  9. 字符设备驱动ioctl实现用户层内核层通信

    测试代码实现 memdev.h #ifndef _MEMDEV_H_ #define _MEMDEV_H_ #include<linux/ioctl.h> #ifndef MEMDEV_M ...

  10. Mac-WIFI总是断网

    $ cd /Library/Preferences/SystemConfiguration/ 删除如下文件 com.apple.airport.preferences.plist com.apple. ...