この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 29455|答える: 11

[Javaソースコード] ウェブクローラーのJavaバージョン

[リンクをコピー]
掲載地 2014/11/30 16:56:56 | | | |
[mw_shl_code=java,true]/**
* @author Jack.Wang
*
*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
java.net.URLをインポート;
import java.util.ArrayList;
java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

ウェブクローラーの検索
public class SearchCrawler は Runnable { を実装します

/*
  * disallowListCache キャッシュロボットは検索URLを許可しません。 Robotプロトコルはウェブサイトのルートディレクトリにrobots.txtファイルを設定します。
  * サイトのどのページが制限付き検索対象かを指定します。
  * 検索プログラムはこれらの領域を検索中にスキップすべきです。以下はrobots.txt例です:
  * # http://somehost.com/ ユーザーエージェントへのrobots.txt:
  * 禁止: /cgi-bin/
  * 禁止: /登録 # 登録ページでロボットを禁止
  * 禁止: /ログイン
  */

private HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, ArrayList<String>>();
ArrayList<String> errorList = new ArrayList<String>(); エラーメッセージ
ArrayList<String> 結果 = new ArrayList<String>(); 検索結果
文字列 startUrl; 検索を始めるための出発点
int maxUrl; 処理された最大URL数
文字列 searchString; 検索する文字列
ブールケースSensitive = false; 大文字に細かく区別するかどうか
ブール限界Host = false; 制限されたホスト内で検索するかどうか

public SearchCrawler(String startUrl, int maxUrl, String searchString) {
  this.startUrl = startUrl;
  this.maxUrl = maxUrl;
  this.searchString = searchString;
}

public ArrayList<String> getResult() {
  リターン結果;
}

public void run() { // 検索スレッドを開始
  crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}

URLフォーマット検出
private URL verifyUrl(String URL) {
  処理されるのはHTTP URLのみです。
  if (!url.toLowerCase().startsWith("http://"))
   nullを返します;
  URL verifiedUrl = null;
  試してみて {
   verifiedUrl = 新しいURL(URL);
  } catch (例外 e) {
   nullを返します;
  }
  return verifiedUrl;
}

