Java 如何管理爬虫URL边界?
伙计们 我有以下代码在我的爬虫上添加访问过的链接。 提取链接后,我有一个for循环,该循环遍历每个href标签 在我访问了一个链接并打开它之后,我将把URL添加到上面定义的已访问链接集合变量中Java 如何管理爬虫URL边界?,java,multithreading,web-crawler,forkjoinpool,Java,Multithreading,Web Crawler,Forkjoinpool,伙计们 我有以下代码在我的爬虫上添加访问过的链接。 提取链接后,我有一个for循环,该循环遍历每个href标签 在我访问了一个链接并打开它之后,我将把URL添加到上面定义的已访问链接集合变量中 private final Collection<String> urlForntier = Collections.synchronizedSet(new HashSet<String>()); private final Collection urlForntier=Col
private final Collection<String> urlForntier = Collections.synchronizedSet(new HashSet<String>());
private final Collection urlForntier=Collections.synchronizedSet(new HashSet());
爬虫程序的实现是mulithread,假设我访问了100000个URL,如果我没有终止爬虫程序,它将一天比一天增长。它会造成内存问题吗?请问,在不造成线程间不一致的情况下,我必须刷新变量吗
提前谢谢 现代爬行系统最有用的方法是使用数据库 此解决方案明显比HashSet慢。这就是为什么您可以利用不同的缓存策略,如a,甚至s 但包括URL的特定性质,我想推荐一种数据结构,它为您提供了许多选项,可以通过URL字符串进行操作和搜索。(有关java实现的讨论可在此Stackoevrflow上找到)
谢谢杜菲!我想知道变量什么时候会被清除,如果我运行10000年,那么我需要多少内存?如何解决这个问题?即使我用了三个句子suggested@danielad根据Google的开放统计,url的平均长度是90个符号,因为今天Google报告了大约500亿(5*10^10)个网页,一些Trie实现声明我们可以保持这种结构,内存效率为O(N)。简单乘法对现代计算机来说不是那么大的数字