Java 爬行时如何消除大量数据中的重复

Java 爬行时如何消除大量数据中的重复,java,set,web-crawler,Java,Set,Web Crawler,我正在从购物网站抓取大量数据。例如,我正在爬行200页的数据,每一页都有30个产品细节。我正在抓取名称、价格、imageURL和productURL。productURL不能重复。。如何在爬网时检查产品URL是否重复,并避免数据库中出现非重复值。我将给出我在下面尝试过的示例代码 public void process(ArrayList<Item> results) { Set<String> s = new HashSet<String>();

我正在从购物网站抓取大量数据。例如,我正在爬行200页的数据,每一页都有30个产品细节。我正在抓取名称、价格、imageURL和productURL。productURL不能重复。。如何在爬网时检查产品URL是否重复,并避免数据库中出现非重复值。我将给出我在下面尝试过的示例代码

public void process(ArrayList<Item> results) {
    Set<String> s = new HashSet<String>();

    System.out.println("*****************OUTPUT****************");
    StringBuilder dataBuilder;

    System.out.println("TOTAL ITEMS " + results.size());

    for (Item item : results) {
        item.setSrc(xmlData.getSrc());

        if (!item.getName().trim().equals("")
                && !item.getPrice().trim().equals("")
                && !item.getUrl().trim().equals("")) {

            if (s.add(item.getUrl())) {
                dao.insertToDB(item, xmlData.getOutput_DB());
            } else {
                system.out.println("url is repeating");
            }
        } else {
            System.out.println("first loop failedddd");
        }
    }
}
公共作废流程(ArrayList结果){
Set s=新的HashSet();
System.out.println(“**********************输出**********************”);
StringBuilder数据生成器;
System.out.println(“总计项”+结果.size());
用于(项目:结果){
item.setSrc(xmlData.getSrc());
如果(!item.getName().trim()等于(“”)
&&!item.getPrice().trim().equals(“”)
&&!item.getUrl().trim().equals(“”){
如果(s.add(item.getUrl())){
insertToDB(item,xmlData.getOutput_DB());
}否则{
system.out.println(“url正在重复”);
}
}否则{
System.out.println(“第一个循环失败ddd”);
}
}
}

我在这里使用set,但插入完成后仍然可以得到一些重复的url。。我无法理解这个问题。请帮我做这个

Set将只添加唯一字符串,并且区分大小写。你确定你得到了重复的URL吗?是的,我很惊讶。因为我写了另一个代码来检查数据库中的重复数据,我得到了一些。事实上我现在找到了解决办法。。Set对象是在本地声明的,每次调用这个process()函数时,都会创建一个新对象。现在我宣布它是全球性的。设置对象只创建一次。感谢您的支持。s.add()仅当且仅当对象不相等时才会添加到集合中。如果它不能添加(即object equals),则返回false,否则返回true。是的,我很惊讶。因为我写了另一个代码来检查数据库中的重复数据,我得到了一些。事实上我现在找到了解决办法。。Set对象是在本地声明的,每次调用这个process()函数时,都会创建一个新对象。现在我宣布它是全球性的。设置对象只创建一次。但这看起来是一个更好的代码来检查。。我现在将使用s.contains检查。。谢谢,欢迎你,莎拉。享受编码和堆栈溢出。
if (!item.getName().trim().equals("")
    && !item.getPrice().trim().equals("")
        && !item.getUrl().trim().equals(""))
{
    if (s.contains(item.getUrl())) {
        system.out.println("url is repeating");
    }
    else {
        dao.insertToDB(item, xmlData.getOutput_DB());
        s.add(item.getUrl());
    }
}
else {
    System.out.println("first loop failedddd");
}