ロボットが指定されたURLへのアクセスを許可しているかどうかを検出します。
private boolean isRobotAllowed(URL urlToCheck) {
  String host = urlToCheck.getHost().toLowerCase(); RULを出すホストを選びましょう
  System.out.println("host="+host);

  ホストが検索を許可していないURLのキャッシュを用意しましょう
  ArrayList<String> disallowList = disallowListCache.get(host);

  もしまだキャッシュを持っていなければ、ダウンロードしてキャッシュしてください。
  もし(disallowList == null) {
   disallowList = new ArrayList<String>();
   試してみて {
    URL robotsFileUrl = 新しいURL("http://" + host + "/robots.txt");
    BufferedReader = 新しいBufferedReader(
      新しいInputStreamReader(robotsFileUrl.openStream());

    ロボットファイルを読んで、アクセスできないパスのリストを作成します。
    ストリングライン;
    while ((line = reader.readLine()) != null) {
     if (line.indexOf("Disallow:") == 0) {// "Disallow:" を含むか?
      文字列 disallowPath = line.substring("Disallow:"
        .length()); アクセス禁止へのパスを入手してください

      注釈を確認してください。
      int commentIndex = disallowPath.indexOf("#");
      もし(commentIndex != -1) {
       disallowPath = disallowPath.substring(0,
         commentIndex); コメントを削除してください
      }

      disallowPath = disallowPath.trim();
      disallowList.add(disallowPath);
     }
    }

    このホストがアクセスできないキャッシュパス。
    disallowListCache.put(host, disallowList);
   } catch (例外 e) {
    真を返す; ウェブサイトのルートディレクトリにはrobots.txtファイルがなく、trueを返します
   }
  }

  String file = urlToCheck.getFile();
  System.out.println("File getFile()="+file);
  (int i = 0; 私は< disallowList.size(); i++) {
   文字列 disallow = disallowList.get(i);
   if (file.startsWith(disallow)) {
    Return false;
   }
  }

  真を返す;
}

private String downloadPage(URL pageUrl) {
  試してみて {
   URLへの接続を開いて読み込みます。
   BufferedReader リーダー = 新しいBufferedReader(新しいInputStreamReader(
     pageUrl.openStream());

   バッファにページを読み込みます。
   ストリングライン;
   StringBuffer pageBuffer = 新しいStringBuffer();
   while ((line = reader.readLine()) != null) {
    pageBuffer.append(line);
   }

   return pageBuffer.toString();
  } catch (例外 e) {
  }

  nullを返します;
}

URLから「www」を削除する
private String removeWwwFromUrl(String url) {
  int index = url.indexOf("://www.");
  もし(添字!= -1) {
   url.substring(0, index + 3) + url.substring(index + 7)を返します;
  }

  return(URL);
}

ページを解析してリンクを見つけてください
プライベート ArrayList<String> retrieveLinks(URL pageUrl, String pageContents,
   HashSet crawledList, boolean limitHost) {
  リンクの一致パターンを正規表現でまとめます。
  Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*"?(。 *?)[\"|>]",
    Pattern.CASE_INSENSITIVE);
  マッチャー m = p.matcher(pageContents);

  ArrayList<String> linkList = new ArrayList<String>();
  一方 (m.find()) {
   String link = m.group(1).trim();

   もし(link.length() < 1) {
    続けてください;
   }

   このページのリンクは飛ばしてください。
   if(link.charAt(0) == '#') {
    続けてください;
   }

   if (link.indexOf("mailto:") != -1) {
    続けてください;
   }

   if (link.toLowerCase().indexOf("javascript") != -1) {
    続けてください;
   }

   if(link.indexOf("://") == -1) {
    if(link.charAt(0) == '/') {// は絶対的に処理します
     link = "http://" + pageUrl.getHost() + ":"
       + pageUrl.getPort() + リンク;
    } そうでなければ {
     String file = pageUrl.getFile();
     if (file.indexOf('/') == -1) {// 相対アドレスを扱います
      link = "http://" + pageUrl.getHost() + ":"
        + pageUrl.getPort() + "/" + リンク;
     } そうでなければ {
      String path = file.substring(0,
        file.lastIndexOf('/') + 1);
      link = "http://" + pageUrl.getHost() + ":"
        + pageUrl.getPort() + パス + リンク;
     }
    }
   }

   int index = link.indexOf('#');
   もし(添字!= -1) {
    link = link.substring(0, index);
   }

   リンク = removeWwwFromUrl(リンク);

   URL verifiedLink = verifyUrl(link);
   もし(verifiedLink == null) {
    続けてください;
   }

   /* ホストを制限する場合は、基準を満たさないURLは除外してください */
   もし(limitHost
     && !pageUrl.getHost().toLowerCase().equals(
       verifiedLink.getHost().toLowerCase())) {
    続けてください;
   }

   すでに処理されたリンクはスキップしてください。
   if (crawledList.contains(link)) {
    続けてください;
   }

   linkList.add(リンク);
  }

  return(linkList);
}

ダウンロードしたウェブページの内容を検索し、指定された検索文字列があるかどうかを確認しましょう

プライベートブール値検索StringMatches(String pageContents,
   String searchString, boolean caseSensitive) {
  文字列検索 Contents = pageContents;
  もし(!caseSensitive) {// もし大文字を区別しないなら
   searchContents = pageContents.toLowerCase();
  }

  パターンp = Pattern.compile("[\\s]+");
  String[] terms = p.split(searchString);
  (int i = 0; 私は terms.length を <; i++) {
   もし(caseSensitive) { の場合
    if (searchContents.indexOf(terms) == -1) {
     Return false;
    }
   } そうでなければ {
    if (searchContents.indexOf(terms.toLowerCase()) == -1) {
     Return false;
    }
   }
  }

  真を返す;
}

実際の探索操作を実行してください
public ArrayList<String> crawl(String startUrl, int maxUrls,
   String searchString, boolean limithost, boolean caseSensitive) {

  HashSet<String> crawledList = new HashSet<String>();
  LinkedHashSet<String> toCrawlList = new LinkedHashSet<String>();

  もし(maxUrls < 1) {
   errorList.add("Invalid Max URLs value.");
   System.out.println("Invalid Max URLs value.");
  }

  もし(searchString.length() < 1) {
   errorList.add("検索文字列が欠けている");
   System.out.println("検索文字列が欠けている");
  }

  もし (errorList.size() > 0) {
   System.out.println("err!!");
   errorListを返す;
  }

  wwwを開始URLから移動する
  startUrl = removeWwwFromUrl(startUrl);

  toCrawlList.add(startUrl);
  while (toCrawlList.size() > 0) {

   もし(maxUrls != -1) {
    if (crawledList.size() == maxUrls) {
     休憩;
    }
   }

   URLはリストの一番下に掲載されています。
   String URL = toCrawlList.iterator().next();

   クロールリストからURLを削除してください。
   toCrawlList.remove(url);

   文字列URLをURLオブジェクトに変換します。
   URL verifiedUrl = verifyUrl(URL);

   ロボットがアクセスできないURLはスキップしてください。
   if(!isRobotAllowed(verifiedUrl)){
    続けてください;
   }

   処理済みURLをcrawledListに追加してください
   crawledList.add(url);
   文字列ページ内容 = downloadPage(verifiedUrl);

   if(pageContents != null && pageContents.length() > 0) {
    ページから有効なリンクを取得してください
    ArrayList<String> links = retrieveLinks(verifiedUrl,
      pageContents、crawledList、limitHost);

    toCrawlList.addAll(リンク);

    もし(searchStringMatches(pageContents, searchString,
      caseSensitive)) {
     result.add(URL);
     System.out.println(url);
    }
   }

  }
  リターン結果;
}

主な機能
public static void main(String[] args) {
  SearchCrawler クローラー = 新しいSearchCrawler("http://www.itsvse.com/", 100,"Delver_Si");
  Thread search = 新しいThread(クローラー);
  System.out.println("検索を始め...");
  System.out.println("result:");
  search.start();
  試してみて {
   search.join();
  } catch (InterruptedException e) {
   TODO自動生成キャッチブロック
   e.printStackTrace();
  }
}
}
[/mw_shl_code]

