Redis - 爬虫访问过的站点列表
Redis - list of visited sites from crawler
我目前正在开发使用 Python 编码并结合 Gevent/requests/lxml 的爬虫程序来抓取一组定义的页面。我使用 redis 作为数据库来保存列表,例如待处理队列、抓取和已爬网的站点。对于每个 url,我都有一个键 url_ 并且我正在使用 SETNX 命令来确保 URL 尚未被抓取,然后将其放入队列中。
我开始面临的一个问题是 url_ 键集开始增长得非常快并且 Redis 保留了几乎所有数据在记忆中所以它很快就会成为一个问题。被抓取的URL没有过期时间,因为我只需要访问一次,url的内容以后不会改变,所以我还是想保留所有访问过的url秒。 (我正在过滤很多重复的 URLs)是否可以在 Redis 中使用一些数据结构,如 cuckoo hash table 或 bloom filter,这样我就可以防止访问列表 urls 增长那么快并且在查询队列时仍然受益于速度?
有没有其他方法可以用来确定 URL 是否已经被访问过?该解决方案应该是可扩展和分布式的,因为爬虫目前 运行 在不止一台机器上。
谢谢!
几点建议:
研究使用 Redis' (2.8.9+) HyperLogLog data structure - 你可以使用 PFADD
和 PFCOUNT
来得到一个合理的答案是否 URL之前算过。
不要将每个 URL 保留在其自己的 url_
键中 - 如 "Memory Optimization/Using hashes to abstract a very memory efficient plain key-value store on top of Redis"
中所述合并为单个或桶哈希
将访问过的 URL 存储在单个(多个分桶的)集合中,用于历史查找和自动重复数据删除。使用 URL 的分数设置为其爬网时间的纪元值的排序集,对它们进行排序并进行范围查询。
底线:除非您使用 url_
键实际存储有关 URL 的内容,否则不要那样做。看起来您使用这些密钥只是为了管理状态,因此哈希和集合会更加高效和健壮。
我目前正在开发使用 Python 编码并结合 Gevent/requests/lxml 的爬虫程序来抓取一组定义的页面。我使用 redis 作为数据库来保存列表,例如待处理队列、抓取和已爬网的站点。对于每个 url,我都有一个键 url_ 并且我正在使用 SETNX 命令来确保 URL 尚未被抓取,然后将其放入队列中。
我开始面临的一个问题是 url_ 键集开始增长得非常快并且 Redis 保留了几乎所有数据在记忆中所以它很快就会成为一个问题。被抓取的URL没有过期时间,因为我只需要访问一次,url的内容以后不会改变,所以我还是想保留所有访问过的url秒。 (我正在过滤很多重复的 URLs)是否可以在 Redis 中使用一些数据结构,如 cuckoo hash table 或 bloom filter,这样我就可以防止访问列表 urls 增长那么快并且在查询队列时仍然受益于速度?
有没有其他方法可以用来确定 URL 是否已经被访问过?该解决方案应该是可扩展和分布式的,因为爬虫目前 运行 在不止一台机器上。 谢谢!
几点建议:
研究使用 Redis' (2.8.9+) HyperLogLog data structure - 你可以使用
PFADD
和PFCOUNT
来得到一个合理的答案是否 URL之前算过。不要将每个 URL 保留在其自己的
中所述合并为单个或桶哈希url_
键中 - 如 "Memory Optimization/Using hashes to abstract a very memory efficient plain key-value store on top of Redis"将访问过的 URL 存储在单个(多个分桶的)集合中,用于历史查找和自动重复数据删除。使用 URL 的分数设置为其爬网时间的纪元值的排序集,对它们进行排序并进行范围查询。
底线:除非您使用 url_
键实际存储有关 URL 的内容,否则不要那样做。看起来您使用这些密钥只是为了管理状态,因此哈希和集合会更加高效和健壮。