首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis -爬虫网站访问名单

Redis -爬虫网站访问名单
EN

Stack Overflow用户
提问于 2015-02-25 13:15:02
回答 1查看 1.3K关注 0票数 1

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

我开始面临的问题之一是,url_键集开始快速增长,和Redis将几乎所有的数据保存在内存中,因此很快就会成为一个问题。被抓取的URL没有过期时间,因为我只需要访问它们一次,而且url的内容在将来不会改变,所以我仍然希望保留所有已访问的url。(有很多重复的URLs,我正在过滤)是否可以使用一些数据结构,如杜鹃哈希表或布鲁过滤器在Redis,这样我可以防止访问的urls列表增长那么快,但仍然有利于查询队列的速度?

是否有其他方法可以用来确定URL是否已经被访问过?该解决方案应该是可伸缩和分布式的,因为爬虫目前运行在多台计算机上。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-25 13:41:29

几点建议:

  1. 查看使用Redis‘(2.8.9+) HyperLogLog数据结构 --您可以使用PFADDPFCOUNT来得到一个合理的答案,无论之前是否计算了URL。
  2. 不要将每个URL保存在自己的url_键中--如内存优化/使用散列来抽象一个非常有效的内存普通键值存储在Redis之上中所解释的那样,将每个URL合并为单个或桶哈希
  3. 将访问的URL存储在一个单独的(几个桶)集合中,以便进行历史查找和自动删除。使用一个排序集,并将URL的分数设置为其爬行时间的划时代值,以便对它们进行排序并执行范围查询。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28719976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档