Java網絡爬蟲實操(6)

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

你們好,前幾篇文章一直提到用xpath去解析html。因爲是演示代碼,因此看上去都簡潔明瞭的。其實在生產環境下,咱們須要獲取的數據每每不是一點點,如何讓獲取數據的代碼寫的更加清晰、優雅呢?java

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

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) 總結

總之,一個好的框架的目標是但願能用的前提下,用的更好、更爽。好像汽車品牌同樣,雖然都是四個輪子的,幾萬的也有,幾十萬的也不少。github

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

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

相關文章
相關標籤/搜索