Android 使用jsoup 进行数据抓取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26841579/article/details/79095882

一,身为安卓开发人员,在没有接口的情况下是很操蛋的。索性就抓点数据测试用了。
准备工作: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()方法,取得这条路径下面的详细内容。

猜你喜欢

转载自blog.csdn.net/qq_26841579/article/details/79095882