内容采集软件(网络采集软件核心技术剖析系列(3)--如何使用C#语言)
优采云 发布时间: 2022-01-04 22:08内容采集软件(网络采集软件核心技术剖析系列(3)--如何使用C#语言)
一系列论文的概述和背景
自主研发的DouJohnson博客备份专家软件工具自问世3年多以来,深受博客写作和阅读爱好者的喜爱。同时,也有一些技术爱好者向我咨询如何实现这个软件中的各种实用功能。
该软件是使用.NET 技术开发的。为回馈社会,特开设软件使用的核心技术专栏,为广大技术爱好者写了一系列文章。
本系列文章不仅讲解了网络采集、编辑、发布中用到的各种重要技术,还提供了很多界面开发中的解题思路和编程经验。非常适合.NET开发的初学者和中级读者。希望请多多支持。
很多初学者经常会有这种困惑,“为什么我看了这本书,对C#的方方面面都了如指掌,却写不出一个像样的应用程序?”,
其实我还没有学会如何综合运用所学的知识,锻炼编程思维,培养学习兴趣。我认为这个系列文章 可能对你有帮助,我希望如此。
开发环境:VS2008
本节源码位置:
源码下载方法:安装SVN客户端(文末提供下载地址),然后查看如下地址:
文章系列大纲如下:
网络采集软件核心技术解析系列(1)---如何使用C#语言获取博客园中某博主的所有文章链接和标题
网络采集软件核心技术解析系列(2)---如何使用C#语言获取任意站点博文的正文和标题
网络采集软件核心技术解析系列(3)---如何使用C#语言将博文中的所有图片下载到本地并离线浏览
网络采集软件核心技术解析系列(4)---如何使用C#语言将html网页转成pdf(html2pdf)
网络采集软件核心技术解析系列(5)---将任意博主的所有博文下载到内存中,通过Webbrower展示
网络采集软件核心技术分析系列(6)---将任何博主的所有博文下载到SQLite数据库中,通过Webbrower展示
网络采集软件核心技术解析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面、菜单栏、树形列表、多标签界面)
网络采集软件核心技术解析系列(综合实例)
2.第五节主要内容介绍(将任一博主的所有博文下载到内存中,并通过Webbrower显示)
将任何博主的所有博文下载到内存中,并通过Webbrower显示解决方案。演示如下图所示: 可执行文件下载
三个基本原则
在本节中,我们提供一个示例,将本系列第一节和第二节的内容整合起来,实现博客园中任何博主的所有博文的下载。只要用户在编辑框中输入博客园中任意一位博主的ID,博主的所有文章都会被下载到内存中。我们将在本节中分析其实现原理。
采集博客*敏*感*词*如下:
总体步骤如下:
1. 用页地址(其实是栈数据结构)初始化Url队列,详细请参考本系列第一节;
2. 调度器不断从Url队列中获取URL,从互联网获取URL对应的网页正文;
3.多线程网络爬虫分析下载的网页正文是链接提取页还是文章正文页;
(1)如果是链接提取页面,将所有符合规则的文章链接提取出来,然后push到之前的Url队列中(其实是栈操作,这里可以理解为分页页面地址换取 几十个文章链接地址后,调度器获取的下一个链接就是这几十个文章链接地址,全部下载并存入数据存储器,然后接下来将轮到fetch第二个分页页面,通过对比提供的代码就可以理解这一点,这里是网络爬虫的精髓)。
(2)如果是文章文本页面,根据文本css路径提取文本并存入数据存储(本节为datatable)。具体请参考第二节这个系列的。
4. 递归执行步骤2和3,直到Url队列为空或者已经确定所有文章下载完成(见第1节),程序结束。
核心代码如下:
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 > 0)
{
bRet = true;
}
return bRet;
}
补充说明,什么是链接提取页面?如下图所示:
更详细的代码请自行下载学习。