2014-02-21 34 views
0

我從購物網站抓取大量數據。例如考慮我抓取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"); 
     } 
    } 
} 

我在這裏使用,但仍然設置在插入完成我能得到一些重複的網址後..我無法理解的問題。請幫我解決一下這個。

+0

設置將只添加唯一的字符串,並區分大小寫。你確定你得到重複的網址嗎? – anonymous

+0

是的,我得到suplicate。因爲我編寫了另一個代碼來檢查數據庫中的重複數據,並且我收到了一些。實際上我現在得到了解決方案.. Set對象是在本地聲明的,每次我調用這個process()函數時都會創建一個新對象。現在我宣佈它是全球性的。並且設置對象只創建一次。感謝您的支持。 – sarath

回答

1
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"); 
} 
+0

當且僅當對象不等於時,s.add()纔會添加到集合中。如果添加失敗(即object equals),則返回false,否則返回true。 – anonymous

+0

是的,我越來越重複。因爲我編寫了另一個代碼來檢查數據庫中的重複數據,並且我收到了一些。實際上我現在得到了解決方案.. Set對象是在本地聲明的,每次我調用這個process()函數時都會創建一個新對象。現在我宣佈它是全球性的。並且設置對象只創建一次。但是這看起來像一個更好的代碼來檢查..我現在將使用s.contains來檢查..謝謝。 – sarath

+0

您的歡迎Sarath。享受編碼和計算器。 –