这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。由于我们小组决定进行做搜索引擎,现将搜索引擎中网页爬取可使用的算法以及基本流程进行总结。
- 搜索算法的选取(深搜、宽搜、权重优先)
- 通常大型网站都是优质的内容,网页质量一般较高,以网站为单位来衡量网页重要性,是有一定依据的。对于待抓取URL队列中的网页,可以根据等待下载的页面多少来判断下载优先级。
- 爬取完一个网页后对其进行预处理,提取出和内容相关的可见文字和特殊文字(Meta标签、锚文字等等)。得到我们想要的数据(包含用户要搜索的关键词等)
搜索算法的选取
一、广度优先搜索:
基本思想:将新下载网页包含的链接直接追加到待抓取URL队列末尾。
假设队头的网页是1号网页,从1号网页中抽取出3个链接指向2号、3号和4号网页,于是按照编号顺序依次放入待抓取URL队列,图中网页的编号就是在待抓取URL队列中的顺序编号,之后爬虫以此顺序进行下载。
优点:
- 重要的网页往往离种子站点距离较近;万维网的深度没有那么深,但却出乎意料地宽(网页深度只有几十层,即任意两个网页之间点击几十次后便可以访问到);
- 有利于多爬虫合作抓取
缺点:容易导致爬虫陷入死循环,不该抓取的反复抓取;应该抓取的没有机会抓取;
解决办法:
- 深度后停止抓取。当最大深度上停止抓取时,那些深度过大的未抓取网页,总是期望可以从其他种子站点更加经济地到达。限制抓取深度会破坏死循环的条件,即使出现循环也会在有限次后停止。
- 也可以采用广度优先,兼顾深度的遍历策略,可以有效保证抓取过程中的封闭性,即在抓取过程(遍历路径)中总是抓取相同域名下的网页,而很少出现其他域名下的网页。
二、非完全PageRank策略
基本思路:Partial PageRank 算法借鉴了 PageRank 算法的思想,按照一定的网页分析算法,预测候选URL与目标网页的相似度,或与主题的相关性,并选取评价最好的一个或几个URL进行抓取,即对于已经下载的网页,连同待抓取URL队列中的URL,形成网页集合,计算每个页面的PageRank值,计算完之后,将待抓取URL队列中的URL按照PageRank值的大小排列,并按照该顺序抓取页面。
三、OCIP策略
即在线页面重要性计算(Online Page Importance Computation)。
基本思路:在算法开始之前,每个互联网页面都给予相同的“现金”,每当下载了某个页面P后,P就将自己拥有的现金平均分配给页面中包含的链接页面,把自己的“现金”清空。而对于待爬取URL队列中的网页,则根据其手头拥有的“现金”金额多少排序,优先下载“现金”最多的网页,OPIC从大的框架上与PageRank思路基本一致。
与PageRank的区别:PageRank每次需要迭代计算,而OPIC策略不需要迭代过程。所以计算速度远远快与PageRank,适合实时计算使用。同时,PageRank在计算时,存在向无链接关系网页的远程跳转过程,而OPIC没有这一计算因子。
OPIC是较好的重要性衡量策略,效果略优于宽度优化遍历策略。
四、大站优先策略
基本思路:以网站为单位来选题网页重要性,对于待爬取URL队列中的网页,根据所属网站归类,如果哪个网站等待下载的页面最多,则优先下载这些链接,其本质思想倾向于优先下载大型网站。因为大型网站往往包含更多的页面。鉴于大型网站往往是著名企业的内容,其网页质量一般较高,所以这个思路虽然简单,但是有一定依据。实验表明这个算法效果也要略优先于宽度优先遍历策略。
流程管道
具体我们可以从一系列的种子节点开始,把这些网页中的"子节点"(也就是超链接)提取出来,放入队列中依次进行抓取。被处理过的链接需要放 入一张表(通常称为Visited表)中。每次新处理一个链接之前,需要查看这个链接是否已经存在于Visited表中。如果存在,证明链接已经处理过, 跳过,不做处理,否则进行下一步处理。
初始的URL地址是爬虫系统中提供的种子URL(一般在系统的配置文件中指定)。当解析这些种子URL所表示的网页时,会产生新的URL(比如从页面中的<a href= "www.qq.com "中提取出new.qq.com/omn/2022051… 这个链接)。然后进行以下工作:
把解析出的链接和Visited表中的链接进行比较,若Visited表中不存在此链接,表示其未被访问过;之后把链接放入TODO表中;处理完毕后,再次从TODO表中取得一条链接,直接放入Visited表中;针对这个链接所表示的网页,继续上述过程。如此循环往复。
ps. Visited表可以用布隆过滤器实现。布隆过滤器于1970年由布隆提出,它是一个空间效率高的概率型数据结构,可以用来告诉你:一个元素一定不存在或者可能存在。 优点:空间效率和查询时间都远远超过一般的算法(使用哈希表将占用大量的内存空间)。 缺点:有一定的误判率、删除困难。 它实质上是一个很长的二进制向量和一系列随机映射函数(Hash函数)组成,常用于网页黑名单系统、垃圾邮件过滤系统、爬虫的网址判重系统、解决缓存穿透问题。
之后我们对爬取出来的网页进行预处理,我们拿到的是网页的 html 代码,把起始终止标签及其中的内容全部去掉即可。做完以上步骤后,我们也要把其它的 html 标签去掉(标签里的内容保留),目的:
- 获取内容里面包含用户要搜索的关键词)
- 建立URL设置对应编号——建立(ID, URL)的存储文件,并根据URL所对应的内容和ID,建立(ID, 网页大小, 网页内容)的存储文件