gpt4 book ai didi

python - Redis - 爬虫访问过的站点列表

转载 作者:可可西里 更新时间:2023-11-01 11:21:30 25 4
gpt4 key购买 nike

我目前正在开发一个用 Python 编码的爬虫,结合 Gevent/requests/lxml 来爬取一组定义的页面。我使用 redis 作为数据库来保存列表,例如待处理队列、抓取和已爬网的站点。对于每个 url,我都有一个键 url_ 并且我正在使用 SETNX 命令来确保该 URL 尚未被抓取,然后将其放入队列中。

我开始面临的一个问题是 url_ 键集开始增长得非常快,并且 Redis 将几乎所有数据保存在内存中,因此它很快就会成为一个问题。抓取的url没有过期时间,因为我只需要访问一次,而且url的内容以后不会改变,所以我还是想保留所有访问过的url。 (我正在过滤很多重复的 URL)是否可以在 Redis 中使用一些数据结构,如布谷鸟哈希表或布隆过滤器,这样我就可以防止访问的 URL 列表快速增长,并且仍然有利于速度什么时候查询队列?

有没有其他方法可以用来确定 URL 是否已经被访问过?该解决方案应该是可扩展的和分布式的,因为爬虫目前在不止一台机器上运行。谢谢!

最佳答案

一些建议:

  1. 研究使用 Redis' (2.8.9+) HyperLogLog data structure - 您可以使用 PFADDPFCOUNT 来获得一个 URL 之前是否被统计过的合理答案。

  2. 不要将每个 URL 保留在其自己的 url_ 键中 - 如 "Memory Optimization/Using hashes to abstract a very memory efficient plain key-value store on top of Redis" 中所述,合并到单个哈希或桶哈希中。

  3. 将访问过的 URL 存储在一个(多个分桶的)集合中,用于历史查找和自动重复数据删除。使用 Sorted Set,将 URL 的分数设置为其抓取时间的纪元值,以对它们进行排序并进行范围查询。

底线:除非您使用 url_ 键来实际存储有关 URL 的内容,否则不要那样做。看起来您使用这些键只是为了管理状态,因此哈希和集合会更加高效和健壮。

关于python - Redis - 爬虫访问过的站点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28719976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com