java爬蟲jsoup,實現通過csdn專欄地址爬取csdn專欄每篇文章的標題和地址

程序猿學社的GitHub,歡迎Star
github技術專題
本文已記錄到github

前言

從19年開始,社長,就在寫系列文章,整個系列寫完後,就需要寫一篇總結的文章,需要把所有的文章歸納進去。相信不少童鞋都會有這種困惑。

需求

通過csdn系列文章的網站,採用jsoup,輸出該系列文章的所有標題和url地址。使用MD方式網址輸出

要求

  • 需要有一定的css、html、js前端基礎
  • 有一定的java基礎

api接口文檔

查找元素

方法 描述
getElementById(String id) 根據id選擇器獲取Element
getElementsByTag(String tagName) 通過標籤過濾獲取Element
getElementsByClass(String className) 通過類樣式選擇器獲取Element
getElementsByAttribute(String key) 通過屬性名獲取Element

獲取元素的值

方法 描述
attr(String attributeKey) 獲取屬性的值
attr(String attributeKey, String attributeValue) 給屬性賦值
text() 獲取對應的值,只是單純的值
html() 獲取對應的html值,包含標籤

實戰

pom.xml

  <!--爬取數據關鍵jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.3</version>
        </dependency>
  • 導入jsoup依賴

代碼

package com.cxyxs.jsoup.util;

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

import java.io.File;
import java.net.URL;

/**
 * Description:測試
 * Author: 程序猿學社
 * Date:  2020/5/10 18:07
 * Modified By:
 */
public class JsoupUtils {
    public static void main(String[] args) throws  Exception {
        getList("https://blog.csdn.net/qq_16855077/category_9722768.html");
    }

    /**
     * 通過csdn的系列文章網址輸出對應的內容
     * @param url
     * @throws Exception
     */
    public static void getList(String url)throws  Exception{
        //網址
        Document document = Jsoup.connect(url).get();

        // 獲取標題
        //String title = document.title();
        //獲取頭部信息
        //Element head = document.head();
        //取到菜單列表ul
        Elements elements = document.getElementsByClass("column_article_list");
        //取出每個li
        Elements elementsByTag = elements.get(0).getElementsByTag("li");
        for (Element el : elementsByTag) {
            //取出每個li元素的href
            String href = el.getElementsByTag("a").attr("href");
            //先取出h2標籤
            String titleDiv = el.getElementsByTag("h2").text();
            String[] titles = titleDiv.split(" ");
            System.out.println("!["+titles[1]+"]("+href+")");
        }
    }
}


到這裏,我們就實現了通過csdn列表的網址,輸出markdown的列表的內容格式。是不是感覺很so easy哦?

  • 也有不少人通過httpclient方法實現,當然,通過這種方法也可以實現。說說實現的大致思路。首先通過網址獲取整個html,而且通過自己各種寫判斷處理,因太麻煩,不建議採用這種方式

看到這裏是不是一臉懵逼?別急,我們一步一步的分析一下社長的代碼,爲什麼要這樣編寫

分析

第一步

Document document = Jsoup.connect(url).get();
  • 這裏的document,我們通過syso輸出,可以知道實際上,就是把url對應網址輸出。等同於,我們在網頁輸入F12,進入開發者調試模式
  • 輸出的內容就是整個html頁面,也就是紅色區域的內容。
  • 到這一步,我們已經實現,取到整個html頁面。

第二步 獲取文章列表的ul

  • 點擊紅色區域的圖標,把他移動到,我們我們需要選擇的標題這一行上面。
  • 分析csdn前端開發是如何顯示文章列表的
  • 通過分析,可以看出,最外層是ul,裏面的每一篇文章的顯示都是一個li。例如10篇文章,就有10個li。
//取到菜單列表ul
Elements elements = document.getElementsByClass("column_article_list");

這裏爲什麼要調用getElementsByClass方法?

  • ul標籤上是class屬性,值爲column_article_list,通過社長之前的api接口文檔,可知,class選擇器需要調用getElementsByClass。
  • 到這裏,我們已經實現從整個html變爲只獲取ul的內容。萬里長征又進了一步。

第三步 獲取文章的每個li

  //取出每個li
        Elements elementsByTag = elements.select("li");
        for (Element el : elementsByTag) {
            //取出每個li元素的href
            String href = el.getElementsByTag("a").attr("href");
            //先取出h2標籤
            String titleDiv = el.getElementsByTag("h2").text();
            String[] titles = titleDiv.split(" ");
            //![描述](網址)
            System.out.println("!["+titles[1]+"]("+href+")");
        }
  • elements.select(“li”) 獲取所有li標籤的html元素
    一步一步再來剖析
Elements elementsByTag = elements.select("li");
  • 在ul中,獲取li,實際上返回如下

    分析單個的li,發現只需要取到href對應的屬性值,h2標籤就可以實現我們的功能。

    獲取href的值
 String href = el.getElementsByTag("a").attr("href");
  • getElementsByTag獲取a標籤這個dom元素
  • attr(“href”)爲獲取當前dom元素屬性爲href的值

獲取標題的值

 //先取出h2標籤
String titleDiv = el.getElementsByTag("h2").text();
String[] titles = titleDiv.split(" ");

  • titles[1] 爲文章標題的值
    獲取標題的值,爲什麼要這些寫?
    通過查看html代碼,發現h2裏面有一個span標籤,裏面的值爲文章類型(原創、轉載),緊接着就是文字標題。
  • 沒有辦法,通過標籤選擇器篩選到標題的值,社長想到的方法,獲取h2的text的值,這樣我們去到的內容爲"原創 [多線程XXX] 十四面試官說:說說java中XXXX"
  • 把這個字符串按空格切割,取索引爲1的值,就是我們的標題

結論

本文最好有一定的前端基礎,不然,看着,會有點懵逼。如果你懂js、css、html,你再去看jsoup提供的api接口,會發現,幾乎完全類似。


本文僅供學習,本文只是讀取個人博客專欄的一個地址,獲取每個文章的標題和網址,方便專欄文章彙總。如有問題,請聯繫我刪除

學習源碼

作者:程序猿學社
原創公衆號:『程序猿學社』,專注於java技術棧,分享java各個技術系列專題,以及各個技術點的面試題。
原創不易,轉載請註明來源(註明:來源於公衆號:程序猿學社, 作者:程序猿學社)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章