Java網路爬蟲實操(6)

sinkinka發表於2018-02-28

上一篇:Java網路爬蟲實操(5)

大家好,前幾篇文章一直提到用xpath去解析html。由於是演示程式碼,所以看上去都簡潔明瞭的。其實在生產環境下,我們需要獲取的資料往往不是一點點,如何讓獲取資料的程式碼寫的更加清晰、優雅呢?

本篇文章嘗試用註解的方式實現一下,大家看看是否好一點。

1) 目標

  • 隨便找一個網站,獲取上面列表類的資料
    目標資料的介面

2) 之前的解析類

  • 在process方法中圍繞我們想要的資料,努力去定位、查詢
package com.cv4j.netdiscovery.example;

import com.cv4j.netdiscovery.core.domain.Page;
import com.cv4j.netdiscovery.core.parser.Parser;
import java.util.List;

public class TestParser implements Parser {
    @Override
    public void process(Page page) {
        //最新網申
        List<String> newApplyList = page.getHtml().xpath("//dl[@id='dlFull']/dd/div/div/p[@title]/a/text()").all();
        page.getResultItems().put("newApplyList", newApplyList);
        //最新實習
        List<String> newWorkList = page.getHtml().xpath("//dl[@id='dlPart']/dd/div/div/p[@title]/a/text()").all();
        page.getResultItems().put("newWorkList", newWorkList);
    }
}
複製程式碼

3) 使用註解之後的解析類

  • 只要繼承類AnnotationParser,不要實現介面Parser
  • 別忘記新增 super.process(page)
  • 在pipeline類中,用變數名稱作為key從map中獲取對應的值
  • 可以用框架自帶的ConsolePipeline類做測試
package com.cv4j.netdiscovery.example;

import com.cv4j.netdiscovery.core.domain.Page;
import com.cv4j.netdiscovery.core.parser.AnnotationParser;
import com.cv4j.netdiscovery.core.parser.annotation.ExtractBy;

import java.util.List;

public class TestParser extends AnnotationParser {
    //最新網申
    @ExtractBy.XPath("//dl[@id='dlFull']/dd/div/div/p[@title]/a/text()")
    private List<String> newApplyList;

    //最新實習
    @ExtractBy.XPath("//dl[@id='dlPart']/dd/div/div/p[@title]/a/text()")
    private List<String> newWorkList;

    @Override
    public void process(Page page) {
        super.process(page);  //這行程式碼不能缺

        //process裡一行程式碼也不用寫,在上面通過註解就可以獲取我們要的資料了
    }
}
複製程式碼

4) 執行結果

  • 首頁上最新網申和最新實習的標題資料如下:
    結果

5) 總結

總之,一個好的框架的目標是希望能用的前提下,用的更好、更爽。好像汽車品牌一樣,雖然都是四個輪子的,幾萬的也有,幾十萬的也很多。

有興趣的小夥伴可以關注這個爬蟲框架NetDiscovery,基本上每週都有更新的。

下一篇:Java網路爬蟲實操(7)

相關文章