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得到的文档的内容信息,观察发现知乎首页包含的所有链接有以下三种形式:超链接形式、以及的脚本,因此分别针对三种形式进行链接的提取。

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>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
        }

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

        print("Imports: (%d)", imports.size());
        for(Element imp : imports){
            print(" * %s <%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/

你可能感兴趣的:(Crawler,网络爬虫)