广泛抓取

Scratches默认值针对爬网特定站点进行了优化。这些站点通常由单个Scrapy蜘蛛处理,尽管这不是必需或必需的(例如,有通用的蜘蛛处理任何给定的站点)。

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

这些是常见的广泛爬网常见的属性:

他们抓取许多域(通常是无界的),而不是特定的一组网站

他们不一定要抓取域名完成,因为这样做是不切实际的(或不可能的),而是通过抓取的时间或数量来限制爬网

它们在逻辑上更简单(与具有许多提取规则的非常复杂的蜘蛛相反),因为数据经常在单独的阶段中进行后处理

他们同时抓取许多域,这使得它们不受任何特定站点限制(每个站点缓慢爬行以尊重礼貌,但许多站点并行爬行)可以实现更快的爬网速度。

如上所述,Scrapy默认设置针对集中爬网进行了优化,而不是广泛的爬网。然而,由于其异步架构,Scrapy非常适合执行快速的广泛爬网。本页面总结了使用Scrapy进行大量爬网时需要牢记的一些事项,以及为了实现高效的广泛爬网而进行的Scrapy设置的具体建议。

增加并发性

并发性是并行处理的请求数。存在全局限制和每个域限制。

Scrapy中的默认全局并发限制不适合并行抓取许多不同的域,因此您需要增加它。增加多少将取决于您的爬网程序可用的CPU数量。一个好的起点是100,但最好的方法是通过做一些试验,并确定什么并发您的Scrapy进程获得CPU限制。为了获得最佳性能,您应该选择CPU占用率在80-90%的并发性。

增加全局并发使用:

CONCURRENT_REQUESTS = 100

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

目前Scrapy使用线程池以阻塞方式进行DNS解析。随着更高的并发级别,爬网速度可能会很慢,甚至会遇到DNS解析器超时。可能的解决方案来增加处理DNS查询的线程数。 DNS队列的处理速度可以更快地加快建立连接和爬网的速度。

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

REACTOR_THREADPOOL_MAXSIZE = 20

设置自己的DNS

如果您有多个爬网进程和单个中央DNS,则可能会对DNS服务器造成DoS攻击,导致整个网络的运行速度降低甚至阻止您的计算机。为避免此设置您自己的DNS服务器与本地缓存和上游到一些大的DNS,如OpenDNS或Verizon。

降低日志级别

当进行广泛的爬网时,您通常只对您获得的爬网速度感兴趣,并发现任何错误。使用INFO日志级别时,Scrapy会报告这些统计信息。为了节省CPU(和日志存储要求),在生产中执行大量爬网时,不应使用DEBUG日志级别。在开发(广泛)爬行器时使用DEBUG级别可能会很好。

要设置日志级别使用:

LOG_LEVEL ='INFO'

禁用Cookie

禁止cookies,除非你真的需要。通常在进行广泛抓取(搜索引擎抓取工具忽略它们)时不需要Cookie,并且通过节省一些CPU周期并减少Scrapy抓取工具的内存占用来提高性能。

要禁用Cookie,请使用:

COOKIES_ENABLED = False

禁用重试

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

禁用重试使用:

RETRY_ENABLED = False

减少下载超时

除非您从非常缓慢的连接中爬行(广泛抓取不应该这样),否则会减少下载超时时间,以便卡住的请求被快速丢弃,并释放处理下一个请求的能力。

为了减少下载超时时间:

DOWNLOAD_TIMEOUT = 15

禁用重定向

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

要禁用重定向,请使用:

REDIRECT_ENABLED = False

启用抓取“Ajax Crawlable Pages”

一些页面(高达1%,根据2013年的经验数据)宣称自己可以抓取。这意味着它们提供通常只能通过AJAX使用的纯HTML版本的内容。页面可以通过两种方式指出:

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

通过使用特殊的元标记 - 这种方式用于“主”,“索引”网页。

自动洗手柄(1)处理(2)启用AjaxCrawlMiddleware:

AJAXCRAWL_ENABLED = True

当进行广泛的爬网时,通常会抓取很多“索引”网页; AjaxCrawlMiddleware有助于正确抓取它们。默认情况下它关闭,因为它具有一些性能开销,并且使其能够进行聚焦爬网并不太有意义。

results matching ""

    No results matching ""