0

伙计们

我有以下代码可以在我的爬虫上添加访问过的链接。提取链接后,我有一个for 循环,循环遍历每个单独的href 标签

在我访问了一个链接并打开它之后,我会将 URL 添加到上面定义的访问过的链接集合变量中。

private final Collection<String> urlForntier = Collections.synchronizedSet(new HashSet<String>()); 

爬虫实现是多线程的,假设我访问了 100,000 个 url,如果我没有终止爬虫,它会一天比一天增长。它会产生内存问题吗?请问,我有什么选项可以刷新变量而不造成线程间的不一致?

提前致谢!

4

3 回答 3

1

现代爬虫系统最有用的方法是使用NoSQL数据库。

此解决方案明显慢于HashSet. 这就是为什么您可以利用不同的缓存策略,例如Redis甚至Bloom filter s

但包括 URL 的特定性质,我想推荐Trie数据结构,它为您提供了很多选项来操作和搜索 url 字符串。(关于java实现的讨论可以在这个Stackoevrflow话题上找到)

于 2015-11-18T12:18:04.267 回答
1

如果你的爬虫很好,那么快速管理爬虫边界就会变得困难、缓慢且容易出错。

幸运的是,您不需要自己编写,只需编写爬虫以使用URL Frontier API 并插入适合您的实现。

https://github.com/crawler-commons/url-frontier

于 2021-10-11T19:32:41.810 回答
-1
  1. 根据问题,我建议使用Redis来代替 Collection。它是用于数据结构存储的内存数据库,在支持所有标准数据结构的情况下,插入和检索数据的速度非常快。在您的情况下,您可以使用SISMEMBER命令检查集合中的键是否存在)。

  2. Apache Nutch也很值得探索。

于 2015-11-18T12:54:46.917 回答