Skip to main content

广泛爬行

Scrapy默认值优化用于抓取特定网站。这些网站通常由单个Scrapy蜘蛛处理,虽然这不是必需的或必需的(例如,有处理任何给定网站的通用蜘蛛)。

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

这些是在广泛爬行中常见的一些常见属性:

  • 他们会抓取许多域(通常是无限制的),而不是特定的网站集

  • 他们不一定会抓取域完成,因为这样做是不切实际的(或不可能的),而是通过抓取的时间或页数限制抓取

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

  • 他们同时抓取许多域,这允许他们通过不受任何特定网站限制(每个网站缓慢爬取以缓和礼貌,但许多网站并行抓取)实现更快的抓取速度,

如上所述,Scrapy默认设置针对聚焦爬网进行了优化,而不是广泛爬网。然而,由于其异步架构,Scrapy非常适合执行快速宽松爬行。本页总结了使用Scrapy进行广泛爬行时需要记住的一些事项,以及Scrapy设置的具体建议,以便进行有效的广泛爬行。

提高并发性

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

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

增加全局并发使用:

CONCURRENT_REQUESTS = 100

增加扭曲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

禁用Cookie,除非您需要 really。在进行广泛爬网(搜索引擎抓取工具忽略它们)时,通常不需要Cookie,它们通过节省一些CPU周期和减少Scrapy爬网程序的内存占用量来提高性能。

禁用Cookie使用:

COOKIES_ENABLED = False

禁用重试

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

禁用重试使用:

RETRY_ENABLED = False

减少下载超时

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

要减少下载超时使用:

DOWNLOAD_TIMEOUT = 15

禁用重定向

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

要禁用重定向,请使用:

REDIRECT_ENABLED = False

启用“Ajax可抓取网页”的抓取

一些页面(高达1%,基于2013年的经验数据)声明自己为 ajax crawlable。这意味着它们提供通常仅通过AJAX可用的纯HTML内容。页面可以通过两种方式指示它:

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

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

刮手(1)自动;以处理(2)启用 AjaxCrawlMiddleware:

AJAXCRAWL_ENABLED = True

当进行广泛爬行时,通常抓取大量“索引”网页; AjaxCrawlMiddleware有助于正确抓取它们。默认情况下会关闭它,因为它有一些性能开销,并启用它进行焦点爬网没有什么意义。