2017-01-22 5 views
1

Я создаю веб-искатель на Java с помощью jsoup (используя этот tutorial).Веб-Crawler заблокирован по ссылке электронной почты

Проблема, с которой я сталкиваюсь, заключается в том, что искатель берет в цикл Элемент каждую ссылку, некоторые из которых являются адресом электронной почты. Поэтому, когда я пытаюсь использовать Jsoup.connect(URL) по адресу электронной почты, я получаю сообщение об ошибке, указывающее только на использование запросов http или https.

Как я могу остановить свою программу для выполнения рекурсии при получении ссылки на адрес электронной почты?

Вот основной код:

public class Main { 

public static DB db = new DB(); 

public static void main(String[] args) throws SQLException, IOException{ 
    db.runSql2("TRUNCATE Record;"); 
    processPage("http://www.mit.edu"); 
} 

public static void processPage(String URL) throws SQLException,IOException{ 
    String sql = "select * from Record where URL = '" +URL+"'"; 
    ResultSet rs = db.runSql(sql); 
    if(rs.next()){ 

    } else { 
     sql = "INSERT INTO `Crawler`.`Record` " + "(`URL`) VALUES " + "(?);"; 
     PreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
     stmt.setString(1,URL); 
     stmt.execute(); 

     Document doc = Jsoup.connect(URL).get(); 

     if(doc.text().contains("research")){ 
      System.out.println(URL); 
     } 

     Elements questions = doc.select("a[href]"); 
     for(Element link:questions){ 
      if(link.attr("href").contains("mit.edu")){ 
       System.out.println(link.attr("abs:href")); 
       processPage(link.attr("abs:href")); 
      } 
     } 

    } 
} 

}

ответ

1

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

Вы проверять, если это mit.edu страница здесь:

if(link.attr("href").contains("mit.edu")){ 
       System.out.println(link.attr("abs:href")); 
       processPage(link.attr("abs:href")); 
      } 

Теперь вам нужно дополнительное условие, чтобы посмотреть на вещи, которые только начинают с http или https. Check outString.startsWith() и используйте это, чтобы проверить значение гиперссылки, прежде чем вы вызовете processPage.

+0

Спасибо! Я добавил условие startswith http, и оно работает. Я также добавил попытку catch на рекурсивном вызове processPage, потому что у меня есть некоторые ссылки на изображения, которые Jsoup не может проанализировать в html. Я действительно не знаю, как остановить это. ^^ PS: Это было не задание, которое я просто хочу изучить – Sacha

1

Вы должны проверить, если !link.attr("abs:href").startsWith("mailto:").

2

Вы можете просто проверить, является ли ссылка URL, если она начинается с http. Поскольку у вас есть абсолютный URL-адрес (с использованием abs:href), и он начинается с http, он может быть только http или https-адресом (а не ссылкой на адрес электронной почты или FTP-сайт какого-либо другого нежелательного контента, который вы наняли «т хотите)

Например, обновите цикл к этому:.

for (Element link : questions) { 
    String href = link.attr("abs:href"); 
    if (href.contains("mit.edu") && href.startsWith("http")) { 
     System.out.println(href); 
     processPage(href); 
    } 
} 

Кроме того, я был бы склонен поставить попробовать/поймать вокруг каждого processPage вызова, так что если вы получите одну ошибку, забирающий страницу (например, тайм-аут сети или что-то еще), все ваше приложение не сбой.

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

  • Нет связанных вопросов^_^