搜索引擎工作原理 您所在的位置:网站首页 简述搜索引擎的类型及工作原理图片 搜索引擎工作原理

搜索引擎工作原理

2024-07-16 05:37| 来源: 网络整理| 查看: 265

点击上方关注 前端技术江湖,一起学习,天天进步

作者:君额上似可跑马 

https://segmentfault.com/a/1190000019830311

搜索引擎的工作过程大体可以分为三个阶段:

1.对网页进行抓取建库

搜索引擎蜘蛛通过抓取页面上的链接访问其他网页,将获得的HTML代码存入数据库

2.预处理

索引程序对抓取来的页面数据进行文字提取、中文分词、索引等处理,为后面排名程序使用时做准备。

3.给搜索结果进行排名

用户输入关键词后,排名程序调用索引库数据,计算数据和关键词的相关性,然后按照一定格式生成搜索结果页面。

用到了大概三个程序,蜘蛛、索引程序、排名程序

对网页进行爬行、抓取、建库

如果我们要从一个页面进入另一个页面,我们需要在页面上点击这个超链接跳转到新的页面,这个链接指向另一个网页,相当于这个网页的入口

或者如果我们知道这个网页的url地址,就算我们没有在页面上看到链接到该网页的可点击的超链接,也可以通过在地址栏输入url地址转到该页面

当我们在一个网站发布了自己的文章,这篇文章会产生一个新的独一无二的url地址,当人们点击这个地址,它不会跳转到其他人写的文章页面,而是你写的特定的那一篇。

可以看出,所有页面,都会产生一个url地址使我们可以访问它。

整个互联网是由相互链接的页面组成的,如果一个网页,没有任何一个页面链接它,我们也不知道这个网页的地址,就算这个页面真实存在,它也会像一个孤岛一样,我们无法访问到这个页面。

日常生活中我们有多个搜索引擎可以使用,比如百度、谷歌、搜狗、bing等。

不同的搜索引擎就算查询同一个内容返回出来的结果都不一样,这是因为各个公司给内容进行排序的计算方式都是不一样的,哪个页面该排到第一页/哪个网页该排到最后一页/哪个网页根本就不应该展示出来都是有他们公司自己的评判标准,这些排名算法具体的内容基本都不会对外公开,避免被其他公司搜索引擎公司知道,因为排名算法是每个搜索引擎公司的核心竞争力。

为什么排名算法是每个搜索引擎公司的核心竞争力?

一般人们都会看哪个搜索引擎搜索出来的结果更符合TA自己的需求(相关性更高)就会选择长期使用哪一个。

比如,你在搜索输入框里输入【空调】两个字想查询关于空调的信息,结果搜索结果页给你返回的内容第一页竟然是一些电视机/马桶/衣柜之类的销售链接,这样相关性不高的网页越多,对你的使用体验就越差,最好的体验是,你搜索【空调】后,返回的页面里全是关于空调的信息,这样节约了你获取信息的时间成本,使你更方便的获取想要的资讯。

而排名算法就是为了让返回的结果尽量符合用户查询的内容的一种算法,他会对网页进行排名,把觉得对用户最有价值的网页排在前面,比如第一页第一个,用户能最快的看到这个网页,把相关性较差不重要的网页排在后面。把那些没有用的没有价值的页面直接不展示出来,经过对这些网页的排序,让用户尽量在只看第一页的情况下就能找到自己想要的资讯,解决掉自己的问题。

所以搜索引擎公司只要能对网页进行合理的排序,带给用户最大的方便,让用户感觉到返回的内容都很精准,正好是他们想要的内容,那么用户就会持续使用这个搜索引擎,所以如何对这些网页进行排序的计算方式就是每个搜索引擎公司的公司机密了。

爬行和抓取搜索引擎工作的第一步,目的是完成数据收集的任务。

当用户在搜索框输入想查询的内容后,所有展示出来的网页都是需要先经过搜索引擎的收集才能展示出来的,只有收集了,才能通过分析网页中的内容,对这些网页的价值和相关性进行一个判断,经过对网页的排序之后再返回给用户,用户在搜索结果页上看到的所有网页,都是已经被搜索引擎收集进数据库中的网页。

而那些互联网上没有被搜索引擎收集到的网页(搜索引擎不是什么网页都会放进数据库,每个搜索引擎都有自己的一个标准,就是什么样的网页才会被收集到数据库中。就像人类吃东西一样,只吃自己认为该吃的食物),就变成了永远无法访问的孤魂野鬼。

