用Java寫K站爬蟲

背景

近些日子對java爬蟲有興趣,所以又做了一個K站的爬蟲,只實現基礎功能對請求頭沒有什麼封裝(初衷是爬些圖片做壁紙),因爲以前又做過D站的爬蟲,所以這次就一起總結一下吧。

不放源碼,想要的同學在git上找:https://github.com/Yan1less/MySpriders

梳理關係

寫爬蟲主要是邏輯梳理清楚,總站->輸入檢索標籤->每個匹配的圖片連接入隊->挨個進入連接->獲得圖片src->下載。

邏輯是這麼個邏輯,具體實現時有一些容易忘記的點,這裏點名提一下吧

具體操作

    1.需要先通過HttpURLConnection類來獲取到頁面的代碼(這個工具類網上到處都是)

    2.然後就是標準的素質三連(要硬說是幹嘛的我覺得應該視爲了符合Jsoup的篩選格式吧。。。?)

        String code = GetCode.GetPageCodeByUrl(url);
        Document document = Jsoup.parse(code);
        Elements select = document.select(".inner a");//裏面內容的書寫方法看下文
3.這是後我們拿到了關鍵的Elements對象,其通過get(int index).toString()方法來獲得某一行的數據,並把它變成String(不然是Element對象)

  4.這個時候我們一般拿到的是整個標籤,而我想要標籤裏面的一些連接,這時候就要用正則了

  5.一個十分好用的正則(想要href就把src換成href,不行在改變括號外面的東西,這一步完了之後就可以拿到一個能用的連接了)

    public static String getImgSrc(String img){
        String src = "";
        Pattern p = Pattern.compile("[\\s|\\S]* src=\"([^<]*)\" [\\s|\\S]*");
        Matcher m =p.matcher(img);
        if(m.matches()){
            src= m.group(1);
        }
        return src;
    }

 6.拿到連接就下載到本地,工具類也到處都是

關於Jsoup的選擇器

    https://jsoup.org/apidocs/org/jsoup/select/Selector.html

  這個頁面十分好用,不過這裏也放一些常用的吧

圖案 火柴
* 任何元素 *
tag 具有給定標記名稱的元素 div
*|E 任何名稱空間ns中的 E類型元素 *|name找到<fb:name>元素
ns|E 名稱空間ns中的 E類型的元素 fb|name找到<fb:name>元素
#id 屬性ID爲“id”的元素 div#wrap, #logo
.class 類名爲“class”的元素 div.left, .result
[attr] 具有名爲“attr”的屬性的元素(具有任何值) a[href], [title]
[^attrPrefix] 屬性名稱以“attrPrefix”開頭的元素。用於查找包含HTML5數據集的元素 [^data-], div[^data-]
[attr=val] 具有名爲“attr”的屬性的元素,以及等於“val”的值 img[width=500], a[rel=nofollow]
[attr="val"] 具有名爲“attr”的屬性的元素,以及等於“val”的值 span[hello="Cleveland"][goodbye="Columbus"], a[rel="nofollow"]
[attr^=valPrefix] 具有名爲“attr”的屬性的元素,以及以“valPrefix”開頭的值 a[href^=http:]
[attr$=valSuffix] 具有名爲“attr”的屬性的元素,以及以“valSuffix”結尾的值 img[src$=.png]
[attr*=valContaining] 具有名爲“attr”的屬性的元素,以及包含“valContaining”的值 a[href*=/search/]
[attr~=regex] 具有名爲“attr”的屬性的元素,以及與正則表達式匹配的值 img[src~=(?i)\\.(png|jpe?g)]
  以上可以以任何順序組合 div.header[title]

  


組合子

E F 來自E元素的F元素 div a, .logo h1
E > F E的直接孩子 ol > li
E + F 緊接着兄弟姐妹E的F元素 li + li, div.head + div
E ~ F 一個F元素,前面是兄弟E h1 ~ p
E, F, G 所有匹配元素E,F或G. a[href], div, h3

 

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