Scrapy 的最佳性能

Best performance for Scrapy

我在我的专用服务器上使用 Scrapy,我想知道如何让我的爬虫达到最佳性能。

这是我的自定义设置:

custom_settings = {
    'RETRY_ENABLED': True,
    'DEPTH_LIMIT' : 0,
    'DEPTH_PRIORITY' : 1,
    'LOG_ENABLED' : False,
    'CONCURRENT_REQUESTS_PER_DOMAIN' : 32,
    'CONCURRENT_REQUESTS' : 64,
}

我实际上爬了大约 200 link/minutes。

服务器:

32 Go RAM : DDR4 ECC 2133 MHz
CPU : 4c/8t : 2,2 / 2,6 GHz

1) 使用 Scrapyd 运行 蜘蛛

2) 在 scrapy 中用于过滤访问过 urls 的默认重复过滤器使用 url 指纹列表——基本上是 sha1 哈希,长度为 40 个字符,即 77 字节长在 Python 2.7。假设您必须抓取一个具有 2M 页面的网站,那么您的重复过滤器列表可能会增长到每个爬虫 2M * 77b = 154Mb。为了能够同时抓取 300 个这样的域,您将需要 300 * 154Mb = 42G 内存。幸运的是还有另一种方法——Bloom Filter.

3) 在生产中,我在分布式环境中使用 Scrapyd 和 Scrapy 蜘蛛 运行

4) 恕我直言,我建议使用带有 scrapyd 实例和 运行 蜘蛛的小型 商品机器 而不是使用大型巨型机器。

5) 分布式 crawlers - 我个人没用过

6) 使用 Scrapy Debug 查找内存管理(日志:2015-07-20 20:32:11-0400 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023)

telnet localhost 6023

prefs()

实时参考

# scrapy class                 Memory   Time ago
HtmlResponse                        3   oldest:   5s ago
CraigslistItem                    100   oldest:   5s ago
DmozItem                            1   oldest:   0s ago
DmozSpider                          1   oldest:   6s ago
CraigslistSpider                    1   oldest:   5s ago
Request                          3000   oldest: 705s ago
Selector                           14   oldest:   5s ago

您每秒抓取 3 个页面。除非您的页面的响应时间非常长,否则给定 CONCURRENT_REQUESTS_PER_DOMAIN = 32 就太短了。布隆过滤器似乎是您将来可能会遇到的问题。现在,您需要 7 天的全部时间来抓取 2M 的页面(并使用 154Mb 的 Ram)。