注:网页和网站的区别需要注意,蜘蛛在判断需不需要收集进索引数据库的是以网页为单位的。

比如整个淘宝是一个网站,但是淘宝中某一个商品的详情页面才算网页,还比如你现在所看的这篇文章所在的这一个页面才算网页。

所以,整个淘宝网站的页面那么多,蜘蛛在收集网页时,就算收集了A商品那页详情页面,但不代表B商品详情页面也被收集进索引数据库了,蜘蛛会对每个页面进行评判,只有该页面到达他的标准了,认为可以收集到索引数据库里了,才会把这个页面添加进去,而不是它认为淘宝这个网站很有价值,就把整个网站里所有页面全部收录进去了,SEO里有个概念叫做收录率,指的是页面的收录率,而不是网站的收录率。

蜘蛛

搜索引擎用来爬行和访问页面的程序叫做蜘蛛/爬虫(spider),或机器人(bot)。

蜘蛛访问网站页面的流程和人们在浏览器上访问页面的流程差不多,蜘蛛访问页面时,会发出页面访问请求,服务器会返回HTML代码,蜘蛛把收到的HTML代码存入原始页面数据库。

互联网上的页面这么多,为了提高爬行和抓取的速度,搜索引擎会同时使用多个蜘蛛对页面进行爬行。

理论上来说,互联网上的所有页面(这里指的是通过超链接互联链接在一起的页面,而不是那种虽然这个页面存在,但是没有任何网页用超链接指向他),蜘蛛都可以沿着页面上的超链接将所有页面爬行一遍,但是蜘蛛不会这么做,蜘蛛的时间有限,它会用效率最高的方式找到互联网上它觉得最有价值的网页。如果一个网站的页面普遍质量较低,蜘蛛就会认为这是一个低质网站,让用户阅读这类没有价值的网页是没有必要的,对于这类网页,它会减少爬行的频率,将重点放在其他质量更高的网站,去其他更有价值的网站上收集网页存入数据库。

但是蜘蛛不是全能,它也有评判错误的时候,比如蜘蛛不会收集空短页面,也就是内容空洞毫无营养,主体内容又短的页面,蜘蛛不会浪费数据库的空间放入这些网页。

但是一个页面究竟是不是真正的无价值网页,蜘蛛判断成功的正确率并不是100%,就像一个登录验证网页,确实没有比那些传递知识的网页更有价值,但是这是大部分网站一个必不可少的一个页面,严格来说并不是低质页面,但是如果蜘蛛爬行到了这个页面,它并不理解人类眼中的验证页面是一个怎样的存在,他只觉得,内容短,没什么丰富的内容,好,那就是无价值的网页了,它就像有一个专门用来记录的小本本一样,嗯,A网站,有一个低质页面,给这个网站评价好还是不好我还要在考虑一下,如果这样的低质页面多了,蜘蛛就会觉得你的网站整体质量较低,慢慢的就不爱到你网站上抓取网页了。

所以为了避免这种情况,不让蜘蛛抓取这些网页是最好的办法,我们可以在项目根目录创建一个txt文件,这个文件叫什么是有约定俗成的,文件名必须为 robots.txt,我们在文件里面规定好蜘蛛可以爬行/不能爬行哪些网页就行(具体写法可以百度)。

当蜘蛛访问任何一个网站的时候,第一件事就是先访问这个网站根目录下的robots.txt文件,如果文件里说了禁止让蜘蛛抓取XX文件/XX目录,蜘蛛就会按照文件里规定的那样,只抓取可以抓取的页面。

蜘蛛的分类

每个搜索引擎公司都有自己的蜘蛛,这些蜘蛛喜好不一,喜欢抓取什么类型的网页要看他们的主人,也就是要看搜索引擎公司他们的想法,虽然这些蜘蛛统称为蜘蛛,但他们属于不同的主人,当然名字肯定是不一样的。

在日志文件中可以看到有哪些公司的蜘蛛来访问过网站(user-agent那个)

蜘蛛主要分为下面几个:

百度蜘蛛 Baiduspider

谷歌蜘蛛 Googlebot

有道蜘蛛 YodaoBot

理论上来说,随便找一个页面,顺着这个页面,蜘蛛可以将互联网上所有的页面都爬一遍

实际上这样确实是可行的(除去那些没有被任何一个网页所指向的页面),而蜘蛛是如何做到的呢?

比如,蜘蛛先从A页面开始,它爬行到A页面上,它可以获取到A页面中所有的超链接,蜘蛛再顺着这个链接进入到链接所指向的页面,再获取到这个页面上所有的超链接进行爬行抓取,这样一来,所有用超链接所关联上的网页便可以被蜘蛛都爬行一遍。

