我目前正在开发一个用Python编写的爬虫,它结合了Gevent/requests/lxml来爬行一组已定义的页面。我使用redis作为数据库来保存列表,如挂起队列、获取和已被爬行的站点。对于每个url,我都有一个键url_,我使用一个SETNX命令来确保该URL尚未被爬行,然后将其放入队列中。
我开始面临的问题之一是,url_键集开始快速增长,和Redis将几乎所有的数据保存在内存中,因此很快就会成为一个问题。被抓取的URL没有过期时间,因为我只需要访问它们一次,而且url的内容在将来不会改变,所以我仍然希望保留所有已访问的url。(有很多重复的URLs,我正在过滤)是否可以使用一些数据结构,如杜鹃哈希表或布鲁过滤器在Redis,这样我可以防止访问的urls列表增长那么快,但仍然有利于查询队列的速度?
是否有其他方法可以用来确定URL是否已经被访问过?该解决方案应该是可伸缩和分布式的,因为爬虫目前运行在多台计算机上。谢谢!
发布于 2015-02-25 13:41:29
几点建议:
PFADD和PFCOUNT来得到一个合理的答案,无论之前是否计算了URL。url_键中--如内存优化/使用散列来抽象一个非常有效的内存普通键值存储在Redis之上中所解释的那样,将每个URL合并为单个或桶哈希底线:除非您使用url_键来实际存储关于URL的内容,否则不要这样做。看起来,您使用这些键只是为了管理状态,这样哈希和集合就会更高效、更健壮。
https://stackoverflow.com/questions/28719976
复制相似问题