一篇关于网络爬虫程序的一些原理及体系结构纯技术文章,一些地方可能不会看的非常明确。对于SEO行业,常常和搜索引擎及其爬虫程序打交道,细致浏览下,一些不清楚而自己又非常想了解的地方,能够借助搜索来需找相关解释,对工作还是有帮助的(个人觉得值得注意的地方已加红显示)。

文章相对较长。我分两次公布,能够转换成PDF格式文档阅读(太懒的童鞋能够在下篇文章结尾自行下载)。

  网络爬虫工作原理

  1、聚焦爬虫工作原理及关键技术概述

  网络爬虫是一个自己主动提取网页的程序。它为搜索引擎从Internet网上下载网页。是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL開始,获得初始网页上的URL。在抓取网页的过程中。不断从当前页面上抽取新的URL放入队列。直到满足系统的一定停止条件。

聚焦爬虫的工作流程较为复杂,须要依据一定的网页分析算法过滤与主题无关的链接,保留实用的链接并将其放入等待抓取的URL队列。

然后,它将依据一定的搜索策略从队列中选择下一步要抓取的网页URL,并反复上述过程,直到达到系统的某一条件时停止,另外。全部被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索。对于聚焦爬虫来说。这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。

  相对于通用网络爬虫,聚焦爬虫还须要解决三个主要问题:

  对抓取目标的描写叙述或定义。

  对网页或数据的分析与过滤;

  对URL的搜索策略。

  抓取目标的描写叙述和定义是决定网页分析算法与URL搜索策略怎样制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。

这两个部分的算法又是紧密相关的。

  2、抓取目标描写叙述

  现有聚焦爬虫对抓取目标的描写叙述可分为基于目标网页特征、基于目标数据模式和基于领域概念3种。

  基于目标网页特征的爬虫所抓取、存储并索引的对象一般为站点或网页。依据种子样本获取方式可分为:

  预先给定的初始抓取种子样本;

  预先给定的网页分类文件夹和与分类文件夹相应的种子样本,如Yahoo!分类结构等。

  通过用户行为确定的抓取目标例子。分为:用户浏览过程中显示标注的抓取样本;通过用户日志挖掘得到訪问模式及相关样本。

  当中,网页特征能够是网页的内容特征,也能够是网页的链接结构特征,等等。

  基于目标数据模式的爬虫针对的是网页上的数据。所抓取的数据一般要符合一定的模式,或者能够转化或映射为目标数据模式。

  还有一种描写叙述方式是建立目标领域的本体或词典,用于从语义角度分析不同特征在某一主题中的重要程度。

  3、网页搜索策略

  网页的抓取策略能够分为深度优先、广度优先和最佳优先三种。深度优先在非常多情况下会导致爬虫的陷入(trapped)问题,眼下常见的是广度优先和最佳优先方法。

  3.1 

广度优先搜索策略

  广度优先搜索策略是指在抓取过程中。在完毕当前层次的搜索后,才进行下一层次的搜索。该算法的设计和实现相对简单。在眼下为覆盖尽可能多的网页。 

一般使用广度优先搜索方法。也有非常多研究将广度优先搜索策略应用于聚焦爬虫中。其基本思想是觉得与初始URL在一定链接距离内的网页具有主题相关性的概率非常大。第二种方法是将广度优先搜索与网页过滤技术结合使用。先用广度优先策略抓取网页,再将当中无关的网页过滤掉。这些方法的缺点在于,随着抓取网页的增多,大量的无关网页将被下载并过滤,算法的效率将变低。

  3.2 

最佳优先搜索策略

  最佳优先搜索策略依照一定的网页分析算法,预測候选URL与目标网页的相似度,或与主题的相关性。并选取评价最好的一个或几个URL进行抓取。

它仅仅訪问经过网页分析算法预測为“实用”的网页。存在的一个问题是,在爬虫抓取路径上的非常多相关网页可能被忽略,由于最佳优先策略是一种局部最优搜索算法。 

