慢爬行,6个单元,900个并发请求,10k网站(scrapy云)

时间:2018-05-02 11:52:14

标签: web-scraping scrapy

我一直在运行一个普通的CrawlSpider',我用它来收集元数据,列在大约10k个不同的域名列表中。目标是完全抓取每个网站。

由于它是一次广泛的抓取,我已经为它运行了6个单元,并将CONCURRENT_REQUESTS加载到900,同时将AUTOTHROTTLE_TARGET_CONCURRENCY保持为1。

它会在第一个小时运行得相当快,然后会慢慢减速,大约3小时后速度达到每分钟50个项目,我认为当我们有900个可靠的请求时,我认为不是很多。

我可以通过将AUTOTHROTTLE_TARGET_CONCURRENCY提高到50来将其加速到平均约250项/分钟,但有些网站会给我很多超时例外。

所以我的问题是,我做错了吗?即使在跑步' top'在蜘蛛上,我可以看到它在开始时的运行率在60%-90%之间,现在它的最大值为5%。

这是我的settings.py文件

decodeToMono

这是我的蜘蛛

SPIDER_MODULES = ['crawl_everything.spiders']
NEWSPIDER_MODULE = 'crawl_everything.spiders'

SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': True,
}

BOT_NAME='bot'
USER_AGENT='bot'
ROBOTSTXT_OBEY = True
HTTPCACHE_ENABLED = False
LOG_LEVEL = 'WARNING'
DELTAFETCH_RESET=True

CONCURRENT_REQUESTS = 900
CONCURRENT_REQUESTS_PER_IP=20
DOWNLOAD_DELAY=1


DOWNLOAD_TIMEOUT = 30

REACTOR_THREADPOOL_MAXSIZE = 100

AUTOTHROTTLE_ENABLED=False

LOG_LEVEL = 'INFO'
COOKIES_ENABLED = False
RETRY_ENABLED = False
REDIRECT_ENABLED = True
AJAXCRAWL_ENABLED = True

1 个答案:

答案 0 :(得分:1)

我应该早些发布回复。
因此,当您想在数千个网站上运行相同的Spider时,最好的选择是将它们划分为多个“存储桶”,并将每个存储桶归因于Spider的实例(运行spider_a,spider_b,spider_c ...)
将CONCURENT_PER_DOMAIN设置为10,然后可以使用10个并发蜘蛛将CONCURRENT_REQUESTS设置为1000。这比我的第一个解决方案快得多。