Broad Crawls

Scrapy defaults are optimized for crawling specific sites. These sites are often handled by a single Scrapy spider, although this is not necessary or required (for example, there are generic spiders that handle any given site thrown at them).

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

这些是广泛的爬网中经常发现的一些常见属性:

  • 他们抓取了许多域(通常是无限制的),而不是一组特定的站点
  • 它们并不一定要完全爬网域,因为这样做是不切实际的(或不可能的),而是通过时间或爬网的页面数来限制爬网
  • 它们的逻辑更简单(与具有许多提取规则的非常复杂的蜘蛛相反),因为数据通常在单独的阶段进行后处理
  • 它们会同时爬网许多域,这使它们不受任何特定站点限制的限制而实现了更快的爬网速度(每个站点缓慢爬网以尊重礼貌,但许多站点是并行爬网的)

如上所述,Scrapy默认设置针对焦点爬网(而不是广泛爬网)进行了优化. 但是,由于其异步体系结构,Scrapy非常适合执行快速的广泛爬网. 本页总结了使用Scrapy进行广泛爬网时需要牢记的一些事项,以及为实现有效的广泛爬网而对Scrapy设置进行调整的具体建议.

Use the right SCHEDULER_PRIORITY_QUEUE

Scrapy的默认调度程序优先级队列为'scrapy.pqueues.ScrapyPriorityQueue' . 它在单域爬网期间效果最佳. 它不适用于并行爬网许多不同的域

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

SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'

Increase concurrency

并发是并行处理的请求数. 有一个全局限制( CONCURRENT_REQUESTS ),并且可以为每个域( CONCURRENT_REQUESTS_PER_DOMAIN )或每个IP( CONCURRENT_REQUESTS_PER_IP )设置一个附加限制.

Note

建议用于广泛爬网的调度程序优先级队列不支持CONCURRENT_REQUESTS_PER_IP .

Scrapy中的默认全局并发限制不适用于并行爬网许多不同的域,因此您需要增加它. 增加多少将取决于您的搜寻器可用的CPU和内存量.

一个好的起点是100

CONCURRENT_REQUESTS = 100

但是,找出答案的最佳方法是进行一些试验,并确定Scrapy进程采用哪种并发限制了CPU. 为了获得最佳性能,您应该选择CPU使用率为80-90%的并发.

并发性的增加也会增加内存的使用. 如果需要考虑内存使用情况,则可能需要相应降低全局并发限制.

Increase Twisted IO thread pool maximum size

当前,Scrapy通过使用线程池以阻止方式进行DNS解析. 使用更高的并发级别,爬网可能会很慢,甚至会导致DNS解析器超时失败. 增加处理DNS查询的线程数的可能解决方案. DNS队列将得到更快处理,从而加快连接的建立和整体爬网的速度.

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

REACTOR_THREADPOOL_MAXSIZE = 20

Setup your own DNS

如果您有多个爬网过程和单个中央DNS,则它就像DNS服务器上的DoS攻击一样,导致整个网络变慢甚至阻塞您的计算机. 为了避免这种情况,请设置您自己的DNS服务器,该服务器具有本地缓存​​并在某些大型DNS(例如OpenDNS或Verizon)的上游.

Reduce log level

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

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

LOG_LEVEL = 'INFO'

Disable cookies

除非确实需要,否则禁用cookie. 在进行广泛爬网时(搜索引擎爬网程序将忽略它们),通常不需要Cookie,它们通过节省一些CPU周期并减少Scrapy爬网程序的内存占用来提高性能.

要禁用Cookie,请使用:

COOKIES_ENABLED = False

Disable retries

重试失败的HTTP请求可能会极大地降低爬网速度,特别是在网站原因响应速度非常慢(或失败)的情况下,从而导致超时错误,该错误会被重试很多次,从而不必要地阻止了爬网程序容量重新用于其他域.

要禁用重试,请使用:

RETRY_ENABLED = False

Reduce download timeout

除非您从非常慢的连接中进行爬网(对于广泛的爬网而言不应该这样),否则请减少下载超时,以使卡住的请求迅速被丢弃,并释放处理下一个请求的能力.

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

DOWNLOAD_TIMEOUT = 15

Disable redirects

除非您有兴趣关注重定向,否则请考虑禁用重定向. 进行广泛爬网时,通常会保存重定向并在以后的爬网中重新访问网站时解决重定向. 这也有助于使每个爬网批处理的请求数保持恒定,否则重定向循环可能会导致爬网程序在任何特定域上分配过多的资源.

要禁用重定向,请使用:

REDIRECT_ENABLED = False

Enable crawling of “Ajax Crawlable Pages”

某些页面(根据2013年的经验数据,高达1%)宣称自己为ajax可抓取 . 这意味着它们提供的纯HTML版本的内容通常只能通过AJAX获得. 页面可以通过两种方式进行指示:

  1. 通过使用#! 在URL中-这是默认方式;
  2. 通过使用特殊的元标记-在"主要","索引"网站页面上使用这种方式.

cra草处理(1)自动; 处理(2)启用AjaxCrawlMiddleware

AJAXCRAWL_ENABLED = True

进行广泛爬网时,通常会爬网许多"索引"网页; AjaxCrawlMiddleware帮助正确地对其进行爬网. 由于具有一些性能开销,因此默认情况下将其关闭,并且对其进行集中爬网没有多大意义.

Crawl in BFO order

Scrapy crawls in DFO order by default.

但是,在广泛的爬网中,页面爬网往往比页面处理要快. 结果,未处理的早期请求会保留在内存中,直到达到最终深度为止,这可能会大大增加内存使用率.

按照BFO顺序爬行,以节省内存.

Be mindful of memory leaks

如果您的广泛爬网显示较高的内存使用率,则除了按BFO顺序进行爬网降低并发性之外,还应该调试内存泄漏 .