2014-01-07 2 views
1

Здесь у меня есть все сайты, выползли из нескольких различных навигационных сайтов, некоторые из них продублированы, я имею в виду, например:Как отличить сайты с помощью Java?

http://www.hao123.com/index.htm И http://www.hao123.com

Эти два сайта с одинаковым содержанием, конечно, там это другие случаи, такие как отсутствующая косая черта. Используя только один URL, я все же воспринимаю их как два разных сайта.

Мой вопрос: есть ли эффективные способы распознать их как один сайт? Благодаря!

+1

Почему бы просто проверить, если две строк (имя сайта) начинается с тем же доменным именем, или сво подстрокой другого? – xyz

+0

Вы можете совместить длину контента – sanket

+3

Это два разных URL-адреса, а не два разных сайта. –

ответ

2

Нет надежного способа, которым я это знаю.

Сказав это, одним из способов может быть загрузка содержимого из каждого URL-адреса, а затем применить алгоритм расстояния Levenshtein ко всем страницам, которые попадают под одно и то же имя домена. Затем вы можете установить пороговое значение в отношении того, как «аналогичный» контент до того, как он будет считаться одним и тем же (как если бы содержимое немного изменилось, я бы предположил, что основная часть его будет по-прежнему идентична.) Что-то вроде 10% длины страницы может быть хорошей отправной точкой для этого значения.

Это может быть относительно медленным в зависимости от количества сайтов, которые у вас есть, но будет учитывать небольшие различия в содержании на каждой загрузке, что простой расчет хеша или длины не будет.

Чтобы сделать это более надежным, вы можете проверить, что определенные вещи идентичны (или нет) по нагрузкам, которые вы ожидаете - например, название страницы.

+0

Спасибо. Я попытался использовать заголовок страницы для выполнения задания, но я не знаю, достаточно ли этого. Я пожелал более простого способа, так как вы сказали, что нет надежного способа, я могу попробовать метод, о котором вы говорили. Еще раз спасибо! – Stepin

+1

Я бы имел в виду только видимый контент, потому что много содержимого страницы включено из библиотек JavaScript или шаблонов блога. Существуют способы создания страницы, но простая проверка тегов содержимого с алгоритмом расстояния Левенштейна должна делать трюк. –

+0

@MichaelShopsin Конечно, вы могли бы улучшить этот метод относительно легко, используя библиотеку, которая просто приняла контент, который был фактически отображен. – berry120

1

Использование регулярных выражений для разбора из доменных имен

Пример фрагмента:

String a = "http://www.google.com"; 

String tempString = a.substring(a.indexOf(".")+1, a.length()); // gets rid of everything before the first dot 

String domainString = tempString.substring(0, tempString.indexOf(".")); // grabs everything before the second dot 

System.out.println(domainString); 

Выходы google

EDIT:

Вот пример автономных демо, что может иметь дело с более сложной структурой домена склеивает и извлекает отдельные компоненты.

Вы можете добавить больше доменов тест-кейсы внутри основного метода в источнике ниже, чтобы проверить различные домены, но в настоящее время он проверяет следующие из них:

http://www.google.com/

ftp://www.google.com

http://google.com/

google.com

localhost:80

Вот источник (Пардон мой ленивый спагетти):

package domain.parser.test; 

public class Parseromatic { 

    public static void main(String[] args) { 

     Parseromatic parser = new Parseromatic(); 
     parser.extract("http://www.google.com/"); 
     parser.extract("ftp://www.google.com"); 
     parser.extract("http://google.com/"); 
     parser.extract("google.com"); 
     parser.extract("localhost:80"); 

    } 

