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