爬虫也有些地方称为蜘蛛,本质上是一个自动访问互联网的程序。我们都知道互联网当中的网页千千万万,想要靠人工去一个一个搜集是不现实的。所以爬虫就是代替人工去浏览互联网的程序,每当发现一个新的网站,就会把网站的内容抓取下来,存储起来。
这里有一个问题,爬虫怎么知道互联网当中网站的地址呢?
主要靠的是网站之间的联系,比如A网站当中的内容有指向B网站的链接,那么在爬取完A网站之后,爬虫会顺着当中的内容,去爬取B网站。如果B网站又有指向很多其他网站,那么爬虫会顺着依次访问。存储在内容当中的链接就像是蛛丝一样,将各个网页链接起来,爬虫就像是蜘蛛,在里面移动。
也就是说在爬虫程序的眼里,所有的网页都只是文本,连图片或者是视频在HTML里也只是以标签或者是链接的形式存在。我们也都看得出来,这一段文本杂乱无章,人眼很难看得出来当中都有什么信息。这样的文本当然是不能直接使用的,还需要进行文本处理。
文本处理的第一个步骤比较简单,Python当中有非常成熟的HTML分析的工具,第二个步骤则要复杂得多。当我们拿到了网页的文本之后,我们下一步要做的是提取网页的关键词,并处理成索引进行存储。
有了文本分词的结果之后,只会保留当中的一些关键词进行存储。存储的时候,除了会存储网页-关键词这个正向信息之外,其实还会存储关键词-网页的反向信息。在存储中心,网页是按照关键词聚集的。每个关键词会对应一个网站的列表,所有含有这个关键词的网站都会被存在这个列表当中。这样当用户搜索关键词的时候,就可以根据关键词直接找到对应的网站了。
如图,在搜索引擎当中,北京和大学是两个关键词,分别对应一系列包含这个关键词的网站。假设从前系统当中没有北京大学的官网,最近刚刚被爬虫抓到。由于北大的官网中有北京和大学两个关键词,所以在进行存储的时候,系统会将北京大学这个网址添加进北京和大学两个关键词对应的列表当中。这样,无论我们搜索北京还是大学,都可以召回北京大学这个网站。
当然无论我们搜索北京还是大学,召回的内容都非常多,并不一定能够返回北京大学。当我们搜索北京大学的时候,搜索引擎会同时召回北京和大学这两个关键词的网站,之后会做交集。选出既含有北京又含有大学的网站,进行返回,这样就一定可以返回北京大学的官网了。
在我们了解了存储中心的原理之后,整个流程其实已经很清楚了。简单来说只做了两件事情,一件是召回,另一件是排序。
召回顾名思义,就是通过用户输入的关键词去存储中心找出这些关键词对应搜索结果。再对这些结果做交集,找出匹配度最高的内容。
虽然每次我们百度的时候,它都会告诉我们搜索到了数以百万计甚至更多的结果,但是实际上真正通过粗排召回来的,可能只有一两千条。既然有粗排,那么自然也有精排。其实也很好理解,经过了粗排,数据从数千万减少到了一两千。接下来要做的就是对这一两千条数据进行进一步排序。排序的主要依据往往不止一个,首要的当然是匹配度,如果返回的网站和用户的诉求不匹配,显然会损伤用户体验,甚至导致用户流失。所以无论什么搜索引擎,质量永远是第一位。之后的依据各个引擎均有所不同,有些网站可能更加看重收益,所以会把收钱多的网站摆在前面,有些网站则更看重权威,会把热度比较高的,或者是比较官方的网站置顶。经过一系列的调整和过滤之后,结果才会真正返回给用户。
到这里,整个搜索引擎的架构就介绍完了。就单从架构来看,这个系统并不算复杂。在电商网站当中,比这个复杂的系统比比皆是。但是由于搜索引擎是互联网的入口,承载的流量巨大,并且对于性能的要求极高,使得整个系统当中存在大量的优化,实际上的系统要复杂和困难得多。
我们抛开难度不谈,仔细分析这个架构,其实会发现一点有趣的地方。比如,我有时候在想,为什么中文的搜索引擎最早做得最好的是百度呢?
后来我了解到李彦宏最早是北大图书馆学出身,再一看这个搜索引擎的架构和索引的结构,不就和图书管理一模一样吗?
在搜索引擎出现之前,图书馆中的书籍也是根据类别、关键字以及作者进行归类存放的。这样在检索的时候,才可以快速地找到相应的书籍。这个思想计算机出现之前就已经非常成熟了,如果我们更换一下概念,把互联网当中的网页当做是书籍,把网页的title当做是书籍的标题,正文当中的关键字当做是书籍的关键字,那么搜索网页和搜索书籍的技术在思想上其实是相通的。那么当年图书馆学出身的李彦宏在学了计算机之后,想到在互联网世界当中应用图书检索的技术,也就水到渠成了。
看来一个人能有多大的成就,除了个人奋斗之外,果然也要看历史的进程。