Java爬虫類シリーズの二ページ解析【爬取知乎トップページ情報】


前節では小さなDemoでJavaの爬虫類の旅を開始し,HttpClientリクエストリソースに慣れて戻り結果を得,初歩的な処理の結果を得た.しかし、得られたページはどのように解析されているのでしょうか.ここではJsoupの使用について議論します.
        JsoupはJavaのHTML解析器で、非常に省力的なAPIを提供し、URL、ファイル、文字列からHTMLを簡単に解析し、DOMまたはSelectを使用してページ要素を選択し、データを取り出すことができます.次のようになります.
String html = "First parse"
  + "

Parsed HTML into a doc.

"; Document doc = Jsoup.parse(html);
Document doc = Jsoup.connect("http://www.zhihu.com").get(); //    

        以上の方法でHTMLドキュメントを解析し、DOMメソッドを使用してドキュメントを巡回できます.
または、セレクタを使用して要素を検索することもできます.
.以下では、トップページのすべてのリンクを取得する例として、小さなプレゼンテーションを行います.
        Documentを印刷することで解析TMLで得られた文書の内容情報を見ることができ,トップページに含まれるすべてのリンクには,ハイパーリンク形式、およびスクリプトなので、それぞれ3つの形式に対してリンクの抽出を行います。の3つの形式があることが分かった.
import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

/**
 *             (            )
 */

public class GetPageLinks {
    public static void main(String[] args) throws IOException {
        Validate.isTrue(args.length == 1, "Usage: supply url to fetch");
        String url = args[0];
        System.out.println("Fetching ..." + url);

        Document document = Jsoup.connect(url).get();
//        System.out.println(document);//  HTML      

        Elements links = document.select("a[href]");
//        System.out.println(links);  //  a[href]  

        Elements medias = document.select("[src]");
//        System.out.println(medias);  //    、       src    

        Elements imports = document.select("link[href]");
//        System.out.println(imports); 

        print("Links: (%d)", links.size());
        for(Element link : links){
            print(" * a:   (%s)", link.attr("abs:href"), trim(link.text(), 35));
        }

        print("Medias: (%d)", medias.size());
        for(Element media : medias){
             print(" * %s: ", media.tagName(), media.attr("abs:src"));
        }

        print("Imports: (%d)", imports.size());
        for(Element imp : imports){
            print(" * %s  (%s)", imp.tagName(),imp.attr("abs:href"), imp.attr("rel"));
        }
    }

    private static void print(String msg, Object... args){
        System.out.println(String.format(msg, args));
    }

    private static String trim(String str, int width){
        if(str.length() > width)
            return str.substring(0, width+1) + ".";
        else return str;
    }
}

結果は次のとおりです.
Fetching ...http://www.zhihu.com
Links: (21)
 * a:   (  )
 * a:   (  )
 * a:   (    ?)
 * a:   ()
 * a:   ()
 * a:   ()
 * a:   (   App)
 * a:   (《    》)
 * a:   (    )
 * a:   (    )
 * a:   (  )
 * a:   (    )
 * a:   (        )
 * a:   (    )
 * a:   (     )
 * a:   (  ICP   110745  )
 * a:   (        )
 * a:   (    )
 * a:   (          )
 * a:   (          )
 * a:   ()
Medias: (7)
 * script: 
 * img: 
 * img: 
 * script: 
 * script: 
 * script: 
 * script: 
Imports: (14)
 * link  (apple-touch-icon)
 * link  (apple-touch-icon)
 * link  (apple-touch-icon)
 * link  (apple-touch-icon)
 * link  (shortcut icon)
 * link  (dns-prefetch)
 * link  (dns-prefetch)
 * link  (dns-prefetch)
 * link  (dns-prefetch)
 * link  (dns-prefetch)
 * link  (dns-prefetch)
 * link  (dns-prefetch)
 * link  (stylesheet)
 * link  (canonical)

参考資料:
1、Jsoup中国語ガイドhttp://www.open-open.com/jsoup/