因此须要将最佳优先结合详细的应用进行改进,以跳出局部最长处。将在第4节中结合网页分析算法作详细的讨论。研究表明,这种闭环调整能够将无关网页数量减少30%~90%。

  4、网页分析算法

  网页分析算法能够归纳为基于网络拓扑、基于网页内容和基于用户訪问行为三种类型。

  4.1 

基于网络拓扑的分析算法

  基于网页之间的链接。通过已知的网页或数据,来对与其有直接或间接链接关系的对象(能够是网页或站点等)作出评价的算法。又分为网页粒度、站点粒度和网页块粒度这三种。

  4.1.1 

网页粒度的分析算法

  PageRank和HITS算法是最常见的链接分析算法,两者都是通过对网页间链接度的递归和规范化计算,得到每一个网页的重要度评价。 

PageRank算法尽管考虑了用户訪问行为的随机性和Sink网页的存在。但忽略了绝大多数用户訪问时带有目的性。即网页和链接与查询主题的相关性。针 

对这个问题,HITS算法提出了两个关键的概念:权威型网页(authority)和中心型网页(hub)。

  基于链接的抓取的问题是相关页面主题团之间的隧道现象。即非常多在抓取路径上偏离主题的网页也指向目标网页,局部评价策略中断了在当前路径上的抓取行为。部分文献提出了一种基于反向链接(BackLink)的分层式上下文模型(Context 

Model)。用于描写叙述指向目标网页一定物理跳数半径内的网页拓扑图的中心Layer0为目标网页。将网页根据指向目标网页的物理跳数进行层次划分。从外层网页指向内层网页的链接称为反向链接。

  4.1.2 

站点粒度的分析算法

  站点粒度的资源发现和管理策略也比网页粒度的更简单有效。

站点粒度的爬虫抓取的关键之处在于站点的划分和站点等级(SiteRank)的计算,SiteRank的计算方法与PageRank类似。可是须要对站点之间的链接作一定程度抽象,并在一定的模型下计算链接的权重。

  站点划分情况分为按域名划分和按IP地址划分两种。一些文献讨论了在分布式情况下,通过对同一个域名下不同主机、server的IP地址进行站 

点划分。构造网站图,利用类似PageRank的方法评价SiteRank。

同一时候。依据不同文件在各个网站上的分布情况。构造文档图,结合 

SiteRank分布式计算得到DocRank。利用分布式的SiteRank计算。不仅大大减少了单机网站的算法代价。并且克服了单独网站对整个网络覆盖率有限的缺点。附带的一个长处是。常见PageRank 

造假难以对SiteRank进行欺骗。

  4.1.3 

网页块粒度的分析算法

  在一个页面中,往往含有多个指向其它页面的链接。这些链接中仅仅有一部分是指向主题相关网页的,或依据网页的链接锚文本表明其具有较高重要性。可是,在PageRank和HITS算法中。没有对这些链接作区分。因此经常给网页分析带来广告等噪声链接的干扰。在网页块级别(Block 

level) 进行链接分析的算法的基本思想是通过VIPS网页切割算法将网页分为不同的网页块(page block),然后对这些网页块建立page to 

block和block to page的链接矩阵, 分别记为Z和X。于是,在 page to page图上的网页块级别的PageRank为 W(p)=X×Z。 

在block to block图上的BlockRank为 W(b)=Z×X。 

已经有人实现了块级别的PageRank和HITS算法,并通过实验证明,效率和准确率都比传统的相应算法要好。

  4.2 

基于网页内容的网页分析算法

  基于网页内容的分析算法指的是利用网页内容(文本、数据等资源)特征进行的网页评价。网页的内容从原来的以超文本为主,发展到后来动态页面(或称 

为Hidden Web)数据为主。后者的数据量约为直接可见页面数据(PIW,Publicly Indexable 

Web)的400~500倍。还有一方面。多媒体数据、Web 

Service等各种网络资源形式也日益丰富。