1.png (100.02 KB, ダウンロード数: 591)

2.png (72.18 KB, ダウンロード数: 596)

3.png (188.46 KB, ダウンロード数: 606)





先の:PHPはトップ100Wのウェブサイトの82.2%を占めています
次に:Java エディション ウェブソースコードビューア
掲載地 2014/11/30 18:07:24 |
ジャック・マーが李嘉誠に追いついてアジア一の富豪になるまでまだ3億ドルあとというニュースを見て、心の中で笑い、インターネットで自分のランキングを確認したところ、ほとんど影響はなく、ランキングは約14億のままだった。今はほっとした! 実は、私も夢を持つ人間で、子供の頃から、約20年にわたる努力の末、サングラスをかけてランボルギーニのスポーツカーを故郷に帰る日が来るのを夢見ていました。今ではその夢は半分しか叶いません。すでに自分のサングラスを持っていますが、スポーツカーだけです。その夢はもうすぐ現実になり、考えると少しワクワクします!
 地主| 掲載地 2014/11/30 18:28:24 |

ウェブクローラー(ウェブスパイダー、ウェブボットとも呼ばれ、FOAFコミュニティではウェブチェイサーと呼ばれることが多い)は、特定のルールに従ってワールドワイドウェブに関する情報を自動的にスクレイピングするプログラムやスクリプトです。 他にあまり使われない名前には、アリ、オートインデックス、エミュレーター、ワームなどがあります。
掲載地 2014/11/30 17:40:16 |
Delver_Si 2014年11月30日 17:22に投稿
MSSQL ftpやその他のツールを爆発的に拡張するツールを書きたいのですが、オンラインで使いにくいのです

書いて、私がついてるから!  解体ツールは一般的に.netで書かれており、Javaで書かれたものはあまりないので、Javaで書くこともできます!
掲載地 2014/11/30 17:19:07 |
拭くよ、これはハッキングツールを作るのにいいパペットだ!
掲載地 2014/11/30 17:22:22 |
最初に集めたけど、今は役に立たないけど、将来役に立つと思う!
 地主| 掲載地 2014/11/30 17:22:42 |
MSSQL ftpやその他のツールを爆発的に拡張するツールを書きたいのですが、オンラインで使いにくいのです
掲載地 2014/11/30 18:08:16 |
どういう意味で、わからないって
 地主| 掲載地 2014/11/30 18:32:40 |
管理者が2014年11月30日 17:40に投稿
書いて、私がついてるから!  解体ツールは一般的に.netで書かれており、Javaで書かれたものはあまりないので、Javaで書くこともできます!

キットのmssqlブラスターでは自分のものすら撃てません。
 地主| 掲載地 2014/11/30 18:33:09 |
テスト 2014年11月30日 18:07 投稿
ジャック・マーがまだ李嘉誠に追いついてアジア一の富豪になるのに3億ドル足りないというニュースを見て、彼の心ははっと響き、すぐにインターネットでランキングを確認したが、ほとんど影響を受けていなかった...

君はウェブマスターのベストだろ?」
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com