2024年6月

 因为要到一家互联网公司参加自然语言处理实习生面试,对于岗位要求中提到的工作内容--"网页正文内容提取"的相关知识进行了一下突击。重点看了一下网页正文提取所涉及到的各种算法,网上的内容很多,我只是看了其中一小部分,对各类算法做了一个简单的了解,不敢说对其做一个综述,只是以一个学习者的学习习惯来记录我对网页正文提取算法的浅认识,本文并不会对算法进行详细的步骤讲解,只提思路和思想。

  为什么要进行正文提取?

  对于一个单独的网页,往往最有价值的部分是网页的正文。然而就现在的大多数的网站的网页而言,不仅仅包含正文,网页标签等,其他的如广告,网页链接,插件等占据了网页相当一部分的内容。由于现实的需要,我们往往需要对网页的内容进行分析从而提取有价值的信息。一个网页的内容基本包含在正文中,对于新闻类网页尤其。将网页正文之外其他的内容剔除从而降低分析的难度是一种基本的思路。同时正文内容提取的好坏直接影响到接下来分析工作的质量。如何使用最快捷的方法来获取网页的正文同时又保证提取的内容的准确性?人们为这个问题一直努力着!

  网页正文提取的思路及算法

  作为一个刚开始对正文提取没有什么认识的人,比如我,第一想法就是利用HTML网页的标签来判断正文的位置。因为根据网页的编辑和布局习惯,一般会将网页在正文部分放入到<p>,<table>以及<div> 中,并且应该包含<title>和<head>等标签。如果能够利用正则表达式首先找到这些标签的位置,并做相应的判断即可找到正文的内容位置。这是第一种思路,基于标签。

  1. 基于标签

  这是很容易想到的一种思路。基于HTML文件本身的某些结构特点和规范。这里也可以细分:

  • 基于标签窗的算法: 例如<p>段落标签,一般的正文内容都会嵌套其中。<title>标题标签,一般会将论文的标题嵌入,接下来的内容很大程度上应该是正文的内容了。根据写作习惯,标题下方开始写正文,上方<p>标签就应该会频繁出现,主要的思路是标签的某种组合和标签的内容对应。

  • 基于标签密度的算法:对于大多数的网页而言,正文部分的标签明显要少于非正文部分,而且正文当中的标签大部分标签应该属于修饰类标签。这就有一种基于标签统计的思路算法。从某一行开始,标签数量明显减少,到某一行又骤升,这一间隔区域很大程度上就属于网页的正文部分。

  • 基于DOM树的算法:

   什么叫DOM(Document Object Model)树:并没有看到对DOM树的定义,不过很容易理解,下图就很明白体现了一种对应关系。

   在一个网页中标签的位置下左图所示,而对应的DOM树如下又图(图片来源:http://www.w3school.com.cn/htmldom/dom_nodes.asp)所示:

     

    这种算法需要对网站HTML建立DOM树,然后对之进行遍历递归,去除相应的噪音信息之后再从剩余的节点中进行选择。由于要建立DOM树,算法的时间/空间复杂度均较高。

  基于标签的算法都潜在默认了这样的一个信息:即网站的网页生成,制作都遵循了一定的标签使用规范。不过现在的互联网网页五花八门,很难都按常理出牌,所以这在一定程度上降低了算法的准确性和通用性。

  2. 基于内容

  网页按照内容形式分类大概分为:主题型,图片型和目录型。

  对于主体型的网页,例如新闻类,博客类等,主要特点是文字内容比较多。基于这一点,另外一种正文提取思路是基于正文本身的特点。在一定程度上,正文的文字数量要比其他部分多。这在一定程度上有助于形成了区域的区分度。文字数量的骤增和骤减在一定程度上可以作为正文开始和介绍的判读点。

  这类算法在本质上没有多大的差异,只是选择度量文字密度的方式不同而已。有的是基于块,有的是基于行,有的是基于转化函数。算法都很容易理解,也相对比较容易实现。下面的几篇文章就是基于网页内容的算法。

  《基于行块分布函数的通用网页正文抽取》陈鑫

  《基于网页分块的正文信息提取方法》 黄 玲,陈 龙

  博文《我为开源作贡献,网页正文提取--HtmlArticle2》

  3. 基于视觉

  想对于前面两种思路,这类算法的思路有一种"高大上"的感觉。这里不得不提到这类算法的基础:VIPS(Vision-based Page Segementation)算法。

  VIPS算法:利用背景颜色,字体颜色和大小,边框,逻辑块和逻辑块之间的间距等视觉特征,制定相应的规则把页面分割成各个视觉块!(视觉效果真的是千变万化,如何制定规则集始终是个复杂的问题)

  VIPS算法充分利用了Web页面的布局特征。它首先从DOM 树中提取出所有合适的页面块,然后根据这些页面块检测出它们之间所有的分割条,包括水平和垂直方向;最后基于这些分割条.重新构建Web页面的语义结构。对于每一个语义块又可以使用VIPS算法继续分割为更小的语义块。该算法分为页面块提取、分隔条提取和语义块重构3部分,并且是递归调用的过程,直到条件不满足为止.

  相关文献:

  《基于视觉特征的网页正文提取方法研究》安增文,徐杰锋

  《A vision—based page segmentation algorithm》

  4. 基于数据挖掘/机器学习

  看到很多作者对这一思路的普遍评价是"杀鸡焉用牛刀"。

  基本思路是使用一定数量的网页作为训练集,通过训练得到网页正文的一些特点,然后将这些特征作为网页片段是否符合网页正文的判断依据。对于数据挖掘/机器学习算法来讲,训练样本的采集很重要,然而现实是互联网中网页形式千变万化,不太可能取太多数量作为训练样本。这样这种算法的准确性和通用性就受到了制约,同时这类算法前期工作也比较复杂。


基于网页结构的算法确实是一种有效的方式来识别并提取网页中的文章内容。下面是一个更详细的步骤描述,这些步骤描述了如何使用网页结构、文本密度和链接密度等特征来识别并提取文章内容:

  1. 加载并解析网页

    • 使用一个HTML解析库(如Python的BeautifulSoup、lxml,或者JavaScript的DOM解析器等)来加载和解析网页的HTML代码。

  2. 寻找文章主体元素

    • 检查HTML文档是否包含语义化标签,如<article><main><section><content>等。这些标签通常用于标识页面的主要内容区域。

    • 如果没有找到这些语义化标签,则可能需要通过更复杂的CSS选择器或者DOM树遍历来找到文章内容的可能位置。

  3. 计算文本密度

    • 遍历HTML文档的每个元素或区域,并计算它们的文本密度。文本密度通常可以通过元素中纯文本字符的数量与元素总字符数的比例来计算。

    • 文章内容区域的文本密度通常较高,因为它们包含大量的文本内容。

  4. 计算链接密度

    • 同样地,遍历HTML文档的每个元素或区域,并计算它们的链接密度。链接密度可以通过元素中链接(<a>标签)的数量与元素总标签数量的比例来计算。

    • 文章内容区域的链接密度通常较低,因为链接主要用于导航或引用其他资源,而不是文章的主要内容。

  5. 综合评估并提取内容

    • 结合文本密度和链接密度以及其他可能的特征(如元素的类名、ID、位置等),对页面中的不同区域进行综合评估。

    • 识别出最有可能是文章内容的区域,并提取其中的纯文本内容。

  6. 后处理

    • 对提取到的文本内容进行后处理,包括去除HTML标签、去除多余的空格和换行符、处理特殊字符等。

    • 如果需要,还可以进行进一步的文本处理,如分词、词性标注、命名实体识别等,以便于后续的分析或应用。

  7. 测试和验证

    • 使用一组具有不同结构和内容的网页来测试算法的性能和准确性。

    • 根据测试结果对算法进行调整和优化,以提高其适应性和准确性。

需要注意的是,由于网页结构的多样性和复杂性,没有一种算法能够适用于所有类型的网页。因此,在实际应用中,可能需要结合多种算法和技术来综合提取和分析网页中的文章内容。同时,由于网页内容的动态性和变化性,算法也需要具有一定的适应性和鲁棒性,以应对不断变化的网页结构和内容。


基于机器学习的算法

这类算法使用机器学习模型来识别网页中的文章内容。它们通常会训练模型来识别文章内容的语义特征,例如文本的主题、关键词和句子的结构。这类算法的优点是可以适应各种类型的网页,并且可以随着时间的推移提高准确性。

一些常用的基于机器学习的网页内容提取算法包括:

  • 基于支持向量机的算法:这类算法将网页内容表示为特征向量,然后使用支持向量机来区分文章内容和其他内容。

  • 基于条件随机场的算法:这类算法将网页内容视为序列,并使用条件随机场来预测每个词是否是文章内容的一部分。

  • 基于神经网络的算法:这类算法使用神经网络来学习网页内容的语义特征,然后进行提取。

基于自然语言处理的算法

这类算法利用自然语言处理技术来分析网页内容的文本特征,从而识别文章内容。它们通常会使用以下技术:

  • 文本相似度:计算网页内容与已知文章内容的文本相似度,以此来判断其是否属于文章内容。

  • 主题建模:使用主题建模技术来分析网页内容的主题,并识别与文章主题相关的文本。

  • 句法分析:分析网页内容的句法结构,并识别文章中常见的句法模式。

基于网页结构的算法

这类算法利用网页的结构信息来识别文章内容。它们通常会分析网页的HTML代码,并寻找以下特征:

  • 文章主体元素:例如 <article>, <main>, <content> 等元素。

  • 文本密度:文章内容的文本密度通常较高,而其他内容的文本密度较低。

  • 链接密度:文章内容中通常包含较少的链接,而其他内容中可能包含大量的链接。

混合算法

一些算法会结合多种技术来提高提取的准确性。例如,可以将机器学习算法与自然语言处理算法或网页结构算法相结合。

选择合适的算法

选择合适的算法取决于您的具体需求。如果您需要一种通用的算法,可以考虑使用基于机器学习的算法。如果您需要一种可以针对特定类型的网页进行优化的算法,可以考虑使用基于自然语言处理或网页结构的算法。

以下是一些可以帮助您选择合适的算法的因素:

  • 网页类型的多样性:如果您需要处理多种类型的网页,则需要选择一种能够适应不同类型网页的算法。

  • 提取的准确性要求:如果您需要高精度的提取结果,则需要选择一种性能更好的算法。

  • 计算资源的限制:一些算法需要大量的计算资源,因此您需要考虑您的计算能力限制。


1:.Net开源的跨平台爬虫框架 DotnetSpider Star:430

DotnetSpider这是国人开源的一个跨平台、高性能、轻量级的爬虫软件,采用 C# 开发。目前是.Net开源爬虫最为优秀的爬虫之一。


2:俄国牛人写的开源爬虫xNet Star:117

这个一个俄国牛人写的开源工具,为啥说他强悍了,因为他将所有Http协议的底层都实现了一遍,这有啥好处?只要你是写爬虫的,都会遇到一个让人抓狂的问题,就是明明知道自己Http请求头跟浏览器一模一样了,为啥还会获取不到自己想要的数据

3:开源的.net爬虫Abot Star:1050

Abot是一个开源的.net爬虫,速度快,易于使用和扩展

4:C#仿火车头的开源数据采集器V5_DataCollection Star:25

V5 数据采集器是一款面向个人及专业用户提供的一款专业的数据采集软件,即适用于简单化配置操作,也适应针对复杂数据采集的能力,所见即可采。 V5数据采集器独有的代理轮询采集机制,可有效的解决网站屏蔽问题,可用于互联网数据动态监控,绝对是您的首选

5:C#爬虫引擎内核版SmartSpider Star:17

SmartSpider爬虫引擎内核版,全新的设计理念,真正的极简版本。

6:.Net开源的超级爬虫Hawk Star:1039

HAWK是一种数据采集和清洗工具,依据GPL协议开源,能够灵活,有效地采集来自网页,数据库,文件, 并通过可视化地拖拽, 快速地进行生成,过滤,转换等操作。其功能最适合的领域,是爬虫和数据清洗

7:基于C#.NET的简单且高效的网站爬虫 Star:58

Simple-Web-Crawler - 基于C#.NET的简单网页爬虫,支持异步并发、切换代理、操作Cookie、Gzip加速。

8:网站数据采集软件网络矿工采集器(原soukey采摘) 

Soukey采摘网站数据采集软件是一款基于.Net平台的开源软件,也是网站数据采集软件类型中唯一一款开源软件。尽管Soukey采摘开源,但并不会影响软件功能的提供,甚至要比一些商用软件的功能还要丰富。Soukey采摘当前提供的主要功能如下: 1.    多任务多线程数据采集,支持POST方式;...

9:网站数据采集软件NETSpider Star:94

NETSpider网站数据采集软件是一款基于.Net平台的开源软件。 软件部分功能是基本Soukey软件进行开发的.这个版本采用VS2010+.NET3.5进行开发的. NETSpider采摘当前提供的主要功能如下: 1.    多任务多线程数据采集,支持POST方式(待定); 2.    可...

10:网络爬虫程序NWebCrawler 

NWebCrawler是一款开源的C#网络爬虫程序

11:Web爬虫工具NCrawler 

NCrawler 是一个Web Crawler 工具,它可以让开发人员很轻松的发展出具有Web Crawler 能力的应用程式,并且具有可以延展的能力,让开发人员可以扩充它的功能,以支援其他类型的资源(例如PDF /Word/Excel 等档案或其他资料来源)。 NCrawler 使用多执行绪...

12:多线程web爬虫程序spidernet 

spidernet是一个以递归树为模型的多线程web爬虫程序, 支持text/html资源的获取. 可以设定爬行深度, 最大下载字节数限制, 支持gzip解码, 支持以gbk(gb2312)和utf8编码的资源; 存储于sqlite数据文件. 源码中TODO:标记描述了未完成功能, 希望提交你...

13:网页爬虫ScrapingSpider Star:48

ScrapingSpider 是一个业余时间开发的,支持多线程,支持关键字过滤,支持正文内容智能识别的爬虫。    爬虫的核心实现在ScrapingSpider.Core程序集中。爬虫类为Spider类,爬虫的爬取逻辑,与页面处理逻辑通过事件分离,两个关键事件为AddUrlEvent和Data...

14:爬虫小新Sinawler 

国内第一个针对微博数据的爬虫程序!原名“新浪微博爬虫”。 登录后,可以指定用户为起点,以该用户的关注人、粉丝为线索,延人脉关系搜集用户基本信息、微博数据、评论数据。 该应用获取的数据可作为科研、与新浪微博相关的研发等的数据支持,但请勿用于商业用途。该应用基于.NET2.0框架,需SQL SER...