Guys
我有以下代码来添加我的爬虫上访问的链接。提取链接后,我有一个for循环,该循环遍历每个href标签。
在我访问了一个链接并打开它之后,我会将URL添加到上面定义的已访问链接集合变量中。
private final Collection<String> urlForntier = Collections.synchronizedSet(new HashSet<String>());
爬网程序的实现是多重读取的,并假设如果我访问了100000个url,如果我不终止爬网程序,它将与日俱增。它会造成内存问题吗?请问,在不造成线程间不一致的情况下,我有什么选项可以刷新变量?
提前感谢!
如果你的爬网程序很好,那么管理爬网前沿会变得困难、缓慢且容易出错。
幸运的是,您不需要自己编写,只需编写爬网程序即可使用URL Frontier API并插入适合您的实现。
请参阅https://github.com/crawler-commons/url-frontier
现代爬网系统最有用的方法是使用NoSQL数据库。
该解决方案明显比HashSet
慢。这就是为什么你可以利用不同的缓存策略,比如Redis,甚至Bloom过滤器
但包括URL的特定性质,我想推荐Trie数据结构,它为您提供了许多通过URL字符串进行操作和搜索的选项。(关于java实现的讨论可以在这个Stackoevrflow主题中找到)
-
根据问题,我建议使用Redis来代替Collection。它是内存数据库,用于数据结构存储,并支持所有标准数据结构,可快速插入和检索数据。在您的情况下,Set和您可以使用SISMEMBER命令检查集中密钥的存在)。
-
Apache Nutch也很适合探索。