java爬取豆瓣書籍資訊

Mr_初晨發表於2019-01-03
Hello大家好,本章學習如何爬取豆瓣書籍資訊。有問題可以聯絡我mr_beany@163.com。另求各路大神指點,感謝

前幾天(其實是好久之前)答應大家寫一篇關於爬蟲的文章,沒印象的可以看一下這篇文章,防止XSS攻擊,沒想到一拖就到了19年,先給大家拜個早年,祝大家年終獎大大的有(微笑臉?)

正巧近幾天手裡有一個小型圖書管理系統,其中有匯入書籍基本資訊一項,我這麼懶的人怎麼可能去網上查然後複製貼上錄入系統呢!於是,這篇文章就誕生了(其實我是為了廣大爬蟲小白簡單介紹一下啦,你們懂的!)

好了,廢話不多說,我們直接開始吧!

一:引入Jsoup依賴

<dependency>
   <groupId>org.jsoup</groupId>
   <artifactId>jsoup</artifactId>
   <version>1.10.2</version>
</dependency>複製程式碼
 jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文字內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jS的操作方法來取出和運算元據。

二:確立目標

新的一年,我一定要不間斷寫文章,堅持更新技術,繼續找物件,繼續尋找不脫髮方案.......

不好意思,走錯片場了。首先我們需要確定我們需要爬取哪些書籍資訊(定好目標好下手啊)

開啟豆瓣讀書,搜尋《明朝那些事》,嗯....隨意,其他的也可以,類別選擇書籍,我們可以看到如下頁面

java爬取豆瓣書籍資訊

點選第一個吧,可以看到如下書籍資訊

java爬取豆瓣書籍資訊

好,我們鎖定目標,我們需要抓取書籍的封面圖片,作者,豆瓣評分,內容介紹(夠了,這幾樣掌握了其他的可以舉一反三)

三:頁面分析

該步驟為爬蟲最重要的一步,通過分析網頁佈局DOM來判斷我們需要的資料所在的DOM。

java爬取豆瓣書籍資訊

通過瀏覽器,我們可以非常清楚的發現整個DOM渲染的層級關係。

其中Url為我們的搜尋路徑,那麼我們的搜尋路徑就可以是:

https://www.douban.com/search?cat=1001&q=書籍名稱複製程式碼

通過點選書籍名稱,發現跳轉到書籍詳情頁,檢查DOM,可以發現如下結構

java爬取豆瓣書籍資訊

好,基本思路確認,我們接下來開始程式設計工作。

四:編碼

建立CrawlerDoubanUtils.java

public static String getSearchUrl(String bookName){
    return "https://www.douban.com/search?cat=1001&q="+bookName;
}

/**
 * 根據書名獲取搜尋結果頁dom
 * @param url  請求路徑
 * @return
 */
public static Document getDom(String url){
    try{
        //獲取頁面元素dom  其中.get()為發起get請求
        Document doc = Jsoup.connect(url).get();
        return doc;
    }catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

/**
 * 獲取具體某個書籍的跳轉路徑
 * @param doc 頁面dom
 * @param index 取書籍資訊序號
 * @return
 */
public static String getBookItemUrl(Document doc,int index){
    //根據class來獲取元素  .get為獲取第幾個dom
    Element element = doc.getElementsByClass("result").get(index);
    //.first()為獲取第一個dom
    Element element1 = element.getElementsByClass("title").first();
    //.getElementsByTag()為根據標籤來獲取dom
    Element element2 = element1.getElementsByTag("a").first();
    //.attr()獲取標籤中某個屬性的值
    return element2.attr("href");
}

public static void main(String[] args){
    String url = getSearchUrl("明朝那些事");
    Document doc = getDom(url);
    System.out.println(getBookItemUrl(doc,0));
}複製程式碼

以下為輸出結果:

https://www.douban.com/link2/?url=https%3A%2F%2Fbook.douban.com%2Fsubject%2F1873231%2F&query=%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B&cat_id=1001&type=search&pos=1 複製程式碼

根據地址開啟瀏覽器,頁面成功跳轉到書籍詳情頁,但是我們發現url地址發生了重定向,所以我們需要拿到重定向之後的地址。

public static String getUrl(String str){
    String realUrl = "";
    try {
        URL url = new URL(str);
        HttpURLConnection conn=(HttpURLConnection)url.openConnection();
        conn.getResponseCode();
        realUrl=conn.getURL().toString();
        conn.disconnect();
    }catch (Exception e){
        e.printStackTrace();;
    }
    return realUrl;
}複製程式碼
public static void main(String[] args){
    String url = getSearchUrl("明朝那些事");
    Document doc = getDom(url);
    System.out.println(getUrl(getBookItemUrl(doc,0)));
}複製程式碼

輸出結果為:

https://book.douban.com/subject/1873231/複製程式碼

ok,成功拿到詳情頁路徑,接下來根據上面的經驗來繼續擼程式碼

/**
 * 獲取圖書封面圖片
 * @param doc
 * @return
 */
public static String getBookCoverImg(Document doc){
    String bookCoverImg = "";
    try {
        Element element = doc.getElementById("mainpic");
        Element element1 = element.getElementsByTag("a").first();
        Element element2 = element1.getElementsByTag("img").first();
        return element2.attr("src");
    }catch (Exception e){
        e.printStackTrace();
    }
    return bookCoverImg;
}

/**
 * 獲取圖書作者
 * @param doc
 * @return
 */
public static String getBookAuhor(Document doc){
    String bookAuthor = "";
    try {
        Element element = doc.getElementById("info");
        Element element1 = element.getElementsByTag("a").first();
        //.text()為獲取dom中文字資訊
        return element1.text();
    }catch (Exception e){
        e.printStackTrace();
    }
    return bookAuthor;
}

/**
 * 獲取豆瓣評分
 * @param doc
 * @return
 */
public static String getDoubanScore(Document doc){
    String doubanScore = "";
    try {
        Element element = doc.getElementsByClass("rating_num").first();
        return element.text();
    }catch (Exception e){
        e.printStackTrace();
    }
    return doubanScore;
}

/**
 * 獲取書籍簡介
 * @param doc
 * @return
 */
public static String getBookIntroduction(Document doc){
    String articleIntroduction = "";
    try {
        Element element = doc.getElementsByClass("intro").first();
        return element.text();
    }catch (Exception e){
        e.printStackTrace();
    }
    return articleIntroduction;
}

public static String getBookDetailsUrl(String bookName){
    String url = getSearchUrl(bookName);
    Document doc = getDom(url);
    return getUrl(getBookItemUrl(doc,0));
}

public static void main(String[] args){
    String url = getBookDetailsUrl("明朝那些事");
    Document doc = getDom(url);
    System.out.println(getBookIntroduction(doc));
}複製程式碼

經過測試,均能獲取到對應的資訊。


結尾

祝大家新年快樂。感謝支援!


其他文章:

從零搭建自己的springboot後臺框架

碼雲地址: gitee.com/beany/mySpr…

GitHub地址: github.com/MyBeany/myS…


相關文章