上一篇: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)