    public void extract(String a){ 

     if(a.contains(".")){ // Initial outOfBounds proof check in cases like (http://localhost:80) 
      String leadingString = a.substring(0, a.indexOf(".")); // First portion of the URL 

      boolean hasProto = protocol(leadingString); 

      // Now lets grab the rest 
      String trailingString = a.substring(a.indexOf(".")+1, a.length()); 

      // Check if it contains a forward-slash 
      if(trailingString.contains("/")){ 

       // We snip out everything before the slash 

       String middleString = snipOffPages(trailingString); 

       // Now we're only left with the domain related things 

       // Check if subdomain was left in the leadingString 

       if(middleString.contains(".")){ 
        // Yep so lets deal with that 

        if(hasProto){ // If it had a protocol 
         System.out.println("Subdomain: "+leadingString.substring(leadingString.indexOf("://")+3, leadingString.length())); 
        } else { // If it didn't have a protocol 
         System.out.println("Subdomain: "+leadingString); 
        } 

        // Now let's split up the rest 

        String[] split1 = middleString.split("\\."); 

        System.out.println("Domain: "+split1[0]); 

        // Check for port 
        if (split1[1].contains(":")){ 

         // Assuming port is specified 

         String[] split2 = split1[1].split(":"); 

         System.out.println("Top-Domain: "+split2[0]); 

         System.out.println("Port: "+split2[1]); 

        } else { 

         // Assuming no port specified 

         System.out.println("Top-Domain: "+split1[1]); 

         System.out.println("Port: N/A"); 
        } 


       } else { 

        // No subdomain was present 

        System.out.println("Subdomain: N/A"); 

        if(hasProto){ // If it had a protocol 
         System.out.println("Domain: "+leadingString.substring(leadingString.indexOf("://")+3, leadingString.length())); 
        } else { // If it didn't have a protocol 
         System.out.println("Domain: "+leadingString); 
        } 

        // Check for port 
        if (middleString.contains(":")){ 

         // Assuming port is specified 

         String[] split2 = middleString.split(":"); 

         System.out.println("Top-Domain: "+split2[0]); 

         System.out.println("Port: "+split2[1]); 

        } else { 

         // Assuming no port specified 

         System.out.println("Top-Domain: "+middleString); 

         System.out.println("Port: N/A"); 
        } 

       } 


      } else { // We assume it only contains domain related things 

       if(trailingString.contains(".")){ 
        // Yep so lets deal with that 

        if(hasProto){ // If it had a protocol 
         System.out.println("Subdomain: "+leadingString.substring(leadingString.indexOf("://")+3, leadingString.length())); 
        } else { // If it didn't have a protocol 
         System.out.println("Subdomain: "+leadingString); 
        } 

        // Now let's split up the rest 

        String[] split1 = trailingString.split("\\."); 

        System.out.println("Domain: "+split1[0]); 

        // Check for port 
        if (split1[1].contains(":")){ 

         // Assuming port is specified 

         String[] split2 = split1[1].split(":"); 

         System.out.println("Top-Domain: "+split2[0]); 

         System.out.println("Port: "+split2[1]); 

        } else { 

         // Assuming no port specified 

         System.out.println("Top-Domain: "+split1[1]); 

         System.out.println("Port: N/A"); 
        } 


       } else { 

        // No subdomain was present 

        System.out.println("Subdomain: N/A"); 

        if(hasProto){ // If it had a protocol 
         System.out.println("Domain: "+leadingString.substring(leadingString.indexOf("://")+3, leadingString.length())); 
        } else { // If it didn't have a protocol 
         System.out.println("Domain: "+leadingString); 
        } 

        // Check for port 
        if (trailingString.contains(":")){ 

         // Assuming port is specified 

         String[] split2 = trailingString.split(":"); 

         System.out.println("Top-Domain: "+split2[0]); 

         System.out.println("Port: "+split2[1]); 

        } else { 

         // Assuming no port specified 

         System.out.println("Top-Domain: "+trailingString); 

         System.out.println("Port: N/A"); 
        } 

       } 

      } 

     } else { 

      // Assuming only one level exists 

      boolean hasProto = protocol(a); 

      // Check if protocol was present 
      if(hasProto){ 
       String noProto = a.substring(a.indexOf("://")+3, a.length()); 

       // If some pages or something is specified 
       if(noProto.contains("/")){ 
        noProto = snipOffPages(noProto); 
       } 

       // Check for port 
       if(noProto.contains(":")){ 

        String[] split1 = noProto.split(":"); 

        System.out.println("Subdomain: N/A"); 
        System.out.println("Domain: "+split1[0]); 
        System.out.println("Top-Domain: N/A"); 
        System.out.println("Port: "+split1[1]); 

       } else { 

        System.out.println("Subdomain: N/A"); 
        System.out.println("Domain: "+noProto); 
        System.out.println("Top-Domain: N/A"); 
        System.out.println("Port: N/A"); 

       } 

      } else { 

       // If some pages or something is specified 
       if(a.contains("/")){ 
        a = snipOffPages(a); 
       } 

       // Check for port 
       if(a.contains(":")){ 

        String[] split1 = a.split(":"); 

        System.out.println("Subdomain: N/A"); 
        System.out.println("Domain: "+split1[0]); 
        System.out.println("Top-Domain: N/A"); 
        System.out.println("Port: "+split1[1]); 

       } else { 

        System.out.println("Subdomain: N/A"); 
        System.out.println("Domain: "+a); 
        System.out.println("Top-Domain: N/A"); 
        System.out.println("Port: N/A"); 

       } 

      } 



     } 

     System.out.println(); // Cosmetic empty line, can ignore 


    } 

    public String snipOffPages(String a){ 
     return a.substring(0,a.indexOf("/")); 
    } 

    public boolean protocol(String a) { 
     // Protocol extraction 
     if(a.contains("://")){ // Check for existance of protocol declaration 
      String protocolString = a.substring(0, a.indexOf("://")); 
      System.out.println("Protocol: "+protocolString); 
      return true; 
     } 
     else { 
      System.out.println("Protocol: N/A"); 
      return false; 
     } 
    } 

} 

И для указанных областей над ней выводит:

Protocol: http 
Subdomain: www 
Domain: google 
Top-Domain: com 
Port: N/A 

Protocol: ftp 
Subdomain: www 
Domain: google 
Top-Domain: com 
Port: N/A 

Protocol: http 
Subdomain: N/A 
Domain: google 
Top-Domain: com 
Port: N/A 

Protocol: N/A 
Subdomain: N/A 
Domain: google 
Top-Domain: com 
Port: N/A 

Protocol: N/A 
Subdomain: N/A 
Domain: localhost 
Top-Domain: N/A 
Port: 80 
+0

Спасибо, но это не используется, я думаю.Могут быть сложные выражения для сайта с более чем трехуровневым доменом. – Stepin

+0

Вы могли бы просто усилить регулярное выражение, дать мне минуту, и я выложу более сложное решение. –

+0

Там вы можете использовать что-то похожее на демо выше. –

0

Лучший способ, вероятно, используя регулярные выражения, чтобы получить доменное имя и сохранить список всех доменных имен. Всякий раз, когда вы проверяете новую проверку URL-адресов на свой список «посещенных» доменных имен. Вот старше вопрос о том, как получить имя домена:

Get domain name from given url

Смежные вопросы