宽爬行

Scrapy 默认值针对爬行特定站点进行了优化。这些站点通常由一个残缺的蜘蛛来处理,尽管这不是必需的或必需的(例如,有一些普通的蜘蛛来处理任何向它们抛出的给定站点)。

除了这种“集中的爬行”之外,还有另一种常见的爬行类型,它覆盖了大量(可能是无限的)域,并且只受时间或其他任意约束的限制,而不是在域被爬行到完成或没有更多的请求执行时停止。这些被称为“宽爬虫”,是搜索引擎使用的典型爬虫。

这些是一些常见的特性,通常在广泛的爬行中发现:

  • 它们对许多域(通常是无边界的)而不是一组特定的站点进行爬网

  • 它们不一定要对域进行爬网直至完成,因为这样做是不切实际的(或不可能的),而是按已爬网的时间或页数限制爬网。

  • 它们在逻辑上更简单(而不是具有许多提取规则的非常复杂的spider),因为数据通常在单独的阶段进行后处理。

  • 它们同时对多个域进行爬网,这使得它们可以通过不受任何特定站点约束的限制来实现更快的爬网速度(每个站点的爬行速度都很慢,以尊重礼貌,但许多站点是并行进行的)

如上所述,Scrapy的默认设置是针对重点爬行而不是广泛爬行而优化的。然而,由于其异步体系结构,Scrapy非常适合执行快速的广泛爬行。本页总结了在使用Scrapy进行宽范围爬行时需要记住的一些事情,以及为实现高效的宽范围爬行而调整Scrapy设置的具体建议。

使用权利 SCHEDULER_PRIORITY_QUEUE

Scrapy的默认调度程序优先级队列为 'scrapy.pqueues.ScrapyPriorityQueue' . 它在单域爬行时工作得最好。它不能很好地并行爬行许多不同的域

要应用建议的优先级队列,请使用:

SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'

增加并发性

Concurrency是并行处理的请求数。存在全局限制 (CONCURRENT_REQUESTS )以及每个域都可以设置的附加限制 (CONCURRENT_REQUESTS_PER_DOMAIN )或每IP (CONCURRENT_REQUESTS_PER_IP

注解

调度程序优先级队列 recommended for broad crawls 不支持 CONCURRENT_REQUESTS_PER_IP .

scrapy中的默认全局并发限制不适用于并行地对许多不同的域进行爬网,因此您需要增加它。增加多少将取决于您的爬虫有多少CPU和内存可用。

一个好的起点是 100 ::

CONCURRENT_REQUESTS = 100

但最好的方法是做一些试验,并确定零碎的进程在什么样的并发上受到CPU限制。为了获得最佳性能,您应该选择CPU使用率为80-90%的并发性。

增加并发性也会增加内存使用量。如果担心内存使用问题,您可能需要相应地降低全局并发限制。

增加Twisted IO线程池的最大大小

目前scrapy使用线程池以阻塞方式进行DNS解析。如果并发性级别更高,则爬行速度可能会变慢,甚至无法达到DNS解析程序超时。增加处理DNS查询的线程数的可能解决方案。将更快地处理DNS队列,从而加快建立连接和整体爬行。

要增加最大线程池大小,请使用:

REACTOR_THREADPOOL_MAXSIZE = 20

设置您自己的DNS

如果您有多个爬行进程和单个中心DNS,它会像DOS攻击DNS服务器一样,导致整个网络速度减慢,甚至阻塞您的机器。要避免这种情况,请使用本地缓存设置您自己的DNS服务器,并向某些大型DNS(如OpenDNS或Verizon)上游设置。

降低日志级别

当进行广泛的爬行时,你通常只对你得到的爬行率和发现的任何错误感兴趣。当使用 INFO 日志级别。为了保存CPU(和日志存储要求),不应使用 DEBUG 在生产中进行大型宽爬行时的原木水平。使用 DEBUG 不过,在开发(广泛的)爬虫时,级别可能很好。

要设置日志级别,请使用:

LOG_LEVEL = 'INFO'

禁用Cookie

禁用cookies,除非 真正地 需要。在进行广泛的爬行时,通常不需要cookie(搜索引擎爬行器忽略它们),它们通过节省一些CPU周期和减少零碎爬行器的内存占用来提高性能。

要禁用cookie,请使用:

COOKIES_ENABLED = False

禁用重试

重试失败的HTTP请求会大大降低爬行速度,特别是当站点原因响应速度非常慢(或失败)时,会导致超时错误,该错误会被多次不必要地重试,从而阻止爬行器容量被重新用于其他域。

要禁用重试,请使用:

RETRY_ENABLED = False

减少下载超时

除非您是从一个非常慢的连接爬行(这不应该是广泛爬行的情况),否则请减少下载超时,以便快速丢弃卡住的请求并释放处理下一个请求的容量。

要减少下载超时,请使用:

DOWNLOAD_TIMEOUT = 15

禁用重定向

考虑禁用重定向,除非您有兴趣跟踪它们。在进行广泛的爬行时,保存重定向并在以后的爬行中重新访问站点时解决重定向是很常见的。这也有助于保持每个爬网批处理的请求数不变,否则重定向循环可能会导致爬网程序在任何特定域上投入过多的资源。

要禁用重定向,请使用:

REDIRECT_ENABLED = False

启用“Ajax可爬行页”的爬行

一些页面(根据2013年的经验数据,高达1%)宣称自己是 ajax crawlable . 这意味着它们提供了内容的纯HTML版本,通常只能通过Ajax提供。页面可以用两种方式表示:

  1. 通过使用 #! 在url中-这是默认方式;

  2. 通过使用一个特殊的元标签-这种方式在“主”、“索引”网站页面上使用。

Scrapy 处理(1)自动;处理(2)启用 AjaxCrawlMiddleware ::

AJAXCRAWL_ENABLED = True

在进行广泛的爬行时,通常会对许多“索引”网页进行爬行;AjaxCrawl中间件有助于正确地对它们进行爬行。它在默认情况下是关闭的,因为它有一些性能开销,启用它进行聚焦爬行没有什么意义。

按BFO顺序爬行

Scrapy crawls in DFO order by default .

然而,在广泛的爬行中,页面爬行往往比页面处理更快。因此,未处理的早期请求将保留在内存中,直到达到最终深度,这可以显著增加内存使用量。

Crawl in BFO order 而是保存内存。

注意内存泄漏

如果您的广泛爬行显示内存使用率很高,除了 crawling in BFO orderlowering concurrency 你应该 debug your memory leaks .

安装一个特殊的扭曲反应器

如果爬网超出了系统的能力,您可能需要尝试通过 TWISTED_REACTOR 设置。