蜘蛛在爬行时,也是有自己的爬行策略的,就像吃西瓜,把整个西瓜切一半切成一个半圆体,我们选择吃西瓜的方式可以深度优先,随便从中间还是边缘开始吃都行,比如先从中间吃,西瓜中间底下全部挖干净了再围着中间的圆圈慢慢往外面扩散。

或者广度优先,从中间或者是边缘随便哪里开始都行,把表面一层挖完了西瓜再进行下一个深度的挖取。

蜘蛛的爬行策略

蜘蛛的爬行策略和挖西瓜一样,都是两种方式

深度优先

广度优先

深度优先如下图

蜘蛛先从A页面开始爬行,发现该页面总共有3个超链接,A1、B1、XX,蜘蛛选择先从A1页面爬行下去,它在A1页面发现了一个唯一的超链接A2,便沿着A2向下,以此类推,等爬到最底下,也就是A4页面,A4整个页面上没有任何超链接,再也无法往下爬行了,它便返回到B1开始爬行,这就是深度优先。

广度优先如下

这次这是一个利用广度优先策略的蜘蛛,它先从A页面出发,现在A页面有3个链接,A1、B1、C1,它会先把A1、B1、C1先爬一遍,也就是第一层发现的超链接全部爬行完,然后再进入第二层,也就是A1页面。把A1页面中所有的超链接全部爬行一遍,保证广度上全部链接是都完成爬行了的。

无论是深度优先还是广度优先,蜘蛛都可以通过这两个策略完成对整个互联网页面的爬行。当然,由于蜘蛛的带宽资源和时间有限的问题,蜘蛛不会选择爬完所有页面,它实际收集到的页面知识互联网的一小部分,在条件限制的情况下,蜘蛛通常会深度优先和广度优先混合使用,广度优先保证了尽可能照顾到多的网站,而广度优先保证了尽可能照顾到一部分网站中的内页。

吸引蜘蛛抓取页面

可以看出,在实际情况中,蜘蛛不会爬行、抓取互联网上所有的页面,既然如此,蜘蛛所要做的就是尽量抓取重要页面,而SEO人员要做的,就是吸引蜘蛛的注意,让蜘蛛更多的抓取自己家网站的页面。

对于蜘蛛来说,页面拥有哪些特征会被看作是重要页面呢,主要有以下这几方面因素:

1.网站和页面权重

质量高,资格老的网站被认为权重较高,这种网站上页面的爬行深度也会比较高,所以这种网站网页被收录的机会会更多。

2.页面更新度

如A网页的数据之前在蜘蛛爬行后已经被保存在数据库中了,当蜘蛛第二次爬行A网页时,会将A网页此时的数据和数据库中的数据进行对比,如果蜘蛛发现A网页的内容更新了,就会认为这个网页更新频率多,蜘蛛抓取这个页面的频率也会更加频繁,如果页面和上次储存的数据完全一样,就说明页面是没更新,蜘蛛就会减少自己爬行该页面的频率。

3.高质量的外链

张三是班上公认的人品好为人公正的学霸,李四是班上惹人讨厌最爱撒谎的学生,张三给大家说王五这个人真的很聪明为人也很善良,其他同学都会认为王五肯定是这样,李四给其他同学说王五这个人很好,其他同学基本不会相信李四的鬼话。

同样一句话,从不同人的嘴里说出来,造成的结果、影响都不一样。

链接的引用也是这样,比如在一个蜘蛛认为的高质量页面中,页面在最后引用了一个链接,指向你的页面,那么这个高质量页面的引用,在蜘蛛判断你的网页是否是高质量网页时,也会产生一定的影响,被高质量网页引用的多了(超级多的大佬夸你人好),那么蜘蛛在判断你页面时产生的影响也就更大(同学也觉得你就是人好)。

4.与首页的距离

一般来说自己网站被其他网站引用最多的页面就是首页,所以它的权重相比来说是最高的,比如A页面是A网站的首页,可以得出的结论是,离A网页更进的页面,页面权重也容易更高,比如A页面上的超链接更容易被蜘蛛爬行,更容易获得蜘蛛的抓取,那些没被蜘蛛发现的网页,权重自然就是0。

还有一点比较重要的是,蜘蛛在爬行页面时会进行一定程度的复制检测,也就是当前被爬行的页面的内容,是否和已经保存的数据有重合(当页面内容为转载/不当抄袭行为时就会被蜘蛛检测出来),如果一个权重很低的网站上有大量转载/抄袭行为,蜘蛛很可能不会再继续爬行。

