1. 程式人生 > >使用java開源工具httpClient及jsoup抓取解析網頁資料

使用java開源工具httpClient及jsoup抓取解析網頁資料

  今天做專案的時候遇到這樣一個需求,需要在網頁上展示今日黃曆資訊,資料格式如下

  •   公曆時間:2016年04月11日 星期一
  •   農曆時間:猴年三月初五
  •   天干地支:丙申年 壬辰月 癸亥日
  •   宜:求子 祈福 開光 祭祀 安床
  •   忌:玉堂(黃道)危日,忌出行

  主要包括公曆/農曆日期,以及忌宜資訊的等。但是手裡並沒有現成的資料可供使用,怎麼辦呢?

革命前輩曾經說過,沒有槍,沒有炮,敵(wang)人(luo)給我們造!網路上有很多現成的線上

萬年曆應用可供使用,雖然沒有現成介面,但是我們可以伸出手來,自己去拿。也就是所謂的資料

抓取。

  這裡介紹兩個使用的工具,httpClient以及jsoup,簡介如下:

  HttpClient是Apache Jakarta Common下的子專案,用來提供高效的、最新的、功能豐富的支援HTTP協議的客戶端程式設計工具包,並且它支援HTTP協議最新的版本和建議。HttpClient已經應用在很多的專案中,比如Apache Jakarta上很著名的另外兩個開源專案Cactus和HTMLUnit都使用了HttpClient。

  httpClient使用方法如下:

  1. 建立HttpClient物件。

  2. 建立請求方法的例項,並指定請求URL。

  3. 呼叫HttpClient物件的execute(HttpUriRequest request)傳送請求,該方法返回一個HttpResponse。

  4. 呼叫HttpResponse相關方法獲取相應內容。

  5. 釋放連線。

  jsoup 是一款 Java 的 HTML 解析器,可直接解析某個 URL 地址、HTML 文字內容。它提供了一套非常省力的 API,可通過 DOM,CSS 以及類似於 jQuery 的操作方法來取出和操作資料。

  需要更多資訊可以參見官網

  首先我們定義一個實體類Almanac來儲存黃曆資料

  Almanac.java

複製程式碼
 1 package com.likx.picker.util.bean;
 2 
 3 /**
 4  * 萬年曆工具實體類
 5  * 
 6  * @author
溯源blog 7 * 2016年4月11日 8 */ 9 public class Almanac { 10 private String solar; /* 陽曆 e.g.2016年 4月11日 星期一 */ 11 private String lunar; /* 陰曆 e.g. 猴年 三月初五*/ 12 private String chineseAra; /* 天干地支紀年法 e.g.丙申年 壬辰月 癸亥日*/ 13 private String should; /* 宜e.g. 求子 祈福 開光 祭祀 安床*/ 14 private String avoid; /* 忌 e.g. 玉堂(黃道)危日,忌出行*/ 15 16 public String getSolar() { 17 return solar; 18 } 19 20 public void setSolar(String date) { 21 this.solar = date; 22 } 23 24 public String getLunar() { 25 return lunar; 26 } 27 28 public void setLunar(String lunar) { 29 this.lunar = lunar; 30 } 31 32 public String getChineseAra() { 33 return chineseAra; 34 } 35 36 public void setChineseAra(String chineseAra) { 37 this.chineseAra = chineseAra; 38 } 39 40 public String getAvoid() { 41 return avoid; 42 } 43 44 public void setAvoid(String avoid) { 45 this.avoid = avoid; 46 } 47 48 public String getShould() { 49 return should; 50 } 51 52 public void setShould(String should) { 53 this.should = should; 54 } 55 56 public Almanac(String solar, String lunar, String chineseAra, String should, 57 String avoid) { 58 this.solar = solar; 59 this.lunar = lunar; 60 this.chineseAra = chineseAra; 61 this.should = should; 62 this.avoid = avoid; 63 } 64 }
複製程式碼

  然後是抓取解析的主程式,寫程式之前需要在官網下載需要的jar包

  AlmanacUtil.java

