1. 程式人生 > >jsoup編寫java爬蟲

jsoup編寫java爬蟲

    jsoup是一款簡潔輕便的java網路爬蟲庫,因為它的API與DOM物件操作直接掛鉤,所以收到了廣泛的歡迎,下面來講解如何爬取京東上的圖書。
    因為我是採用的gradle框架來完成整合的,所以可以直接新增jsoup的依賴:

 compile('org.jsoup:jsoup:1.10.2')

    如果您不使用gradle框架,可以下載jsoup.jar檔案。點選下載jar檔案,在下載完成後,將上面的 jsoup.jar 新增到專案類庫中便可以了。我們定義一個Book類來存放對應的資料:

public class Book {
    private String id;
    private String name;
    private String price;
    public Book(){

    }
    public Book(String id, String name, String price){
        this.id=id;
        this.name=name;
        this.price=price;
    }
    public String getId() {
        return id;
} public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this
.price = price; } public String toString(){ return "["+id+"="+id+" name="+name+" price="+price+"]"; } }

    找到自己需要爬去的網址,這裡使用京東的書城來講解:https://search.jd.com/Search?keyword=redis&enc=utf-8&qrst=1&rt=1&stop=1&book=y&vt=2&wq=redis&page=3&s=178&click=0
在這裡插入圖片描述

    對其網頁原始碼分析可知,書所在的位置是一個ul列表,我們只需要利用jsoup將ul列表中的資料拿出來就可以了,程式碼如下:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String args[]) throws IOException {
        List<Book> list=new ArrayList<>();
        String url="https://search.jd.com/Search?keyword=redis&enc=utf-8&qrst=1&rt=1&stop=1&book=y&vt=2&wq=redis&page=1&s=178&click=0";
        //取得dom物件
        Document doc = Jsoup.connect(url).get();
        int count=0;
        while (doc!=null){
            doc = Jsoup.connect(url).get();
            //獲取解析其元素
            Elements elements=doc.select("ul[class=gl-warp clearfix]").select("li[class=gl-item]");
            for (Element ele:elements) {
                String bookID=ele.attr("data-sku");
                String bookPrice=ele.select("div[class=p-price]").select("strong").select("i").text();
                String bookName=ele.select("div[class=p-name]").select("em").text();
                Book book=new Book();
                book.setId(bookID);
                book.setName(bookName);
                book.setPrice(bookPrice);
                list.add(book);
            }
            for (Book model:list) {
                count++;
                System.out.print(model);
                System.out.println("                        "+count);
            }
            url=replace(url);
        }
    }

    public static String replace(String s){
        int index=s.indexOf("page");
        int page=s.charAt(index+5)-48+2;
        String s1=s.substring(0,index+5);
        String s2=s.substring(index+6,s.length());
        return s1+page+s2;
    }
}

    利用page屬性的不同來遍歷抓取京東上的書,將其加入list列表中。