私は以前に多くのシングルページのPythonクローラーを書いたことがありますが、Pythonはまだ非常に便利だと感じています。ここでは、Javaを使用して、マルチページクローラーを要約し、シードページのすべてのリンクを繰り返しクロールし、TMPパスの下ですべて保存します。
1。序文
このクローラーを実装するには、2つのデータ構造からのサポート、未訪問のキュー(PriorityQueue:URLの重要性を計算できます)とアクセステーブル(Hashset:URLが存在するかどうかをすばやく確認できます)。キューは幅最初のクロールを実装するために使用され、訪問されたテーブルは、リングを避けて、繰り返しクロールしないクロールされたURLを記録するために使用されます。 Java Crawlersが必要とするツールキットには、httpclientとhtmlparser1.5が含まれており、Maven Repoで特定のバージョンのダウンロードを表示できます。
1。ターゲットウェブサイト:Sina http://www.sina.com.cn/
2。結果のスクリーンショット:
クローラーの実装について話しましょう。ソースコードは後でGitHubにアップロードされます。それを必要とする友達はメッセージを残すことができます:
2。クローラープログラミング
1.シードページのURLを作成します
mycrawler crawler = new mycrawler();
crawler.crawling(new String [] {"http://www.sina.com.cn/"});
2。上記のシードURLとして未訪問のテーブルを初期化する
linkqueue.addunvisitedurl(seeds [i]);
3.最も重要な論理実装の部分:キューで訪問されていないURLを取り出し、ダウンロードしてから、訪問されたテーブルを追加し、変更されたURLページに他のURLを解析し、未読のキューを未訪問のキューに追加します。キューが空になるまで反復するため、このURLネットワークはまだ非常に大きくなります。ここでのページのダウンロードとページの解決には、Java Toolkitの実装が必要であり、ツールキットの使用について詳しく説明します。
while(!linkqueue.unvisitedurlsempty()&& linkqueue.getVisitedurlnum()<= 1000){//ヘッダーURLはキュー文字列visiturl =(string)linkqueue.unvisitedurldequeue(); if(visiturl == null)継続;ダウンロードfile downloadfile downloader = new downloadfile(); // WebページDownloader.DownLoadFile(Visiturl)をダウンロードしてください。 // URLは訪問されたURL linkqueue.addvisitedurl(visiturl)に配置されます。 //ダウンロードWebページセット<String> links = htmlparsertool.extraclinks(visiturl、filter);からURLを抽出します。 //(string link:links){linkqueue.addunvisitedurl(link); }}4.次のHTMLページのツールキットをダウンロードします
public string downloadfile(string url){string filepath = null; / * 1。httpclinetオブジェクトを生成し、パラメーターを設定します */ httpclient httpclient = new httpclient(); // 5s httpclient.gethttpconnectionmanager()。getParams()。setConnectionTimeout(5000)のHTTP接続タイムアウトを設定します。 / * 2。getMethodオブジェクトを生成し、パラメーターを設定します */ getMethod getMethod = new getMethod(url); // 5s getMethod.getParams()。setParameter(httpmethodparams.so_timeout、5000)のGet Request Timeoutを設定します。 // request requestry processing getMethod.getParams()。setParameter(httpmethodparams.retry_handler、new defaulthttpmethodretryhandler()); /* 3。http get request*/ try {int statusCode = httpclient.executeMethod(getMethod); //アクセスのステータスコードを決定するif(statuscode!= httpstatus.sc_ok){system.err.println( "method failed:" + getMethod.getStatusline()); filepath = null; }/* 4。プロセスHTTP応答コンテンツ*/byte [] responsebody = getMethod.getResponseBody(); // byte array // Webページに従ってファイル名を生成します。 Savetolocal(ResponseBody、Filepath); } catch(httpexception e){//致命的な例外が発生しました。これは、プロトコルが正しくないか、返されたコンテンツシステムに問題がある可能性があります。 e.printstacktrace(); } catch(ioException e){//ネットワークの例外が発生しましたe.printstacktrace(); }最後に{//接続をリリースgetMethod.releaseConnection(); } filepathを返します。 }5。HTMLページ解析ツールキット:
public static set <string> extraclinks(string url、linkfilterフィルター){set <string> links = new Hashset <String>(); try {parser parser = new Parser(url); parser.setencoding( "gb2312"); // <frame>タグのフィルターをフィルターして、フレームタグnodefilter framefilter = new nodefilter(){public boolean accept(node.getText()。 } else {return false; }}}}; //フィルタリング<a>タグを設定するOrfilter、および<frame>タグorfilter linkfilter = new orfilter(new nodeclassfilter(linktag.class)、framefilter); //すべてのフィルタリングされたタグを取得しますnodelist list = parser.extractallnodesthatmatch(linkfilter); for(int i = 0; i <list.size(); i ++){node tag = list.elementat(i); if(tag instanceof linktag)// <a> tag {linktag link =(linktag)tag; string linkurl = link.getlink(); // url if(filter.accept(linkurl))links.add(linkurl); } else // <frame> tag {// <frame src = "test.html"/> string frame = tag.getText()など、フレーム内のSRC属性へのリンクを抽出します。 int start = frame.indexof( "src ="); frame = frame.substring(start); int end = frame.indexof( ""); if(end == -1)end = frame.indexof( ">"); string frameurl = frame.substring(5、end -1); if(filter.accept(frameurl))links.add(frameurl); }}} catch(parserexception e){e.printstacktrace(); }リンクを返します。 }6.主にPagerankなどのアルゴリズムに適用するために、優先キューを備えたPriorityQueueを使用して、Visitedページが保存されます。一部のURLはより忠実です。訪問されたテーブルはハッシュセットを使用して実装され、存在するかどうかを迅速に見つけることに注意してください。
public class linkqueue {//アクセスされたURLコレクションプライベート静的セットvisitedurl = new Hashset(); //アクセスURLコレクションプライベート静的キューunvisitedurl = new PriorityQueue(); // url queueを取得しますpublic static queue getunvisitedurl(){return unvisitedurl; } //訪問されたurlに追加するpublic static void addvisitedurl(string url){visitedurl.add(url); } //アクセスしたURL public static void removisitedurl(string url){visitedurl.remove(url); } //未吸収のurlはキューから外れていますパブリックstaticオブジェクトunvisitedurldequeue(){return unvisitedurl.poll(); } //各URLに1回のみアクセスされることを確認しますpublic static void addunvisitedurl(string url){if(url!= null &&!url.trim()。 } // public static int getVisitedurlnum()にアクセスされたURLの数を取得します{return visiturl.size(); } // visited url queueが空であるかどうかを判断}}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。