我正在尝试找出一种在爬行运行时更改种子并完全删除“访问”数据库/队列的方法。
特别是,我想删除队列中的所有当前网址并添加新种子。大致如下:
public class MyCrawler extends WebCrawler {
private int discarded = 0;
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
boolean isDiscarded = checkPage(referringPage,url);
if(isDiscarded){
this.discarded++;
if(discarded >= 100){
//Clear all the urls that need to be visited
?_____?
//Add the new seed
this.myController.addSeed("http://new_seed.com");
discarded = 0;
}
}
return isDiscarded;
}
....
我知道我可以调用controller.shutdown()并重新启动一切,但这有点慢。
最佳答案
如果不修改原始源代码(通过派生它或使用 Reflection API),就没有内置功能可以实现此目的。
每个WebCrawler
都通过Frontier
实例获取新的URL,该实例存储所有网络爬虫的当前(已发现且尚未获取)URL。遗憾的是,该变量在 WebCrawler
中具有 private
访问权限。
如果您想要删除所有当前网址,则需要重置Frontier
对象。如果不实现提供此功能的自定义 Frontier
(请参阅 source code ),则无法进行重置。
关于java - 有没有办法在爬行过程中清除crawler4j中的访问队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407561/