|
|
掲載地 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 エディション ウェブソースコードビューア
|