1。要件
最近、マテリアルデザインに基づいて自分のニュースアプリをリファクタリングしましたが、データのソースは問題です。
前任者は、Zhihu DailyやPhoenix NewsなどのAPIを分析し、対応するURLに基づいてニュースJSONデータを取得できます。コードライティングのスキルを行使するために、著者はニュースページをcraう、自分でデータを取得してAPIを構築することを計画しています。
2。効果画像
下の写真は元のウェブサイトのページです
クローラーはデータを取得し、アプリモバイル端末に表示しました
3。クローラーのアイデア
アプリの実装プロセスについては、これらの記事を参照できます。この記事では、主にデータをクロールする方法について説明します。
Androidでアプリ操作を録音するプロセス全体の動的な写真を生成するプロセス: //www.vevb.com/article/78236.htm
Android Material Design(ListViewの代わりにRecyclerview): //www.vevb.com/article/78232.htmを学びます
AndroidプロジェクトNetease Newsページの実用的な模倣(Recyclerview): //www.vevb.com/article/78230.htm
jsoupの紹介
JSoupは、JavaのオープンソースHTMLパーサーであり、特定のURLアドレスとHTMLテキストコンテンツを直接解析できます。
JSOUPには主に次の機能があります。
4。クロールプロセス
WebページHTMLを取得するためのリクエストを取得します
ニュースWebページHTMLのDOMツリーは次のとおりです。
次のコードは、コードを使用して、指定されたURLに基づいてGETリクエストによって返されるHTMLソースコードを取得します。
public static string doget(string urlstr)commonexception {url url;文字列html = ""; try {url = new url(urlstr); httpurlconnection connection =(httpurlconnection)url.openconnection(); connection.setRequestMethod( "get"); connection.setConnectTimeout(5000); connection.setDoinput(true); connection.setDoOutput(true); if(connection.getResponseCode()== 200){inputStream in = connection.getInputStream(); html = streamtool.intostringbybyte(in); } else {throw new commonexception( "News Server Return Value Is Not Not 200"); }} catch(例外e){e.printstacktrace();新しいcommonexception( "get request Failed"); } return html;}inputstream in = connection.getInputStream();結果の入力ストリームを文字列に変換することは、一般的な要件です。それを抽象化して、ツール方法を書きます。
パブリッククラスStreamTool {public static String intostringByte(inputstream in)throws Exception {bytearrayoutputStream outstr = new bytearrayoutputStream(); byte [] buffer = new byte [1024]; int len = 0; stringbuilder content = new StringBuilder(); while((len = in.read(buffer))!= -1){content.append(new String(buffer、0、len、 "utf -8")); } outstr.close(); return content.toString(); }}5。タイトルを取得するためにHTMLを解析します
Googleブラウザの検閲要素を使用して、ニュースタイトルのHTMLコードを見つけます。
<div id = "article_title"> <h1> <a href = "http://see.xidian.edu.cn/html/news/7428.html">「クラシック音楽の作品と人道的美学の評価」に関する講義についての通知
上記のHTMLからid = "article_title"の部分を見つける必要があります。
string htmlstr = httptool.doget(urlstr); //取得したhtmlソースコードをdocumentdocument doc = jsoup.parse(htmlstr); element articleele = doc.getelementbyid( "article"); // title element elementele = geterelemenemementbyid(articleele.getelementbyid( "artionele.getelementle"; pittatele.text();
6.リリース日と情報源を取得します
HTMLコードもご覧ください
<html> <head> </head> <body> <div id = "article_detail"> <span> 2015-05-28 </span> <span>出典:</span> <span>ビュー数:<スクリプト言語= "javascript" src = "http://see.xidian.edu.cn/ind.php/"> new.click/icks.php/id/ </script> 477 </span> </div> </body> </html>
アイデアは上記に似ています。 getElementByID(String ID)メソッドを使用して、id = "article_detail"が要素であることを確認し、getElementsBytagを使用してスパンパーツを取得します。合計で3 <span> ... </span>があるため、要素の代わりに要素が返されます。
// article_detailに2016-01-15を含む出典:ビュー:177Element datueleele = articleele.getelementbyid( "article_detail");要素details = detaileele.getelementsbytag( "span");
7。分析の回数
上記の詳細を印刷すると、get(2).text()を印刷すると、取得するだけです
ビュー数:
ビューはありませんか?なぜ?
ビューの数はJavaScriptによってレンダリングされているため、JSoup CrawlerはHTMLコンテンツのみを抽出し、動的にレンダリングされたデータを取得できません。
2つの解決策があります
上記のurlhttp://see.xidian.edu.cn/index.php/news/click/id/7428にアクセスすると、次の結果が得られます
document.write(478)
この478は、必要なビューの数です。上記のURLをGETリクエストを行い、返された文字列を取得し、通常の文字列を使用してその中の数字を見つけます。
//このニュースページにアクセスすると、ビューの数は+1になり、回数はJS JSSTR = httptool.doget(count_base_url + currentPage)によってレンダリングされた文字列です。 int readtimes = integer.parseint(jsstr.replaceall( "// d+"、 "")); // // string readtimesstr = jsstr.replaceall( "[^0-9]"、 "");
8。ニュースコンテンツを分析します
もともとは、プレーンテキストでニュースコンテンツを取得する形式でしたが、後にAndroid側もCSS形式を表示できることがわかったため、コンテンツは後でHTML形式で保持されました。
要素contentele = articleele.getelementbyid( "article_content"); //ニュースボディコンテンツ文字列contentstr = contentele.tostring(); //テキスト()メソッドが使用されている場合、htmlを使用するためにニュースボディコンテンツのhtmlタグが失われます。
9.画像URLを分析します
Webページには多くの大小の写真があることに注意してください。ニューステキストのコンテンツのみを取得するために、最初にニュースコンテンツの要素を見つけてから、getElementsBytag( "IMG")を使用して写真を除外することをお勧めします。
要素contentele = articleele.getelementbyid( "article_content"); //ニュースボディコンテンツ文字列contentstr = contentele.tostring(); //テキスト()メソッドが使用されている場合、htmlを使用するためにニュースボディコンテンツのhtmlタグが失われます。 contentele.getElementsBytag( "img"); string [] imageurls = new string [mages.size()];
10。ニュースエンティティJavabean
上記は、ニュースのタイトル、リリース日、読み取り数、ニュースコンテンツなどを取得することです。当然、Javabeanを構築し、取得したコンテンツをエンティティクラスにカプセル化する必要があります。
public class artureItem {private int index;プライベート文字列[] ImageUrls;プライベートストリングタイトル。 Private String PublishDate;プライベートストリングソース;プライベートint docttimes;プライベートストリングボディ; public artureItem(int index、string [] imageurls、string title、string publishdate、string source、int readtimes、string body){this.index = index; this.imageurls = imageurls; this.title = title; this.publishdate = publishdate; this.source = source; this.readtimes = readtimes; this.body = body; } @Override public String toString(){return "articleItem [index =" + index + "、/n imageurls =" + arrays.toString(imageurls) + "、/n、publishdate =" + publishdate + "、/n source =" + source + "、/n readtimes +"、/n body + " }}テスト
public static articationItem getNewSitem(int currentPage)はcommonexceptionをスローします{//接尾辞番号に従って、news url string urlstr = article_base_url + currentPage + ".html"をスプライスします。文字列htmlstr = httptool.doget(urlstr); document doc = jsoup.parse(htmlstr);要素articlele = doc.getElementById( "article"); //タイトル要素ittitlele = articleele.getelementbyid( "article_title"); string titlestr = titlele.text(); // article_detailに2016-01-15を含む出典:ビュー:177 Element datureeele = articleele.getElementbyId( "article_detail");要素の詳細= detaileele.getElementsBytag( "span"); //リリース時間文字列dateStr = details.get(0).text(); //ニュースソース文字列sourcestr = details.get(1).text(); //このニュースページにアクセスすると、ビューの数は+1です。これはJSによってレンダリングされる回数です。 jsstr = httptool.doget(count_base_url + currentPage); int readtimes = integer.parseint(jsstr.replaceall( "// d+"、 "")); //次の通常の方法を使用します//文字列readtimesstr = jsstr.replaceall( "[^0-9]"、 "");要素contentele = articleele.getElementbyid( "article_content"); //ニュースボディコンテンツ文字列contentstr = contentele.toString(); //テキスト()メソッドを使用する場合、AndroidでWebViewを使用してHTMLを表示するために、ニュースボディコンテンツのHTMLタグが失われます。要素画像= contentele.getElementsBytag( "img"); string [] imageurls = new String [Images.size()]; for(int i = 0; i <imageurls.length; i ++){imageurls [i] = images.get(i).attr( "src"); } return new articationItem(currentPage、ImageUrls、Titlestr、datestr、sourcestr、readtimes、contentstr);} public static void main(string [] args)throws commonexception {system.out.println(getNewSitem(7928));}出力情報
artureItem [index = 7928、imageurls = [/uploads/image/20160114/20160114225911_34428.png]、タイトル=電気工学学校は、「冬のキャンパス全体で整合する花を咲かせます」教育アクティビティ、パブリッシュデート= 2016-01-14、ソース= < id = "article_content"> <p style = "text-indent:2em;" align = "justify"> <strong> <span style = "font-size:16px; line-height:1.5;"> xidian news network </span> </strong> <span style = "font-size:16px; line-height:1.5;">(comradespersons </span> <strong> <stry = "16px; line-height:1.5; dan </span> </strong> <span style = "font-size:16px; line-height:1.5;"> ...)
この記事では、JSOUP Web Crawlerの実装方法について説明します。記事があなたに役立つなら、私に親指をあげてください。