App下載

如何使用java爬取豆瓣top250書籍案例

偷得浮生 2023-07-09 09:30:00 瀏覽數(shù) (1762)
反饋

你是否想過用java編程來獲取豆瓣上的圖書信息呢?如果你對(duì)這個(gè)話題感興趣,那么本文就是為你準(zhǔn)備的。本文將介紹如何使用java爬取豆瓣top250書籍的案例,包括爬蟲的原理、步驟和代碼。希望通過本文,你能夠?qū)W習(xí)到一些有用的技巧和知識(shí),以及對(duì)java爬蟲有一個(gè)更深入的了解。

爬蟲的原理

爬蟲,也叫網(wǎng)絡(luò)爬蟲或網(wǎng)頁抓取,是一種自動(dòng)從互聯(lián)網(wǎng)上獲取數(shù)據(jù)的程序。爬蟲的基本工作流程如下:

  1. 首先,爬蟲需要一個(gè)起始的URL,也就是要爬取的網(wǎng)頁的地址。例如,我們要爬取豆瓣top250書籍的網(wǎng)頁,那么起始的URL就是https://book.douban.com/top250。
  2. 然后,爬蟲會(huì)發(fā)送一個(gè)HTTP請(qǐng)求到起始的URL,獲取網(wǎng)頁的源代碼。源代碼是網(wǎng)頁的基本組成部分,包含了網(wǎng)頁的內(nèi)容、結(jié)構(gòu)和樣式等信息。
  3. 接著,爬蟲會(huì)解析網(wǎng)頁的源代碼,提取出我們感興趣的數(shù)據(jù)。例如,我們要提取豆瓣top250書籍的標(biāo)題、作者、評(píng)分和簡(jiǎn)介等信息。
  4. 最后,爬蟲會(huì)將提取出的數(shù)據(jù)存儲(chǔ)到本地或者數(shù)據(jù)庫中,以便后續(xù)的分析和使用。

爬蟲的步驟

為了實(shí)現(xiàn)用java爬取豆瓣top250書籍的案例,我們需要完成以下幾個(gè)步驟:

  1. 創(chuàng)建一個(gè)java項(xiàng)目,并導(dǎo)入相關(guān)的依賴庫。我們需要用到j(luò)soup和json兩個(gè)庫,分別用于解析HTML和JSON格式的數(shù)據(jù)。
  2. 編寫一個(gè)Book類,用于封裝書籍的屬性和方法。我們需要定義書籍的標(biāo)題、作者、評(píng)分、簡(jiǎn)介等屬性,以及一個(gè)構(gòu)造方法和一個(gè)toString方法。
  3. 編寫一個(gè)Spider類,用于實(shí)現(xiàn)爬蟲的邏輯。我們需要定義一個(gè)常量URL,表示要爬取的網(wǎng)頁地址。然后,我們需要定義一個(gè)getBooks方法,用于獲取所有書籍的列表。在這個(gè)方法中,我們需要做以下幾件事:
    • 使用jsoup連接到URL,并獲取網(wǎng)頁的文檔對(duì)象。
    • 使用jsoup選擇器選擇所有包含書籍信息的元素,并遍歷它們。
    • 對(duì)于每個(gè)元素,使用jsoup選擇器提取出書籍的標(biāo)題、作者、評(píng)分和簡(jiǎn)介等信息,并創(chuàng)建一個(gè)Book對(duì)象。
    • 將Book對(duì)象添加到一個(gè)ArrayList中,并返回這個(gè)列表。
  4. 編寫一個(gè)Main類,用于測(cè)試爬蟲的效果。我們需要?jiǎng)?chuàng)建一個(gè)Spider對(duì)象,并調(diào)用它的getBooks方法。然后,我們需要遍歷返回的書籍列表,并打印出每本書籍的信息。

爬蟲的代碼

下面是用java爬取豆瓣top250書籍案例的完整代碼:

Spider類:

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;


public class Spider {


    // 要爬取的網(wǎng)頁地址
    public static final String URL = "https://book.douban.com/top250";


    // 獲取所有書籍的列表
    public ArrayList<Book> getBooks() {
        ArrayList<Book> books = new ArrayList<>();
        try {
            // 連接到URL,并獲取網(wǎng)頁的文檔對(duì)象
            Document doc = Jsoup.connect(URL).get();
            // 選擇所有包含書籍信息的元素
            Elements elements = doc.select("div.article > div.indent > table");
            // 遍歷每個(gè)元素
            for (Element element : elements) {
                // 提取書籍的標(biāo)題
                String title = element.select("div.pl2 > a").attr("title");
                // 提取書籍的作者
                String author = element.select("p.pl").text().split("/")[0];
                // 提取書籍的評(píng)分
                String rating = element.select("span.rating_nums").text();
                // 提取書籍的簡(jiǎn)介
                String summary = element.select("span.inq").text();
                // 創(chuàng)建一個(gè)Book對(duì)象
                Book book = new Book(title, author, rating, summary);
                // 將Book對(duì)象添加到列表中
                books.add(book);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return books;
    }
}

Book類:

public class Book {


    // 書籍的屬性
    private String title; // 標(biāo)題
    private String author; // 作者
    private String rating; // 評(píng)分
    private String summary; // 簡(jiǎn)介


    // 書籍的構(gòu)造方法
    public Book(String title, String author, String rating, String summary) {
        this.title = title;
        this.author = author;
        this.rating = rating;
        this.summary = summary;
    }


    // 書籍的toString方法,用于打印書籍的信息
    @Override
    public String toString() {
        return "Book{" +
                "title='" + title + '\'' +
                ", author='" + author + '\'' +
                ", rating='" + rating + '\'' +
                ", summary='" + summary + '\'' +
                '}';
    }
}

驅(qū)動(dòng)程序:

public class Main {


    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)Spider對(duì)象
        Spider spider = new Spider();
        // 調(diào)用Spider對(duì)象的getBooks方法,獲取所有書籍的列表
        ArrayList<Book> books = spider.getBooks();
        // 遍歷書籍列表,并打印每本書籍的信息
        for (Book book : books) {
            System.out.println(book);
        }
    }
}

0 人點(diǎn)贊