因此。基于网页内容的分析算法也从原来的较为单纯的文本检索方法。发展为涵盖网页数据抽取、机器学习、数据挖掘、语义理解等多种方法的综合应用。本节依据网页数据形式的不同。将基于网页内容的分析算法,归纳下面三类:

  针对以文本和超链接为主的无结构或结构非常easy的网页;

  针对从结构化的数据源(如RDBMS)动态生成的页面。其数据不能直接批量訪问;

  针对的数据界于第一和第二类数据之间,具有较好的结构。显示遵循一定模式或风格,且能够直接訪问。

SEO 爬虫原理介绍的更多相关文章

  1. 想成为Python高手,必须看这篇爬虫原理介绍!(附29个爬虫项目)

    互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前. 一.爬虫是什么? 如果我们 ...

  2. 03 Yarn 原理介绍

    Yarn 原理介绍 大纲: Hadoop 架构介绍 YARN 产生的背景 YARN 基础架构及原理   Hadoop的1.X架构的介绍   在1.x中的NameNodes只可能有一个,虽然可以通过Se ...

  3. 04 MapReduce原理介绍

    大数据实战(上) # MapReduce原理介绍 大纲: * Mapreduce介绍 * MapReduce2运行原理 * shuffle及排序    定义 * Mapreduce 最早是由googl ...

  4. Android Animation学习(一) Property Animation原理介绍和API简介

    Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...

  5. [转]MySQL主从复制原理介绍

    MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...

  6. 分布式文件系统FastDFS原理介绍

    在生产中我们一般希望文件系统能帮我们解决以下问题,如:1.超大数据存储:2.数据高可用(冗余备份):3.读/写高性能:4.海量数据计算.最好还得支持多平台多语言,支持高并发. 由于单台服务器无法满足以 ...

  7. Python分布式爬虫原理

    转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...

  8. 内存分析_.Net内存原理介绍

    内存原理介绍 1.       .Net应用程序中的内存 1.1.Net内存类型 Windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上.其实际结果 ...

  9. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍

    液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...

随机推荐

  1. Webpack 2.0 的文档

    Webpack 2.0 的文档 https://webpack.js.org/get-started/

  2. IPv6系列-初学者的10个常见困扰

    本文是<IPv6系列>文章的第二篇<常见困扰>,紧接<入门指南>,用于解答IPv6的10个常见困扰. 小慢哥的原创文章,欢迎转载 目录 ▪ 本文缘由 ▪ 困扰1. ...

  3. mybatis一对多关系的关联查询

    问题描述:实现两张表的关联查询 学生表: 班级表: 要实现学生管理信息中有所在班级的名称,即如下图所示 1.对应学生表的pojo类写全班级表中的字段(适用于要连接的表字段较少的情况) sql语句直接在 ...

  4. 进击的Python【第二十二章】

    day22 知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 内容详细: 1. Session 基于Cookie ...

  5. # 深入理解Redis(二)——内存管理的建议与技巧

    引语 随着使用Redis的深入,我们不可避免的需要深入了解优化Redis的内存,本章将重点讲解Redis的内存优化之道,同时推荐大家阅读memory-optimization一文. 想要高效的使用Re ...

  6. POJ 2976 裸的01分数规划

    题意:给你n个数对(认为是a数组和b数组吧),从中取n-m个数对,如果选第i个数对,定义x[i]=1,求R=∑(a[i]*x[i])/∑(b[i]*x[i])取得最大值时R的值.输出R*100(保留到 ...

  7. POJ 3630 trie树

    Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26559 Accepted: 8000 Descripti ...

  8. linux下常用命令失效

    注意:修改一下PATH环境变量 export PATH=/bin:/usr/bin/:. 可以把这句话加到你的.profile或者.bash_profile里,这样每次登录的时候都会生效

  9. Android 侦听应用(Package)变化的方法侦听广播

    应用的状态变化,包括安装.卸载.更新,是android系统上重要的事件.如何侦听到?有两种方法,一是通过侦听广播,一是实现PackageMonitor. 侦听广播   当Package状态发生变化时, ...

  10. js 字符串 处理方法

    charAt() 返回指定索引位置的字符 charCodeAt() 返回指定索引位置字符的 Unicode 值 concat() 连接两个或多个字符串,返回连接后的字符串 fromCharCode() ...