2017-01-22 17 views
1

私はjsoupを使用してJavaでWebクローラーを作成しています(これはtutorialを使用しています)。電子メールリンクでブロックされたWebクローラー

私が直面する問題は、クローラがElementループに各リンクを取り込み、そのうちのいくつかが電子メールアドレスであることです。だから、メールアドレスにJsoup.connect(URL)を使用しようとすると、httpまたはhttps要求のみを使用するように指示するエラーが表示されます。

電子メールアドレスのリンクを取得するときにプログラムの再帰を停止するにはどうすればよいですか?あなたは!link.attr("abs:href").startsWith("mailto:")かどうかをテストする必要が

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 out メソッドを呼び出して、processPageを呼び出す前にハイパーリンクの値を確認してください。

+0

ありがとうございました!私はstartswithのhttp条件を追加し、それは動作します。 JsoupがHTMLに解析できない画像リンクがいくつかあるので、processPage再帰呼び出しにtry catchを追加しました。私はそれを止める方法を本当に知りません^^ PS:それは勉強するだけの課題ではありませんでした – Sacha

1

:ここ

はメインのコードです。

2

リンクがURLであるかどうかは、httpで始まるかどうかで確認できます。あなたは絶対URL(abs:hrefを使用しています)を持っていて、httpで始まるので、httpやhttps URL(電子メールアドレスへのリンクやFTPサイトではありません。 「Tが欲しい)

をたとえば、これまでのループのためにあなたを更新します。あなたは1回のエラーフェッチを取得する場合よう

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コール周りのtry/catchを置くために傾けられます(ネットワークのタイムアウトなどのような)ページは、アプリケーション全体がクラッシュすることはありません。

関連する問題