1. 程式人生 > >Android 使用jsoup 進行資料抓取

Android 使用jsoup 進行資料抓取

一,身為安卓開發人員,在沒有介面的情況下是很操蛋的。索性就抓點資料測試用了。
準備工作:jsoup.jar
這裡 已經 是 已經實現好 邏輯的方法。


public class MianHuanJsoup {
    public static final String MH_URL_WWW="http://www.cncotton.com/";//中國棉花網,

    /**
     * 請求棉花最新 新聞列表
     * @param url
     */
    public static List<MianHuaNewsInfo> getMiaHuaListTitle
(String url){ List<MianHuaNewsInfo> mhList=new ArrayList<>(); try { //載入HTML Document document= Jsoup.connect(url).get(); //獲取指定 選擇器中的資料 Element div1 = document.getElementsByAttributeValue("class", "main4").first(); //這個網頁存在多個main4 所以 要先查到屬於誰下面的,再查。
Element div2 = div1.getElementsByAttributeValue("class", "main4_mm_t2").first(); Elements lis=div2.select("li");//2 Elements links = lis.select("a[href]"); MianHuaNewsInfo mh;//每個標題算一個物件。 for (int i = 0; i <links.size() ; i++) { mh=new
MianHuaNewsInfo(); mh.setTitle(links.get(i).text());//標題名字 mh.setUrl(url+links.get(i).attr("href"));//連線 // mh.setTimes(TimeUtils.getStr(links.get(i).attr("href")));//剪下時間。 mhList.add(mh); // getMianHuaContext(mhList.get(i).getUrl()); // System.out.println("時間 : " + mhList.get(i).getTimes()+mhList.get(i).getUrl());//標題名字 OkLogger.e("biaoti--- : " + links.get(i).text());//標題名字 OkLogger.e("111111111--- : " + mhList.get(i).getTitle());//標題名字 } // for (Element link : links) { // System.out.println("\nlink : "+url + link.attr("href")); // System.out.println("text : " + link.text());//標題名字 // // } } catch (IOException e) { e.printStackTrace(); } return mhList; } /** * 獲取每個標題下面的詳細資訊 * @param url */ public static List<MHNewsContextInfo> getMianHuaContext(String url){ List<MHNewsContextInfo> mhList = new ArrayList<>(); MHNewsContextInfo mh=new MHNewsContextInfo(); try { Document doc= Jsoup.connect(url).get(); //需要哪一塊的資料。只有圖片就用這個 Element div_all= doc.getElementsByAttributeValue("class", "TRS_Editor").first(); //如果 有段落就用這個。 Element div_p= div_all.getElementsByAttributeValue("class", "TRS_PreAppend").first(); //TODO: 由於資料結構的不一致性,此處判空 Elements p_null=doc.getElementsByTag("p"); Elements img_null=doc.getElementsByTag("img"); if (!img_null.isEmpty()){ //陣列 for (int i = 0; i <img_null.size() ; i++) { mh.setImgUrl(img_null.get(i).attr("src")); if (null!=mh) { mhList.add(mh); } } // for (Element img : div_imgs) { // System.out.print("---path:" +img.attr("src")); // } } if (!p_null.isEmpty()){ //段落的資料 Elements p = p_null.select("p");//段落 if (null!=p){ for (int i = 0; i <p.size() ; i++) { mh.setStrContext(p.get(i).select("p").text()); if (null!=mh) { mhList.add(mh); } } // for (Element ets:p) { // System.out.println("\n : "+ ets.select("p").text()); // } } } } catch (IOException e) { e.printStackTrace(); System.out.print("---棉花詳情抓取出錯:"); } return mhList; } }
這裡寫程式碼片

這是我的實體類

public class MianHuaNewsInfo {

    private String title;//文章標題
    private String url;//文章詳情連結。
    private String name="--";//釋出者
    private String times;//時間
    public boolean read=false;//是否已讀 true 讀 , 預設未讀
    /**
     * 放詳情內容。
     */

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTimes() {
        //時間就等於,詳情連結中的 時間,這裡擷取,
        times=TimeUtils.getStr(url);
        return times;
    }

    public void setTimes(String times) {

        this.times = times;
    }

}

這裡主要是測試類。建議從這裡看 思路會清晰些
這裡寫圖片描述

package ctp.pdz.cropstradingplatform;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;

import java.io.IOException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

import static ctp.pdz.cropstradingplatform.jsoup.MianHuanJsoup.getMiaHuaListTitle;
import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    private String url="http://www.cncotton.com/";//棉花
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
        getMiaHuaListTitle_test(url);

    }
    //抓取棉花網最新資訊標題及路徑

    public void getMiaHuaListTitle_test(String url){
        try {
            //載入HTML
            Document document= Jsoup.connect(url).get();
            //獲取指定 選擇器中的資料
            Element div1 = document.getElementsByAttributeValue("class", "main4").first();
            //這個網頁存在多個main4 所以 要先查到屬於誰下面的,再查。
            Element div2 = div1.getElementsByAttributeValue("class", "main4_mm_t2").first();
            Elements lis=div2.select("li");//2
            Elements links = lis.select("a[href]");
            for (Element link : links) {
                    System.out.println("\nlink : "+url + link.attr("href"));
                    System.out.println("text : " + link.text());
            }
            /// zmjgdatayep_13
            Element time=document.getElementById("zmjgdatayep_13");
            System.out.println("text : " + time);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //獲取標題下面的詳情
    public void getMianHuaContext_test(String url){
        try {
            Document doc= Jsoup.connect(url).get();
            //需要哪一塊的資料。只有圖片就用這個
            Element div_all= doc.getElementsByAttributeValue("class", "TRS_Editor").first();
            //如果 有段落就用這個。
            Element div_p= div_all.getElementsByAttributeValue("class", "TRS_PreAppend").first();
            //TODO: 由於資料結構的不一致性,此處判空
            Elements p_null=doc.getElementsByTag("p");
            Elements img_null=doc.getElementsByTag("img");
            if (!img_null.isEmpty()){
                //圖片的資料
                Elements div_imgs = div_all.getElementsByTag("img");//圖片。
                for (Element img : div_imgs) {
                    System.out.print("---path:" + img.attr("src"));
                }
            }
            if (!p_null.isEmpty()){
                //段落的資料
                Elements  p = div_p.select("p");//段落
                if (null!=p){
                    for (Element ets:p) {
                        System.out.println("\n : "+ ets.select("p").text());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.print("---棉花詳情抓取出錯:");
        }

    }


    //獲取價格表單
    public void getFrom(){
        /// 新疆 部分收購價格--http://dc.cncotton.com/dc/data/XJMData.action
        //籽棉價格  ---http://dc.cncotton.com/dc/data/ZMData.action


        }

    /**
     * 擷取  把20171121 ☞ 2017-11-21
     *
     * */
    public static void getStr(String url){
        String userNameUrl="./sy_59/gnmh_1388/rdxw/201711/t20171121_575890.html";
        int beginIndex = 0;
        int endIndex = 0;
        beginIndex = userNameUrl.indexOf("/t")+1;
        endIndex = userNameUrl.lastIndexOf("_");
        String t=userNameUrl.substring(beginIndex,endIndex);
        String a=t.substring(1,5);//0 開始,後面不擷取
        String b=t.substring(5,7);
        String c=t.substring(7);
        System.out.println("--a:"+a+"--b:"+b+"--c"+c);
    }


}

第一個 方法獲取標題,和路徑。這裡還抓不到內容。
執行 getMiaHuaListTitle_test();這個方法結果如下:
這裡寫圖片描述

再執行getMianHuaContext_test()方法,取得這條路徑下面的詳細內容。