1。要件と構成
要件:JD携帯電話検索ページの情報をクロールし、各携帯電話の名前、価格、コメントの数などを記録し、実際の分析に使用できるデータテーブルを形成します。
Maven Project、Log4Jログを使用して、ログはコンソールのみにエクスポートされます。
Mavenは次のように依存します(pom.xml)
<Dependencies> <Dependency> <GroupId> org.apache.httpComponents </groupId> <artifactid> httpclient </artifactid> <バージョン> 4.5.3 </version> </depence> <redency> < <artifactid> jsoup </artifactid> <bersion> 1.11.2 </version> </dependency> <! - https://mvnrepository.com/artifact/log4j/log4j-> <依存関係> <groupid> log4j </groupid> <artifactid> log4J </artifactid> </</</</> </依存関係>
log4j構成(log4j.properties)、出力情報、および上記のレベル情報コンソールには、出力ドキュメントを個別に設定しません。
log4j.rootlogger = info、console #console log4j.appender.console = org.apache.log4j.consoleappenderlog4j.appender.console.layout = org.apache.log4j.patternlayoutlog4j.appender.aptendole.layout.conversut.conversut.conversut.conversut.conversut. %m%n
2。要件分析とコード
2.1要件分析
最初のステップは、クライアントとサーバー間の接続を確立し、URLを介してWebページでHTMLコンテンツを取得することです。
2番目のステップは、HTMLコンテンツを解析し、必要な要素を取得することです。
3番目のステップは、HTMLコンテンツをローカルテキストドキュメントに出力することであり、他のデータ分析ソフトウェアを介して直接分析できます。
上記の分析によると、4つのクラスが確立されています。GethtML(WebサイトHTMLの取得に使用)、ParseHTML(HTMLの解析に使用)、Writeto(ドキュメントの出力に使用)、およびMainControl(制御に使用)。以下は4つのクラスです。コードを可能な限り簡潔にするために、すべての例外は、キャッチなしでメソッドから直接スローされます。
2.2コード
2.2.1Gethtmlクラス
このクラスには、2つの方法が含まれています。Geth(String URL)、URLControl(String Baseurl、int Page)。これは、WebページHTMLとコントロールURLの取得にそれぞれ使用されます。今回のWebページのコンテンツは、JD.comの特定のタイプの製品の検索結果にすぎないため、ページ上のすべてのURLを通過する必要はありません。ページをめくるときにURLの変更を観察し、ルールを導入する必要があります。 URLControlメソッドのみが外側にさらされ、クラスにプライベートログプロパティが設定されます。ログを記録するために使用されます。
Geth(String URL)、単一のURLのHTMLコンテンツを取得します。
urlcontrol(String Baseurl、int Page)は、ループを設定し、複数のページのデータにアクセスします。要素を確認することにより、JD.comの検索ページのページの変更は、実際には奇妙な順序で変更されていることがわかります。
クリック後にURLの変更を確認すると、実際の変更はページ属性の値であることがわかります。スプライシングすることで、次のWebページのアドレスを簡単に取得できます。
https://search.jd.com/search?keyword=%E6%89%8B%E6%9c%BA&cbu&enc = utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3 = 655&page = 3&s = 47&click=0
https://search.jd.com/search?keyword=%E6%89%8B%E6%9c%BA&cbu&enc = utf-8&qrst=1&rt=1&top=1&vt=2&cid2=653&cid3 = 655&page = 5&s =&click = 0
https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&cbu&enc = utf-8&qrst=1&rt=1&top=1&vt=2&cid2=653&cid3 = 655&page = 7&s = 162&click-= 0
全体的なコード:
java.io.ioexception; Import org.apache.http.httpentity; Import org.apache.http.client.clientProtocolexception; Import org.apache.http.client.methods.closeablehttpresponse; Import org.apache.http.client.methods.s.s.s.s.s.s.s.htpget; org.apache.http.impl.client.closeablehttpclient; Import org.apache.http.impl.client.httpclients; Import org.apache.http.utils; Import org.apache.log4j.logger; income class gethtml { /olgistml {///////// Chere logger.getLogger(gethtml.class); private static string geth(string url)は、clientprotocolexception、ioexception {//コンソール出力ログをスローします。 / * *次のコンテンツは、接続を確立するためのhttpClientの一般的な使用法です * httpclientを使用してクライアントを確立します *指定されたurlにアクセスするためにGETメソッドを使用します *対応 * */ closeablehttpclientクライアント= httpclients.createdefault(); httpget get = new httpget(url); closeablehttpresponse応答= client.execute(get); / * *次のコンテンツは、HTMLコンテンツを文字列に変換することです *応答ボディを取得します *応答ボディを文字列形式に変換します。ここでは、entitityUtilsのtoStringメソッドが使用され、エンコード形式はクライアントを閉じて完了後に返信します * */ httpentity entity = responsedity(文字列コンテンツ。 if(entity!= null){content = entityutils.toString(entity、 "utf-8"); client.close(); Response.Close();コンテンツを返す; } else nullを返します。 } public static void urlcontrol(string baseurl、int page)throws clientProtocolexception、ioexception {//現在のページcount int count = 1; //現在のページがクロールするページの数よりも少ない場合、(count <page){//実際にアクセスしたURLは、URL変更値u = baseurl +(2 * count -1) + "&click = 0"; //ここで、ParseHTMLクラスのメソッドを呼び出してURLのHTMLページを処理すると、クラス文字列content = parsehtml.parse(geth(u))。toString()を紹介します。 //ここで、Writetoクラスのメソッドを呼び出して、解析されたコンテンツをローカルに書き込みます。その後、クラスwriteto.writeto(content)を紹介します。 count ++; }}}2.2.2Parsehtmlクラス
この手順では、レビュー要素がrawいなければならないタグを決定し、JSOUPのCSSセレクターを介してそれらを取得する必要があります。
Import org.jsoup.jsoup; Import org.jsoup.nodes.document; Import org.jsoup.nodes.element; import org.jsoup.select.elements; public staringbuilder parse(String content){// document doc = jsoup.parse(content); // [選択]を選択して、見つける必要がある要素をつかみます。たとえば、最初の選択は、クラス属性がULタグ要素のGL-warp clearfixに等しいコンテンツですele = doc.select( "ul [class = gl-warp clearfix]")。select( "li [class = gl-item]"); //各属性stringbuilder sb = new StringBuilder()をインストールするには、コンテナを設定します。 //前のセレクターを使用して、ページ全体の要件を満たすすべての要素、つまり各電話を取得します。以下に、各電話を通過して(要素E:ELE)の属性を取得する必要があります{//ここでの各属性の取得は、インターネット上のJD.comの記事をクロールする記事を指します。他の異なるライティング方法があるはずです。文字列id = e.attr( "data-pid"); string mingzi = e.select( "div [class = p-name p-name-type-2]")。select( "a")。select( "em")。text(); string jiage = e.select( "div [class = p-price]")。select( "strong")。select( "i")。text(); string pinglun = e.select( "div [class = p-commit]")。select( "strong")。select( "a")。text(); //属性を追加するsb.append(id+"/t"); sb.append(mingzi+"/t"); sb.append(jiaage+"/t"); sb.append(pinglun+"/t"); sb.append(pinglun+"/t"); sb.append( "/r/n"); } sbを返します。 }}2.2.3Writetoクラス
このクラスのメソッドは、コンテンツをローカルファイルに書き込みます。単純なIO。
Import java.io.bufferedWriter; Import java.io.file; import java.io.filewriter; import java.io.ioexception; public class writeto {//ファイルストレージの場所を設定プライベート静的ファイルf = newファイル( "c://jingdong.txt"); public static void writeto(string content)throws ioexception {//連続書き込み方法を使用して、以前に書かれたコンテンツBufferedWriter bw = new bufferedwriter(new filewriter(f、true))を上書きしないようにします。 bw.append(content); bw.flush(); bw.close(); }}2.2.4mainControlクラス
メインコントロールプログラムは、ベースアドレスと取得するページ数を書きます。 GethtMLクラスのURLControlメソッドを呼び出して、ページをcraいます。
java.io.ioexception; Import org.apache.http.client.clientProtocolexception; public class maincontrol {public static void main(string [] args)throws clientprotocolexception、ioexception {// todo auto-generated method string baseurl = "https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&ENC=" + "&" utf-8&qrst = 1&rt = 1&stop = 1&vt = 2&cid2 = 653&cid3 = 655&page = "; int page = 5; //クロールページ番号を設定しますgethtml.urlcontrol(baseurl、page); }}3。クロール結果
20ページをクロールします。
3.1コンソール出力
3.2ドキュメント出力
Excelで直接開くことができ、区切り文字はタブ文字です。列は、それぞれ製品番号、名前、価格、およびコメントの数です。
4。概要
このクロールはHTTPCLIENTとJSOUPを使用しています。これは、単純なニーズのために、これらのツールが依然として非常に効率的であることを示しています。実際、すべてのクラスを1つのクラスに書き込むこともできます。複数のクラスを作成するというアイデアはより明確です。
上記の記事Java Crawlerは、JD.comのモバイル検索ページhttpclient+jsoupをクロールします。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。