ターゲットWebサイトへのリンクに基づいて、この記事はさらに難易度を高め、ターゲットページで必要なコンテンツをキャプチャし、データベースに保存します。ここのテストケースでは、私がよく使用する映画のダウンロードWebサイト(http://www.80s.la/)を使用しています。私はもともと、ウェブサイトのすべての映画のダウンロードリンクをクロールしたかったのですが、後で私はそれが長すぎると感じたので、2015年の映画のダウンロードリンクをクロールするためにそれを変更しました。
最初の原則の紹介
実際、原則は最初の記事に似ています。違いは、このWebサイトに分類リストが多すぎるため、これらのタグが選択されていない場合は想像を絶することです。
カテゴリリンクやタグリンクを使用する必要はありません。これらのリンクを使用して他のページをクロールしません。ページの下部にあるあらゆる種類の映画のページネーションを通じて、他のページの映画リストを取得できます。同時に、映画の詳細ページでは、映画のタイトルとサンダーダウンロードリンクのみをクロールし、奥深くにcraいないようにします。詳細ページには、推奨される映画やその他のリンクは必要ありません。
最後に、VideoLinkMapコレクションで入手したすべての映画のダウンロードリンクを保存し、このコレクションを横断することによりMySQLのデータを保存します。
2コードの実装
実装の原則は上記で言及されており、コードには詳細なコメントがあるので、ここでは説明しません。コードは次のとおりです。
パッケージアクション; java.io.bufferedReader; Import java.io.ioexception; Import java.io.inputStream; Impont java.io.inputStreamReader; Import java.net.httpurlconnection; Import java.net.malformedexception; Import java.net.net.net.net.url.r.url. java.sql.preparedStatement; Import java.sql.sqlexception; Import java.util.linkedhashmap; import java.util.map; Import java.util.regex.matcher; Import java.util.regex.pattern; public class videolinkgrab {public static void main(string [] args){videolinkgrab videolinkgrab = new videolinkgrab(); videolinkgrab.savedata( "http://www.80s.la/movie/list/-2015---- p"); } / ** *データベースに取得したデータを保存 * * * @param baseurl * crawlerの出発点 * @return null * * / public void savedata(string baseurl){map <string、boolean> oldmap = new linkedhashmap <string、boolean>(); //リンクを保存 - マップで通過します//ビデオダウンロードリンク文字列oldlinkhost = ""; //ホストパターンp = pattern.compile( "(https?://)?[^/// s]*"); //例:http://www.zifangky.cn matcher m = p.matcher(baseurl); if(m.find()){oldlinkhost = m.group(); } oldmap.put(baseurl、false); videolinkmap = crawllinks(oldlinkhost、oldmap); //データベースでデータをトラバースして保存してくださいtry {connection connection = jdbcdemo.getConnection(); for(map.entry <string、string> mapping:videolinkmap.entryset()){preated -statement pstatement = connection .preparestatement( "inserting into into ingove(moviename、movielink)values(?、?)"); pstatement.setString(1、mapping.getKey()); pstatement.setString(2、mapping.getValue()); pstatement.executeUpdate(); pstatement.close(); // system.out.println(mapping.getKey() + ":" + mapping.getValue()); } connection.close(); } catch(sqlexception e){e.printstacktrace(); }} /*** WebサイトでクロールできるすべてのWebページリンクをクロールします。このアイデアでは、幅の優先度アルゴリズムを使用して、移動されていない新しいリンクのGETリクエストを継続的に開始します。完全なセットが通過するまで、新しいリンクは見つかりません*。つまり、新しいリンクが見つかりません。タスクは終了 * *リンクをリクエストするときに、Webページに必要なビデオリンクを定期的に検索し、コレクションVideolinkMap * * @Param OldLinkHost *ドメイン名、http://www.zifangsky.cn * @param oldmap * @param oldmap * collect collectsed */retturn return relink */pristurnリンクコレクションを使用します。 crawllinks(String OldLinkHost、Map <String、Boolean> OldMap){Map <String、boolean> newMap = new LinkedHashmap <String、boolean>(); //各ループマップから取得した新しいリンク<文字列、文字列> videolinkmap = new linkedhashmap <string、string>(); //ビデオダウンロードリンク文字列oldlink = ""; for(map.entry <string、boolean>マッピング:oldmap.entryset()){// System.out.println( "link:" + mapping.getKey() + "---------チェック:" // + mapping.getValue(); //(!mapping.getValue()){oldlink = mapping.getKey(); // get requestを開始してください{url url = new url(oldlink); httpurlconnection connection =(httpurlconnection)url .openconnection(); connection.setRequestMethod( "get"); connection.setConnectTimeout(2500); connection.setreadTimeout(2500); if(connection.getResponseCode()== 200){inputstream inputstream = connection.getInputStream(); BufferedReader Reader = new BufferedReader(new inputstreamReader(inputStream、 "utf-8"));文字列line = "";パターンパターン= null; Matcher matcher = null; //映画の詳細ページ、ビデオのダウンロードリンクを取り出して、他のページを詳細にクロールし続けないでください。文字列タイトル= ""; while((line = reader.readline())!= null){//ページのビデオタイトルを取得if(!checktitle){pattern = pattern.compile( "([^// s]+)。*?</title>"); matcher = pattern.matcher(line); if(matcher.find()){title = matcher.group(1); checktitle = true;続く; }} //ページパターンのビデオダウンロードリンクを削除= pattern .compile( "(thunder:[^/"]+)。 matcher = pattern.matcher(line); if(matcher.find()){videolinkmap.put(title、matcher.group(1)); System.out.println( "ビデオ名:" + title + "------ビデオリンク:" + matcher.group(1));壊す; //現在のページが検出されました}}}} //映画リストページelse if(checkurl(oldlink)){while((line = reader.readline())!= null){pattern = compile( "<a href =/"([^/"// s]*)/") matcher.group(1).trim(); (newlink.endswith( "/"))newlink.substring(0、newlink.length() - 1); system.println( + newlink); } try {thread.sleep(1000); } catch(arturnedexception e){e.printstacktrace(); } oldmap.replace(oldlink、false、true); }} //新しいリンクがあります。(!newmap.isempty()){oldmap.putall(newmap); videolinkmap.putall(crawllinks(oldlinkhost、oldmap)); // MAPの特性のため、キーと値のペアの重複は発生しません} VideoLinkMapを返します。 }/** *それが2015年の映画リストページであるかどうかを判断 * @param url url checked * @return status * */public boolean checkurl(string url){pattern pattern = pattern.compile( "http://www.80s.la/movie/list/-2015---------/d*"); matcher matcher = pattern.matcher(url); if(matcher.find())trueを返します。 // 2015リストelseはfalseを返します。 }/** *ページが映画の詳細であるかどうかを判断 * @param urlページリンク * @return status * */public boolean ismoviepage(string url){pattern pattern = pattern.compile( "http://www.80s.la/movie//d+"); matcher matcher = pattern.matcher(url); if(matcher.find())trueを返します。 //ムービーページではfalseを返します。 }}注:他のWebサイトから指定されたコンテンツをクロールする場合は、実際の状況に従って正規表現の一部を合理的に変更する必要があります。
3つのテスト結果
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。