之所以要这么做也是为了用户的体验,如果没有这些去重步骤,当用户想要搜索一些内容时,发现返回的结果全都是一模一样的内容,会大大影响用户的体验,最后导致的结果就是这个搜索引擎绝对不会有人再用了,所以为了用户使用的便利,也是为了自己公司的正常发展。

地址库

互联网上的网页这么多,为了避免重复爬行和抓取网页,搜索引擎会建立地址库,一个是用来记录已经被发现但还没有抓取的页面,一个是已经被抓取过的页面。

待访问地址库(已经发现但没有抓取)中的地址来源于下面几种方式:

1.人工录入的地址

2.蜘蛛抓取页面后,从HTML代码中获取新的链接地址,和这两个地址库中的数据进行对比,如果没有,就把地址存入待访问地址库。

3.站长(网站负责人)提交上去的想让搜索引擎抓取的页面。(一般这种效果不大)

蜘蛛按照重要性从待访问地址库中提取URL,访问并抓取页面,然后把这个URL地址从待访问地址库中删除,放进已访问地址库中。

文件存储

蜘蛛会将抓取的数据存入原始页面数据库。

存入的数据和服务器返回给蜘蛛的HTML内容是一样的,每个页面存在数据库里时都有自己的一个独一无二的文件编号。

预处理

我们去商场买菜时,会看到蔬菜保险柜里的这些蔬菜被摆放的整整齐齐,这里举的例子是那些用保鲜膜包好有经过包装的蔬菜。

最后呈现在顾客面前的就是上面这张图那样,包装完好,按照不同的分类摆放有序,顾客一眼就能很清楚的看到每个区域分别是什么蔬菜。

在最终完成这个结果之前,整个流程大概也是三个步骤:

1.选出可以售卖的蔬菜

从一堆蔬菜中,选出可以拿去售卖的蔬菜。

2.预处理

此时你面前摆放的就是全部可以拿去售卖的蔬菜了,但是如果,今天就要把这些蔬菜放到蔬菜保险柜中的话,你今天才开始对这些蔬菜进行整理会浪费大量的时间(给蔬菜进行包装等),说不定顾客来了蔬菜还没整理好。所以你的解决方法是,提前将这些可以拿去售卖的蔬菜提前包装好,存放在仓库里,等保险柜中的蔬菜缺少了需要补货时,花个几分钟时间跑去仓库把蔬菜拿出来再摆放再货架上就行了。(我猜的,具体商场里的流程是怎么样的我也不知道,为了方便后续的理解用生活上的例子进行说明效果会更好)

3.摆放上保险柜

也就是上面最后一段内容那样,当需要补货时,从仓库里拿出包装好的蔬菜,按照蔬菜的类别摆放到合适的位置就可以了,这个就是最后的排序步骤。

回到搜索引擎的工作流程中,这个预处理的步骤就和上面商场预处理步骤的作用一样。

当蜘蛛完成数据收集后,就会进入到这个步骤。

蜘蛛所完成的工作,就是在收集了数据后将数据(HTML)存入原始页面数据库。

而这些数据,不是用户在搜索后,直接用来进行排序并展示在搜索结果页的数据。

原始页面数据库中的页面数量都是在数万亿级别以上,如果在用户搜索后对原始页面数据库中的数据进行实时排序,让排名程序(每个步骤所使用的程序不一样,收集数据的程序叫蜘蛛,排名时所用的程序是排名程序)分析每个页面数据与用户想搜索的内容的相关性,计算量太大,会浪费太多时间,不可能在一两秒内返回排名结果。

因此,我们需要先将原始页面数据库中的数据进行预处理,为最后的排名做好准备。

提取文字

我们存入原始页面数据库中的,是HTML代码,而HTML代码中,不仅有用户在页面上直接可以看到的文字内容,还有其他例如js,AJAX等这类搜索引擎无法用于排名的内容。

首先要做的,就是从HTML文件中去除这些无法解析的内容,提取出可以进行排名处理步骤的文字内容

比如下面这段代码

软件工程师需要了解的搜索引擎知识 MathJax.Hub.Config({ showProcessingMessages: false, messageStyle: "none", tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [ ["$$","$$"] ], skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code', 'a'] } }); MathJax.Hub.Register.MessageHook("End Process", function (message) { var eve = new Event('mathjaxfini') window.dispatchEvent(eve) }) hi


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有