複製程式碼
package com.likx.picker.util;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
 *<STRONG>類描述</STRONG> :  2345萬年曆資訊爬取工具<p>
 *   
 * @version 1.0 <p>
 * @author 溯源blog
 * 
 * <STRONG>建立時間</STRONG> : 2016年4月11日 下午14:15:44<p>
 * <STRONG>修改歷史</STRONG> :<p>
 *<pre>
 * 修改人                   修改時間                     修改內容
 * ---------------         -------------------         -----------------------------------
 *</pre>
 */
public class AlmanacUtil {
    
    /**
     * 單例工具類
     */
    private AlmanacUtil() {
    }
    /**
     * 獲取萬年曆資訊
     * @return
     */
    public static Almanac getAlmanac(){
        String url="http://tools.2345.com/rili.htm";
        String html=pickData(url);
        Almanac almanac=analyzeHTMLByString(html);
        return almanac;
    }
    
    /*
     * 爬取網頁資訊
     */
    private static String pickData(String url) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            HttpGet httpget = new HttpGet(url);
            CloseableHttpResponse response = httpclient.execute(httpget);
            try {
                // 獲取響應實體
                HttpEntity entity = response.getEntity();
                // 列印響應狀態
                if (entity != null) {
                    return EntityUtils.toString(entity);
                }
            } finally {
                response.close();
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 關閉連線,釋放資源
            try {
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    
    /*
     * 使用jsoup解析網頁資訊
     */
    private static Almanac analyzeHTMLByString(String html){
        String solarDate,lunarDate,chineseAra,should,avoid=" ";
        Document document = Jsoup.parse(html);
        //公曆時間
        solarDate=getSolarDate();
        //農曆時間
        Element eLunarDate=document.getElementById("info_nong");
        lunarDate=eLunarDate.child(0).html().substring(1,3)+eLunarDate.html().substring(11);
        //天干地支紀年法
        Element eChineseAra=document.getElementById("info_chang");
        chineseAra=eChineseAra.text().toString();    
        //
        should=getSuggestion(document,"yi");
        //
        avoid=getSuggestion(document,"ji");
        Almanac almanac=new Almanac(solarDate,lunarDate,chineseAra,should,avoid);
        return almanac;
    }
    /*
     * 獲取忌/宜
     */
    private static String getSuggestion(Document doc,String id){
        Element element=doc.getElementById(id);
        Elements elements=element.getElementsByTag("a");
        StringBuffer sb=new StringBuffer();
        for (Element e : elements) {
            sb.append(e.text()+" ");
        }
        return sb.toString();
    }

    /*
     * 獲取公曆時間,用yyyy年MM月dd日 EEEE格式表示。
     * @return yyyy年MM月dd日 EEEE
     */
    private static String getSolarDate() {
        Calendar calendar = Calendar.getInstance();
        Date solarDate = calendar.getTime();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 EEEE");
        return formatter.format(solarDate);
    }

}
複製程式碼

  為了簡單明瞭我把抓取解析抽象成了幾個獨立的方法,

  其中pickData()方法使用httpClient來抓取資料到一個字串中(就是在網頁上點選檢視原始碼看到的HTML原始碼),

analyzeHTMLByString()方法來解析抓取到的字串,getSuggestion方法把抓取方法類似的宜忌資料抽象到了

一起,另外因為公曆時間可以很容易的自己生成就沒有在網頁上爬取。

  然後下面是一個測試類簡單測試下效果:

 AlmanacUtilTest.java

複製程式碼
package com.likx.picker.util.test;

public class AlmanacUtilTest {
    
    public static void main(String args[]){
        Almanac almanac=AlmanacUtil.getAlmanac();
        System.out.println("公曆時間:"+almanac.getSolar());
        System.out.println("農曆時間:"+almanac.getLunar());
        System.out.println("天干地支:"+almanac.getChineseAra());
        System.out.println("宜:"+almanac.getShould());
        System.out.println("忌:"+almanac.getAvoid());
    }
}
複製程式碼

  執行結果如下:

  整合到實際專案中效果是這樣的:

  

  另外最近部落格一直沒怎麼更新,因為最近考慮到技術氛圍的原因,離開了對日外包行業,前往

一家網際網路公司就職。說一下最近的感受,那就是一個程式設計師最核心的競爭力不是學會了多少框架,

掌握多少種工具(當然這些對於程式設計師也不可或缺),而是紮實的基礎以及快速學習的能力,比如今天

這個專案,從對httpClient,jsoup工具一無所知到編寫出Demo程式碼總計大概1個多小時,在之前對於

我來說是不可想象的,在技術氛圍濃厚的地方快速get技能的感覺,非常好。

  當然本例只是一個非常淺顯的小例子,網頁上內容也很容易抓取,httpClient及jsoup工具更多強大

的地方沒有體現到,比如httpClient不僅可以傳送get請求,而且可以傳送post請求,提交表單,傳送

檔案,還比如jsoup最強大的地方在於它支援仿jquery的選擇器。本例僅僅使用了最簡單的document.getElementById()

匹配元素,實際上jsoup的選擇器異常強大,可以說它就是java版的jquery,比如這樣:

複製程式碼
Elements links = doc.select("a[href]"); // a with href
Elements pngs = doc.select("img[src$=.png]");
  // img with src ending .png
Element masthead = doc.select("div.masthead").first();
  // div with class=masthead
Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
複製程式碼

  另外還有很多強大的功能水平有限就不一一列舉了,感興趣的可以參照官網文件,也歡迎交流指正。新技能get起來!

本文版權歸作者及部落格園所有,轉載請註明作者及原文出處

溯源blog http://www.cnblogs.com/lkxsnow/

相關推薦

使用java開源工具httpClientjsoup解析網頁資料

  今天做專案的時候遇到這樣一個需求,需要在網頁上展示今日黃曆資訊,資料格式如下   公曆時間:2016年04月11日 星期一  農曆時間:猴年三月初五  天干地支:丙申年 壬辰月 癸亥日  宜:求子 祈福 開光 祭祀 安床  忌:玉堂(黃道)危日,忌出行  主要包括公曆/農曆日期,以及忌宜資訊的等。但是手

Java爬蟲--利用HttpClientJsoup部落格資料並存入資料庫

  由於今日頭條等頭條類產品的出現,以今日頭條為代表所使用的爬蟲技術正在逐漸火熱,在爬蟲領域具有良好效能和較好效果的Python在最近一年的時間裡逐漸火熱起來,同時因為Python良好的資料分析和機器學習的能力,Python的應用越來越廣泛。不過,今天我們要提到

Python3.7 爬蟲(二)使用 Urllib2 與 BeautifulSoup4 解析網頁

開篇 上一篇中我們通過原生的 re 模組已經完成了網頁的解析,對於熟悉正則表示式的童鞋來說很好上手,但是對於萌新來說,還是有一定難度以及複雜度的,那麼這裡我們就來使用第三方解析包來解析獲取到的網頁吧。 BeautifulSoup 官方的 Beaut

Python中使用PhantomJSJavascript網頁資料

有些網頁不是靜態載入的,而是通過javascirpt函式動態載入網頁,比如下面這個網頁,表格中的看漲合約和看跌合約的資料都是通過javascirpt函式從後臺載入。僅僅使用beautifulsoup並不能抓到這個表格中的資料。 查詢資料,發現可以使用P

Java資料採集--2.使用Jsoup開源中國

本節使用Jsoup獲取網頁原始碼,並且解析資料。 使用JSoup 解析網頁,語法使用 JS,css,Jquery 選擇器語法,方便易懂 抓取網站:http://www.oschina.net/news/list 開源中國-新聞資訊模組 基本工作: 1.建

java使用jsoup中國知網資料思路與測試記錄

前段時間測試抓取知網資料,弄了很久都失敗了,然後就不想弄了.... 今天重新整理,記錄下來,成功與否都能做個參考. 測試 cookies 第一次訪問網站的時候返回的一個cookies,裡面有4

使用Javajsoup鏈家北京二手房房價資料

由於是初次使用Java寫爬蟲,所以程式碼有些繁瑣,請大家見諒,並能給與指正首先分析鏈家北京二手房頁面,使用360瀏覽器的審查元素功能,檢視原始碼,獲取查詢標籤如圖一級查詢所示,此圖標籤所獲取的是鏈家北京二手房頁面下的一級地區地址由於具體獲取有些複雜,故列大致步驟如下主頁——》

java爬蟲問題二: 使用jsoup數據class選擇器中空格多選擇怎麽解決

凱哥Java問題描述: 在使用jsoup爬取其他網站數據的時候,發現class是帶空格的多選擇,如果直接使用doc.getElementsByClass(“class的值”),這種方法獲取不到想要的數據。 爬取網站頁面結構如下: 其中文章列表的div為:<div class="am-cf in

java webmagic 靜態網頁資源,動態網頁資源

webmagicJava爬蟲框架 fastjson 阿里巴巴提供的 json 轉為物件的快捷包,裡面有下載jar包的地址 抓取靜態網頁資源 。例項:抓取李開復部落格:標題,內容,釋出日期。 public class LiKaiFuBlogReading implements Pag

Hibernate檢索策略批量

檢索策略的概念   1 hibernate檢索策略分為兩類:   (1)立即查詢:根據id查詢,呼叫get方法,一呼叫get方法馬上傳送語句查詢資料庫 //根據cid=1客戶 //執行get方法之後,是否傳送sql語句 //呼

Jsoup圖片

楔子 jsoup抓取圖片,其實就是分析頁面圖片地址,然後下載圖片 demo import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import

JAVA開源爬蟲列表簡介

轉自:http://datahref.com/archives/116 本文列舉了一些較為常用的JAVA開源爬蟲框架: 1.Apache Nutch 是否支援分散式:是 可擴充套件性:中。Apache Nutch並不是一個可擴充套件性很強的爬蟲,它是一個專門為搜尋

使用Jsoup車標網各種型別相應車的資訊

【谷歌翻譯,參考可以看官方原文】  jsoup:Java的HTML解析器    jsoup是與現實世界的HTML工作的Java庫。它提供了用於提取和操作資料,使用最好的DOM,  CSS和jquery的方法很像,而且的API很方便。     jsoup實現了WHATWG的HTML5規範,並解析HTML到同

網路封包分析工具Charles(介面

目錄 本文的內容主要包括: Charles 的簡介如何安裝 Charles將 Charles 設定成系統代理Charles 主介面介紹過濾網路請求擷取 iPhone 上的網路封包擷取 Https 通訊資訊模擬慢速網路修改網路請求內容給伺服器做壓力測試修改伺服器返回內容總結簡

使用Java解析汽車之家車型配置資料

因為公司業務需求,需要獲取汽車之家的車型配置資料如下圖:        由於汽車之家沒做防爬策略,只是資料給混淆了,這裡主要說解析資料。        通過儲存頁面,配置項的資料是通過JS動態生成的。在頁面的第572行左右,有配置項的json格式資料        主要的配置

jsoupjs(script)中的變數值

package com.hxqc.pricemonitor.trans; import java.util.HashMap; import java.util.Map; import org.jsoup.Jsoup; import org.jsoup.nodes.Docume

Jsoup到頁面A標籤中的href路徑

  直接上程式碼,註釋很全乎 public static void main(String[] args)throws Exception{ //抓取的網址 String url = "http://www.stats.gov.cn/tjsj

java之 25天 網路爬蟲圖片(二)

[size=medium][b]正則表示式練習[/b][/size]import java.util.Arrays;import java.util.Collections;import java.util.List;import java.util.TreeSet;publ

一個簡單的Jsoup頁面資訊的例子

簡介: jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文字內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作資料。在本文,本人將教大家如何使用jsoup抓取一些簡單的頁面資訊準備:

HtmlUnit、httpclientjsoup網頁資訊並解析

1.爬取頁面效果圖 點選"百度一下"按鈕前頁面 點選"百度一下"按鈕後頁面 天涯社群登入頁面 登入進去之後個人主頁 二、具體實現程式碼 HtmlUnit(底層也