首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

HttpClient + Jsoup 實戰:抓取解析 2345 萬年歷數據並集成到項目中

     編輯:Java 綜合教學

HttpClient + Jsoup 實戰:抓取解析 2345 萬年歷數據並集成到項目中

項目需展示每日黃歷(公歷/農歷/干支/宜/忌),無現成接口,採用 HttpClient 抓取網頁 HTML,Jsoup 解析提取,封裝為工具類集成。

工具選型

  • HttpClient:Apache HttpComponents,發送 GET/POST、處理重定向、連接池管理。
  • Jsoup:Java HTML 解析器,支持 DOM/CSS/jQuery 風格選擇器,API 極簡。

實體類

public class Almanac {
    private String solar;      // 2016年04月11日 星期一
    private String lunar;      // 猴年三月初五
    private String chineseAra; // 丙申年 壬辰月 癸亥日
    private String should;     // 宜:求子 祈福...
    private String avoid;      // 忌:玉堂(黃道)危日,忌出行
    // getter/setter/構造器省略
}

核心工具類 AlmanacUtil

public class AlmanacUtil {
    private static final String URL = "https://tools.2345.com/rili.htm";

    public static Almanac getAlmanac() {
        String html = pickData(URL);
        return analyzeHTML(html);
    }

    // HttpClient 抓取
    private static String pickData(String url) {
        try (CloseableHttpClient client = HttpClients.createDefault()) {
            HttpGet get = new HttpGet(url);
            try (CloseableHttpResponse resp = client.execute(get)) {
                HttpEntity entity = resp.getEntity();
                return entity != null ? EntityUtils.toString(entity) : null;
            }
        } catch (IOException e) { e.printStackTrace(); return null; }
    }

    // Jsoup 解析
    private static Almanac analyzeHTML(String html) {
        Document doc = Jsoup.parse(html);
        String solar = new SimpleDateFormat("yyyy年MM月dd日 EEEE").format(new Date());
        String lunar = doc.getElementById("info_nong").child(0).html().substring(1,3) + doc.getElementById("info_nong").html().substring(11);
        String ganzhi = doc.getElementById("info_chang").text();
        String yi = getSuggestion(doc, "yi");
        String ji = getSuggestion(doc, "ji");
        return new Almanac(solar, lunar, ganzhi, yi, ji);
    }

    private static String getSuggestion(Document doc, String id) {
        Element el = doc.getElementById(id);
        return el.getElementsByTag("a").stream().map(Element::text).collect(Collectors.joining(" "));
    }
}

測試與項目集成效果

public class Test {
    public static void main(String[] args) {
        Almanac a = AlmanacUtil.getAlmanac();
        System.out.println("公歷:" + a.getSolar());
        System.out.println("農歷:" + a.getLunar());
        System.out.println("干支:" + a.getChineseAra());
        System.out.println("宜:" + a.getShould());
        System.out.println("忌:" + a.getAvoid());
    }
}

控制台輸出

項目集成頁面

Jsoup 選擇器進階示例

Elements links = doc.select("a[href]");           // 所有帶 href 的 a
Elements pngs = doc.select("img[src$=.png]");      // src 以 .png 結尾的 img
Element head = doc.select("div.masthead").first(); // class=masthead 的 div
Elements results = doc.select("h3.r > a");         // h3.r 直接子元素 a
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved