错误博客( cuowu.com )发布于 2019-06-10 18:16:00

信息检索网络爬虫

信息检索网络爬虫教程。

图3-2从一个简单的网络爬虫的角度,给出了网络信息采集的图示。网络爬虫有两个任务:下载页面和发现URL。

爬取网络

网络爬虫的工作从一个种子(seed)集合开始,种子集合是作为参数传递给网络爬虫的一个URL的集合。这些种子被添加到URL请求队列中。网络爬虫从请求队列中取出URL地址,开始抓取页面的任务。一旦下载了一个页面,就对该页面进行解析,找到链接标签,其中可能会含有用于抓取的URL地址。如果网络爬虫发现一个以前没有遇到过的URL地址,则将该地址添加到请求队列或frontier中去。frontier可以是一个标准的队列,或者是经过排序的队列,以便使重要的页面置于队列的前面。这个过程重复进行,直到网络爬虫用尽存储页面的磁盘空间或者请求队列为空。

如果网络爬虫只使用一个单一的线程,效率将会很低。可以看到,网络爬虫大量的时间都消耗在等待响应上:等待DNS服务器的响应,然后等待与服务器的连接被确认,接下来还要等待从服务器发送的网页数据。在等待的过程中,网络爬虫所使用的机器的CPU是处于空闲状态的,而且这时也没有利用到网络连接。为了提升效率,网络爬虫使用多个线程,一次抓取几百个网页。

一次抓取几百个网页,对于使用网络爬虫的人来说是一件好事,但对于网络服务器的所有者来说却未必是件好事。设想一下,请求队列在实际中是如何工作的。当抓取到一个页面后,比如 www.cuowu.com ,该页面被解析,页面中所有的链接都添加到请求队列中。接下来,网络爬虫会试图一次抓取所有这些链接指向的页面。假如该服务器 www.cuowu.com  的性能并不是很强大,它将花费所有的时间来处理网络爬虫的请求,而不会去处理真实用户的请求。网络爬虫的这种行为会导致网络服务器管理员非常生气。

为了避免这个问题,网络爬虫使用了礼貌策略(politeness policy)。有礼貌的网络爬虫不会在特定的网络服务器上一次抓取多个页面。另外,在同一个网络服务器上的两次请求之间,网络爬虫至少等待几秒钟,有时也可以是几分钟的时间。这样就能够使网络服务器将大多数的时间花费在处理真实用户的请求上。为了支持该策略,请求队列在逻辑上为每个网络服务器划分出一个单独的队列。在任何时间,绝大多数这些单独的队列都会被禁止进行爬取,因为网络爬虫已经在近期从相应的服务器上抓取了页面。对于那些在礼貌策略规定的时间窗口内未被存取的队列,网络爬虫可以自由地读取页面请求。

当使用礼貌策略的时间窗口时,请求队列必须很大,以获得好的性能。假设网络爬虫可以在每秒内抓取100个页面,它的礼貌策略规定每30秒内从特定的网络服务器上抓取的页面数目不能多于1个。为了得到较高的吞吐量,该网络爬虫需要在请求队列中有至少来自3000个不同网络服务器的URL。有些URL会来自同一台服务器,网络爬虫达到吞吐量峰值之前,请求队列中需要含有几万个URL。

有些网络服务器管理员反对对他们的数据进行任何拷贝,即使对该站点的信息采集速度很慢,也会惹怒他们。这时候,管理员可以在他们的网络服务器上保存一个称为robots.txt的文件。图3-3给出了robots.txt文件的样例。该文件由 User-agent 开始,由多个命令块组成。User-agent这一行标识一个网络爬虫或者一组网络爬虫受以下的规则约束。这一行的后面是Allow和Disallow规则,规定哪些资源允许该爬虫进行存取。图中,第一个命令块指出除了以 /other/public/开始的目录外,所有的网络爬虫都不允许存取。以 /private/、/confidential/ 或 /other/ 开始的目录。第二个命令块指出,名为 FavoredCrawler 的网络爬虫拥有自己的规则集:允许它复制服务器上所有的内容。

robots.txt文件样例

样例中的最后一个命令块是一个可选的Sitemap:指令,将在本节的后面进行讨论。

图3-4给出了一个信息采集线程的实现,使用了我们已了解的网络爬虫构件。假设frontier已经用一些种子URL进行了初始化。信息采集线程首先从frontier中获取一个网站。然后,网络爬虫从该网站队列中识别出下一个URL地址。在permitsCrawl中,网络爬虫根据该网站的robots.txt文件检查这个URL是否允许进行信息采集。如果允许,网络爬虫使用 retriveURL 来抓取文档的内容。这是该循环中最耗时的部分,爬虫线程在此处会阻塞几秒钟。一旦将文本抓取回来,storeDocument就将文档中的文本存储到文档数据库中(在本章后面进行讨论)。对文本的内容进行分析,会发现其他的URL,将新发现的URL添加到frontier中,由frontier负责将它们添加到相应的网站队列中去。所有这些工作做完之后,website对象被返回给frontier,在合理的时间内不将该站点分配给其他的线程,以此来实施它的礼貌策略。在实际的网络爬虫中,计时器在文档被抓取回来之后会立即启动,因为文本分析和存储文档会花费很长的时间。

信息采集线程的实现


2020年错误博客亲测项目系列

错误教程( cuowu.com )专注网推培训、SEO培训和网赚培训,微信/电话:13722793092

关注微信公众号:第一时间获得错误博客最新教程,让我们一起成长!

公众号二维码