1. 程式人生 > >Java資料採集--2.使用Jsoup抓取開源中國

Java資料採集--2.使用Jsoup抓取開源中國

本節使用Jsoup獲取網頁原始碼,並且解析資料。
使用JSoup 解析網頁,語法使用 JS,css,Jquery 選擇器語法,方便易懂
抓取網站:http://www.oschina.net/news/list 開源中國-新聞資訊模組
基本工作:
1.建立好Java工程,包等基本工作。
2.匯入Jsoup所依賴的jar包。官網下載地址如下:
http://jsoup.org/packages/jsoup-1.8.1.jar
3.建立JsoupDemo類。(類名自己隨意,java基礎,沒必要多說吧)
核心內容
1.在main函式中使用Jsoup獲取網頁原始碼
String url = "http://www.oschina.net/news/list";
Document document = Jsoup.connect(url)
.userAgent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0")
.get();


此段程式碼意思為使用Jsoup連結url地址,並且返回封裝該網頁的html原始碼的Document樹,userAgent為模擬瀏覽器頭,get為使用get方式提交,關於connect的引數還有很多,請自行檢視API學習。
2.分析網頁原始碼
在目標網頁上點選右鍵,火狐有使用FireBug檢視元素,谷歌有審查元素,然後可以看到相應的原始碼和網頁的對應情況。如下圖(以後都以谷歌瀏覽器為例):
這裡寫圖片描述
可以看到我們所需要的資料都在id="RecentNewsList "的div下的class="List"的ul下,並且每一條都對應一個li標籤,那麼我們只需要找到class=”List”的ul,並且遍歷它的li標籤就可以獲取到所有的資訊的原始碼。程式碼如下:

Elements elements = document.select("#RecentNewsList .List > li");

這裡說一下常用的選擇器:
**#RecentNewsList 代表選擇id="RecentNewsList "的標籤 #為id選擇器
.List 代表選擇class="List"的標籤 .為class選擇器
li 表示li標籤
‘>’ 只能選擇子標籤,直接為父元素後代的直系子元素,比如兒子,孫子關係,只能選擇兒子。下一級的。**
select中可以寫多個,注意使用空格隔開,也可以連續使用select。
3.遍歷操作元素集(Elements)

for (Element element : elements) {
            Elements titleElement = element.select("h2 a");
            String title = titleElement.text();
            String link = titleElement.attr("href").trim();

            Elements dataElement = element.select(".date");
            Elements autherElement = dataElement.select("a");
            String auther = autherElement.text();
            autherElement.remove();
            String date = dataElement.text();
            String detail = element.select(".detail").text();

            System.out.println("連結:        " + "http://www.oschina.net"+link);
            System.out.println("標題:        " + title);
            System.out.println("作者:        " + auther);
            System.out.println("釋出時間: " + date);
            System.out.println("詳細資訊: " + detail);
            System.out.println();
            System.out.println();

        }

程式執行結果如下:
這裡寫圖片描述
也可以輸出元素集的長度System.out.println(elements.size());

完整程式碼如下:

package demo;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 
 * 使用JSoup 解析網頁,語法使用 JS,css,Jquery 選擇器語法,方便易懂
 * 
 * Jsoup教程網:http://www.open-open.com/jsoup/
 * 
 * @author geekfly
 * 
 */
public class JsoupDemo {

    public static void main(String[] args) throws IOException {
        String url = "http://www.oschina.net/news/list";
        Document document = Jsoup.connect(url)
                .userAgent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0")
                .get();
        Elements elements = document.select("#RecentNewsList .List > li");
        for (Element element : elements) {
            Elements titleElement = element.select("h2 a");
            String title = titleElement.text();
            String link = titleElement.attr("href").trim();

            Elements dataElement = element.select(".date");
            Elements autherElement = dataElement.select("a");
            String auther = autherElement.text();
            autherElement.remove();
            String date = dataElement.text();
            String detail = element.select(".detail").text();

            System.out.println("連結:        " + "http://www.oschina.net"+link);
            System.out.println("標題:        " + title);
            System.out.println("作者:        " + auther);
            System.out.println("釋出時間: " + date);
            System.out.println("詳細資訊: " + detail);
            System.out.println();
            System.out.println();

        }

        System.out.println(elements.size());

    }
}