小码农

好记性不如烂笔头....

scrapy_redis迁移scrapy_ssdb之坑爹库

爬虫成千上亿的去重队列,对于公司阿里云服务的内存是很大考验,很遗憾,它没能经得起考验,scrapy_redis采用redis的set数据类型存储请求(包括url,参数,请求方式等)的hash。

昨天中午,突然邮件提醒,爬虫异常???? 翻翻日志,连接redis错误?

心里想着,还好有硬盘备份,指定dump.rdb重启。。。

看看内存。。。。打扰了。。。赶紧清空了去重队列。

想解决办法,百度一番,别人都说用基于redis的布隆过滤器,有点意思。。。试试

网上找了个库:scrapy_redis_bloomfilter 使用方法不赘述,结果不是很理想,爬虫非常慢,原本一分钟可以抓400左右item,换成基于redis的布隆过滤器以后,只能几十个item一分钟,原因可能两点:布隆过滤器写一个超大bit数组到redis,对于读写都是很大的数据,再一个就说网络,我得分布式爬虫不在同一个内网,读写时数据过大且频繁造成网络带宽不够。

后来决定把reids队列改成使用ssdb作为队列,网上还真有这个库,名叫: scrapy-ssdb ,这就是坑的开始,留个地址:https://pypi.org/project/scrapy-ssdb/

该库完全参照redis,代码结构,注释都差不多,我原本想着,这样得库应该还可以,但是看到挺久没更新了,心里也没底,先试试

《scrapy_redis迁移scrapy_ssdb之坑爹库》
ssdb配置
《scrapy_redis迁移scrapy_ssdb之坑爹库》
Spider

原本想着,这么一配置,可以正常运行的。。。结果:

《scrapy_redis迁移scrapy_ssdb之坑爹库》
报错

结果是因为pyssdb(scrapy_ssdb所使用的ssdb链接库)并没有提供连接时带password的参数,所以scrap_ssdb参照redis的方法来写是不得行的。所以我修改了源码,在connection.py ->get_ssdb_from_settings方法里写上了:

instance = get_ssdb(**params)
instance.auth(settings.get('SSDB_PWD'))
return instance

再次运行继续报错:

《scrapy_redis迁移scrapy_ssdb之坑爹库》
报错2

我第一感觉还以为我用错库了,结果没有。。。是因为作者修改的问题,在文件:spiders.py

《scrapy_redis迁移scrapy_ssdb之坑爹库》
作者未修改的代码
self.logger.info("Reading start URLs from ssdb key '%(ssdb_key)s' "
                 "(batch size: %(ssdb_batch_size)s, encoding: %(ssdb_encoding)s",self.__dict__)
《scrapy_redis迁移scrapy_ssdb之坑爹库》
正常运行

喜大普奔

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注