一, 并发
并发性是并行处理的请求数。 存在全局限制和每个域限制。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服务器,并将其上传到OpenDNS或Verizon等大型DNS。
四, 降低日志等级
在进行广泛的抓取时,您通常只对抓取的抓取率和发现的任何错误感兴趣。 Scrapy在使用INFO日志级别时报告这些统计信息。 为了节省CPU(以及日志存储需求),在预生成大量广泛爬网时,不应使用DEBUG日志级别。 在开发(广泛)爬虫程序时使用DEBUG级别可能没问题。
设置日志级别使用:
LOG_LEVEL = 'INFO'
五, 禁用cookies
除非你真的需要,否则禁用cookies。 进行广泛抓取时通常不需要Cookie(搜索引擎抓取工具忽略它们),它们通过节省一些CPU周期并减少Scrapy抓取工具的内存占用量来提高性能。
要禁用Cookie,请使用:
COOKIES_ENABLED = False
六, 禁用重试
重试失败的HTTP请求可能会显着减慢抓取速度,尤其是当站点导致响应非常缓慢(或失败)时,这会导致超时错误,导致多次重试,从而不必要地阻止爬网程序的容量重用于其他域。
要禁用重试,请使用:
RETRY_ENABLED = False
七,减少下载超时
除非您从非常慢的连接抓取(对于大量抓取,这不应该是这种情况),请减少下载超时,以便快速丢弃停滞的请求并释放处理下一个请求的容量。
要减少下载超时使用:
DOWNLOAD_TIMEOUT = 15
八, 禁止重定向
考虑禁用重定向,除非您有兴趣follow它们。 在进行广泛抓取时,通常会保存重定向并在之后的抓取中重新访问网站以解决它们。 这也有助于保持每个爬取批次的请求数量不变,否则重定向循环可能会导致爬虫对某个特定域上的资源投入过多。
要禁用重定向,请使用:
REDIRECT_ENABLED = False
九, 启用“Ajax可抓取页面”的抓取
- by using
#!
in URL - this is the default way; - by using a special meta tag - this way is used on “main”, “index” website pages.
Scrapy handles (1) automatically; to handle (2) enable AjaxCrawlMiddleware:
AJAXCRAWL_ENABLED = True