今天出现了两个错误,一是忘记了scrapyd重启后重置Open file limit,导致京东爬虫刷完了所有start_urls而没有获取什么数据;二是redis内存爆了,设置了3G最大内存,结果因为自己对redis的利用不够优化内存超限爬虫失败。
第一个问题可以写个自动化脚本定期reset,第二个问题的解决办法可以用bloomfilter代替scrapy redis中的去重,可以大幅度节省内存,对于数据采集这种容错率高的应用来说足够了。bloomfilter高效又节省内存,有点小小的失误率没什么关系。
- 安装scrapy-redis-bloomfilter
- 修改配置文件
pip install scrapy-redis-bloomfilter
# scrapy redis 配置
SCHEDULER = "scrapy_redis_bloomfilter.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis_bloomfilter.dupefilter.RFPDupeFilter"
# redis://[user:pass]@host:port/db
REDIS_URL = 'redis://@localhost:6379'
# Schedule requests using a priority queue. (default)
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
# Alternative queues.
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'
# 持久化,不自动清空
SCHEDULER_PERSIST = True
# Store scraped item in redis for post-processing.
# ITEM_PIPELINES = {
# 'scrapy_redis.pipelines.RedisPipeline': 300
# }
# Number of Hash Functions to use, defaults to 6
BLOOMFILTER_HASH_NUMBER = 6
# Redis Memory Bit of Bloomfilter Usage, 30 means 2^30 = 128MB, defaults to 30
BLOOMFILTER_BIT = 30
我这里用了31,258Mb内存可以去重2个亿吧,足够了。但是,经验告诉我,不能完全依赖这个,最好还是自己存个requests的记录,方便以后增量去重,可以用mysql, mongodb, 甚至redis。