Android将网页做成app-- Jsoup网络解析框架

来源:互联网 发布:风暴英雄数据查询 编辑:程序博客网 时间:2024/06/06 20:42

Android将网页做成app– Jsoup网络解析框架
Jsoup能够获得网页数据,而我们在制作app的数据来源为一些公开网站,比如;干活集中营,豆瓣,知乎之类的。不过目前主流框架模式是Retrofit&RxJava。然而这种方法局限性很大,主要获取的数据都是很规范的,不能随意获得对应网页任意的数据。

我们使用Jsoup做app时,需要对照网站源码来做,这样能够让我们快速获得自己想要的数据。

首先做一下准备工作,打开网页https://xjh.haitou.cc/wh/uni-1/after/hold/page-1,我们使用浏览器的开发者模式
这里写图片描述
我们可以看到一行代码对应网页中的位置,这样方便我们写程序。

我首先放出完整代码,然后再一步一步的讲解
添加依赖

compile 'org.jsoup:jsoup:1.9.2'

代码

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView tv = (TextView)findViewById(R.id.tv);        tv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                new Thread(new Task()).start();            }        });    }    class Task implements Runnable {        @Override        public void run() {            Log.v("test","start");            String url = "http://xjh.haitou.cc/wh/uni-1/after/hold/page-1/";            Connection conn = Jsoup.connect(url);            // 修改http包中的header,伪装成浏览器进行抓取            conn.header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:32.0) Gecko/    20100101 Firefox/32.0");            Document doc = null;            try {                doc = conn.get();            } catch (IOException e) {                e.printStackTrace();            }            // 获取tbody元素下的所有tr元素            Elements elements = doc.select("tbody tr");            for(Element element : elements) {                String companyName = element.select("div.company").first().text();                //String companyName = element.select("td.cxxt-title").first().text();                String time = element.select("td.text-left").first().text();                String address = element.select("td.text-ellipsis").first().text();                Log.v("test","---------------------------------");                Log.v("test","公司:"+companyName);                Log.v("test","宣讲时间:"+time);                Log.v("test","具体地点:"+address);                Log.v("test","---------------------------------");            }            Log.v("test","end");        }    }}

首先从网页获取数据,是属于网络操作必须另起一个线程运行代码,

conn.header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:32.0) Gecko/    20100101 Firefox/32.0");Document doc = null;

然后这个伪装成浏览器这步,基本成惯例,代码看起来是伪装成火狐浏览器。

            try {                doc = conn.get();            } catch (IOException e) {                e.printStackTrace();            }            // 获取tbody元素下的所有tr元素            Elements elements = doc.select("tbody tr");

这个获得Elements元素,这个在网页开发者模式里可以看到tr这个标签代表着一条宣传会信息,其中有公司名,举办地点,举办时间等等。这个tbody是它自定义的标签,所以很好找,这个tbody在网站源代码就一个,所以能够确定唯一性。对于select函数唯一性很重要,然后它空了一行加tr,这说明是在找tbody标签的所有的tr标签。

for(Element element : elements) {    String companyName = element.select("div.company").first().text();    //String companyName = element.select("td.cxxt-title").first().text();    String time = element.select("td.text-left").first().text();    String address = element.select("td.text-ellipsis").first().text();    Log.v("test","---------------------------------");    Log.v("test","公司:"+companyName);    Log.v("test","宣讲时间:"+time);    Log.v("test","具体地点:"+address);    Log.v("test","---------------------------------");}

这就是一个tr一个tr的解析获得数据。这里可以看到select函数的另一个用法,通过 标签名+.+类名 来获得一个元素,这个很重要,后来获得最终的数据都是使用这个函数。

获得数据如下
09-28 13:16:20.736 22136-22310/zzw.myapplication V/test: start
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: ———————————
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: 公司:深圳市星河互动科技有限公司
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: 宣讲时间:2017-09-28 14:00 (今天)
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: 具体地点:华科1号楼2楼报告厅
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: ———————————
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: 公司:深圳中兴飞贷金融科技有限公司

还有很多就不贴出来了

想要掌握Jsoup其实很简单,毕竟使用的函数很少,过程都是固定的。

目前到此结束了,其实这距离做成app,还需要形成实体类,然后填充数据,界面完成。不过我不搞了,接下来大家自由发挥,换一个自己想做的网站,比如:B站
下期再见。

原创粉丝点击